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({})
});
Ответы
Ответ 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-адреса.
![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]);
}