Подтвердить что ты не робот

Express.js req.ip возвращает:: ffff: 127.0.0.1

В настоящее время я пытаюсь получить IP-адрес запрашиваемого пользователя. Проблема в том, что IP возвращает ::ffff:127.0.0.1 вместо 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({})
});
4b9b3361

Ответ 1

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

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

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

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

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

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

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

IPv6 IPv4

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

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

Ответ 2

Это, кажется, причуда 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)
}

Ответ 3

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

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

Переход с IPv4

Ответ 4

У меня возникли проблемы с попыткой сравнить сопоставленные адреса ipv4 и нашли полезную библиотеку ipaddr.js: -)

например,

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

Ответ 5

Если вам просто нужен IPv4, вы можете заставить сервер узла слушать IPv4.

Для экспресс-приложения отредактируйте /bin/www:

менять

server.listen(port);

в

server.listen(port, '0.0.0.0');

Это сработало для меня по крайней мере.

https://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback

Ответ 6

var ip = req.ip.split(':').pop();

Ответ 7

Попробуйте это, чтобы получить точный IP-адрес, удалив подсеть,

let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
ip = ip.replace('::ffff:', '');

Ответ 8

Вы можете получить свой 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]);  
      }