Экспресс.Яш Треб.ip возвращается:ffff: 127.0.0.1


в настоящее время я пытаюсь получить IP-адрес запрошенного пользователя. Проблема в том, что IP возвращает ::ffff:127.0.0.1 вместо 127.0.0.1. Я пробовал использовать trusted proxy опция (хотя и не с помощью прокси) и req.ips пусто. Через 4.х Экспресс.js.

router.get('/', function(req, res, next) {
    console.log('ip', req.ip)
    res.send({})
});
5 68

5 ответов:

::ffff: - это префикс подсети для адресов IPv4 (32 бит), размещенных в пространстве IPv6 (128 бит). IPv6 разбивается на две части: префикс подсети и суффикс интерфейса. Каждый из них имеет длину 64 бита или 4 группы из 4 шестнадцатеричных символов.

в IPv6 вы можете удалить ведущие нули, а затем удалить последовательные нули, что означает ::ffff: на самом деле переводится как 0000:0000:ffff:0000, этот адрес был обозначен как префикс подсети IPv4-IPv6, поэтому любой IPv6 процессор поймет, что он работает с IPv4-адресом и обрабатывает его соответствующим образом.

в ближайшем будущем все IP-адреса будут IPv6, это потому, что у нас почти нет номеров (4,2 миллиарда, минус некоторое пространство для misc. целей) в адресном пространстве IPv4.

IPv6 обеспечивает гораздо большее пространство. "340 undecillion что-то должно быть хватит на всех", - сказал Билл Гейтс, выступая на IPv6.

важно начать адресацию IP адреса, использующие пространство имен IPv6 и поэтому включают ::ffff: в вашем коде, потому что в будущем между этими двоеточиями будут реальные шестнадцатеричные данные. Если вы отключите его по эстетическим причинам, ваш код сломается, когда он переключится на сеть IPv6 или столкнется с адресом IPv6.

некоторые сети в настоящее время работают под управлением IPv6, и вы скоро столкнетесь с IP-адресами IPv6; сделайте прыжок сейчас или рискните сломать свой код в будущее.

TL; DR (короткая) версия вопроса: все работает нормально. Не изменяйте его, это версия IPv6 адреса IPv4.

IPv6 IPv4

если вы хотите сделать свой код совместимым с IPv6, все, что вам нужно сделать, это проверить ::ffff: префикс... если он существует, удалите его и обработайте остаток как IPv4... если ::ffff: не существует, это адрес IPv6 и должен быть обработан по существу. Вы можете дважды проверить, если точки находятся в строке, если да, то это IPv4.

имейте в виду, что для всего, кроме настроек, которые вам нужно внести в IP-адреса, вы просто записываете IP, верно? Это будет важно для синтаксического анализа и регистрации агрегатов ожидать ::ffff:127.0.0.1 и такие в будущем. Если вам не нужно изменить IP, просто оставьте его как то, что вы получаете.

это похоже на причуду ipv6: для IPv4-адресов ipv6, похоже, смешивает нотацию ipv6 с нотацией ipv4.

чтобы получить адреса ipv4 и ipv6 в простой, несмешанной нотации, я использую:

var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
if (ip.substr(0, 7) == "::ffff:") {
  ip = ip.substr(7)
}

Windows 7 имеет IPv6 включен по умолчанию. Несмотря на то, что мой сервер слушает только IPv4, Windows 7 отправляет ::ffff: префикс к IPv4 как часть перехода к IPv6

::ffff:0:0:0/96 - префикс, используемый для IPv4-переведенных адресов, которые используются протоколом IP/ICMP Translation (SIIT) без состояния.

переход с IPv4

У меня возникли проблемы с попыткой сравнить IPv4 сопоставленные адреса, и нашел IP-адреса.js библиотека полезная :-)

например

_.isEqual(ipaddr.process('::ffff:127.0.0.1'), ipaddr.process('127.0.0.1')) === true

вы можете получить свой Ip-адрес самостоятельно или с указанным семейством с помощью сокетов

     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]);  
      }