Obecnie próbuję uzyskać adres IP żądanego użytkownika. Problem polega na tym, że adres IP wraca ::ffff:127.0.0.1
zamiast 127.0.0.1
. Próbowałem użyć trusted proxy
opcji (ale nie używam proxy) i req.ips
jest puste. Korzystanie z 4.x Express.js.
router.get('/', function(req, res, next) {
console.log('ip', req.ip)
res.send({})
});
req.ip
lubreq.ips
?req.ip
, po prostu próbowałemreq.ips
jako test. Po prostu nie jestem pewien, co powoduje prefiks::ffff:
.Dotted-quad notation
.Odpowiedzi:
::ffff:
jest prefiksem podsieci dla adresów IPv4 (32-bitowych) umieszczonych w przestrzeni IPv6 (128-bitowej). IPv6 jest podzielony na dwie części: prefiks podsieci i sufiks interfejsu. Każdy z nich ma 64 bity lub 4 grupy po 4 znaki szesnastkowe.W IPv6 możesz usunąć wiodące zera, a następnie usunąć kolejne zera, co oznacza, że w
::ffff:
rzeczywistości oznacza to0000:0000:ffff:0000
, że ten adres został wyznaczony jako prefiks podsieci IPv4 do IPv6, więc każdy procesor IPv6 zrozumie, że działa z adresem IPv4 i obsłuży go odpowiednio.W najbliższej przyszłości wszystkie adresy IP będą w formacie IPv6, ponieważ w przestrzeni adresowej IPv4 prawie zabrakło (4,2 miliarda, minus trochę miejsca na różne cele).
Ważne jest, aby rozpocząć adresowanie adresów IP przy użyciu przestrzeni nazw IPv6, a zatem uwzględnić
::ffff:
w kodzie znak, ponieważ w przyszłości między tymi dwukropkami będą znajdować się prawdziwe dane szesnastkowe. Jeśli zdejmiesz go ze względów estetycznych, kod zepsuje się, gdy przełączy się na sieć IPv6 lub zostanie skonfrontowany z adresem IPv6.W niektórych sieciach obecnie działa protokół IPv6 i wkrótce będziesz miał do czynienia z adresami IPv6; zrób krok teraz lub zaryzykuj złamanie kodu w przyszłości.
TL; DR (krótka) wersja sprawy brzmi: Wszystko działa dobrze. Nie zmieniaj tego, to wersja IPv6 adresu IPv4.
Jeśli chcesz, aby Twój kod był zgodny z IPv6, wszystko, co musisz zrobić, to sprawdzić
::ffff:
prefiks ... jeśli istnieje, usunąć go i przetworzyć pozostałą część jako IPv4 ... jeśli::ffff:
nie istnieje, jest to adres IPv6 i muszą być przetwarzane jako takie. Możesz sprawdzić dwukrotnie, sprawdzając, czy w ciągu znaków znajdują się kropki, jeśli tak, to jest to IPv4.Miej na uwadze wszystko oprócz zmian, które musisz wprowadzić w adresach IP, po prostu rejestrujesz adres IP, prawda? Będzie to ważne dla parsera i agregatów logów, których można się spodziewać
::ffff:127.0.0.1
i takich w przyszłości. O ile nie musisz zmieniać adresu IP, po prostu zostaw je tak, jak otrzymujesz.źródło
::ffff:
przedrostka wydaje się dość niebezpieczne . Wiesz, IPv6 ma wiele notacji.Wydaje się, że jest to dziwactwo ipv6: dla adresów ipv4, ipv6 wydaje się mieszać notację ipv6 z notacją ipv4.
Aby uzyskać adresy IPv4 i ipv6 w prostej, niezmieszanej notacji, używam:
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; if (ip.substr(0, 7) == "::ffff:") { ip = ip.substr(7) }
źródło
Jeśli potrzebujesz tylko protokołu IPv4, możesz zmusić serwer węzła do nasłuchiwania przy użyciu protokołu IPv4.
W przypadku ekspresowej edycji aplikacji
/bin/www
:zmiana
do
server.listen(port, '0.0.0.0');
To zadziałało przynajmniej dla mnie.
https://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback
źródło
Windows 7 ma domyślnie włączony protokół IPv6. Mimo że mój serwer nasłuchuje tylko na IPv4, Windows 7 wysyła
::ffff:
prefiks do IPv4 w ramach przejścia na IPv6Przejście z IPv4
źródło
Miałem problemy z próbą porównania mapowanych adresów IPv4 i okazało się, że biblioteka ipaddr.js jest pomocna :-)
na przykład
_.isEqual(ipaddr.process('::ffff:127.0.0.1'), ipaddr.process('127.0.0.1')) === true
źródło
Spróbuj tego, aby uzyskać dokładny adres IP, usuwając podsieci,
let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; ip = ip.toString().replace('::ffff:', '');
źródło
Możesz uzyskać swój adres IP samodzielnie lub z określoną rodziną za pomocą gniazd
var app = require('express')(); app.get("/ip", (req, res) => { console.log(req.ip) let ip = req.ip.split(':'); let ip_details = req.socket.address(); console.log(ip_details); // { address: '::ffff:127.0.0.1', family: 'IPv6', port: 3001 console.log(ip[3]);//127.0.0.1 res.json(ip[3]); }
źródło
var ip = req.ip.split(':').pop();
źródło