Я сейчас пытаюсь узнать IP запрошенного пользователя. Проблема в том, что ::ffff:127.0.0.1
вместо него возвращается IP 127.0.0.1
. Я пробовал использовать trusted proxy
опцию (хотя и не через прокси), но поле req.ips
пусто. Использование 4.x Express.js.
router.get('/', function(req, res, next) {
console.log('ip', req.ip)
res.send({})
});
req.ip
илиreq.ips
?req.ip
, просто пробовалreq.ips
в качестве теста. Я просто не уверен, что вызывает префикс::ffff:
.Dotted-quad notation
.Ответы:
::ffff:
- это префикс подсети для адресов IPv4 (32 бита), которые помещаются внутри пространства IPv6 (128 бит). IPv6 разбит на две части: префикс подсети и суффикс интерфейса. Каждый из них имеет длину 64 бита или 4 группы по 4 шестнадцатеричных символа.В IPv6 вам разрешено удалить ведущие нули, а затем удалить последовательные нули, что означает, что
::ffff:
фактически переводится0000:0000:ffff:0000
, этот адрес был обозначен как префикс подсети IPv4 в IPv6, поэтому любой процессор IPv6 поймет, что он работает с адресом IPv4, и обработает его. соответственно.В ближайшем будущем все IP-адреса будут IPv6, потому что мы почти исчерпали число (4,2 миллиарда, за вычетом некоторого места для разных целей) в адресном пространстве IPv4.
Важно начать адресацию IP-адресов с использованием пространства имен IPv6 и, следовательно, включить
::ffff:
в свой код, потому что в будущем между этими двоеточиями будут настоящие шестнадцатеричные данные. Если вы удалите его из эстетических соображений, ваш код сломается, когда он переключится на сеть IPv6 или столкнется с IPv6-адресом.Некоторые сети в настоящее время используют IPv6, и вскоре вы столкнетесь с IP-адресами IPv6; совершите скачок сейчас или рискуете взломать код в будущем.
TL; DR (краткая) версия вопроса: все работает нормально. Не меняйте его, это версия IPv6 адреса IPv4.
Если вы хотите сделать свой код совместимым с IPv6, все, что вам нужно сделать, это проверить
::ffff:
префикс ... если он существует, удалить его и обработать остаток как IPv4 ... если::ffff:
не существует, это адрес IPv6 и должны обрабатываться как таковые. Вы можете дважды проверить, есть ли в строке точки, если да, то это IPv4.Помните обо всем, кроме настроек, которые вам нужно внести в IP-адреса, вы просто записываете IP-адрес, верно? Для агрегатов парсера и журналов будет важно ожидать
::ffff:127.0.0.1
и тому подобное в будущем. Если вам не нужно изменять IP-адрес, просто оставьте его таким, каким вы его получили.источник
::ffff:
префикс звучит довольно опасно . Вы знаете, IPv6 имеет много обозначений.Это похоже на причуду ipv6: для адресов ipv4 ipv6, похоже, смешивает нотацию ipv6 с нотацией ipv4.
Чтобы получить адреса ipv4 и ipv6 в простой, несмешанной нотации, я использую:
источник
Если вам просто нужен IPv4, вы можете заставить сервер узла прослушивать IPv4.
Для экспресс-редактирования приложения
/bin/www
:изменение
к
По крайней мере, это сработало для меня.
https://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback
источник
В Windows 7 по умолчанию включен IPv6. Несмотря на то, что мой сервер прослушивает только IPv4, Windows 7 отправляет
::ffff:
префикс IPv4 как часть перехода на IPv6.Переход с IPv4
источник
У меня возникли проблемы с попыткой сравнить сопоставленные адреса ipv4, и я нашел библиотеку ipaddr.js полезной :-)
например
источник
Попробуйте это, чтобы получить точный IP-адрес, удалив подсети,
источник
Вы можете получить свой IP-адрес самостоятельно или с указанной семьей, используя сокеты
источник
источник