No momento, estou tentando obter o IP do usuário solicitado. O problema é que o IP está retornando em ::ffff:127.0.0.1
vez de 127.0.0.1
. Tentei usar a trusted proxy
opção (embora não use um proxy) e req.ips
está em branco. Usando 4.x Express.js.
router.get('/', function(req, res, next) {
console.log('ip', req.ip)
res.send({})
});
req.ip
oureq.ips
?req.ip
, apenas tenteireq.ips
como um teste. Só não tenho certeza do que está causando o prefixo::ffff:
.Dotted-quad notation
.Respostas:
::ffff:
é um prefixo de sub-rede para endereços IPv4 (32 bits) colocados dentro de um espaço IPv6 (128 bits). O IPv6 é dividido em duas partes, o prefixo da sub-rede e o sufixo da interface. Cada um tem 64 bits ou 4 grupos de 4 caracteres hexadecimais.No IPv6, você tem permissão para remover zeros à esquerda e, em seguida, remover zeros consecutivos, o que significa que
::ffff:
na verdade se traduz em0000:0000:ffff:0000
, este endereço foi designado como o prefixo de sub-rede IPv4 para IPv6, então qualquer processador IPv6 entenderá que está trabalhando com um endereço IPv4 e o tratará adequadamente.Em um futuro próximo, os endereços IP serão todos IPv6, isso porque estamos quase sem números (4,2 bilhões, menos algum espaço para diversos fins) no espaço de endereços IPv4.
É importante começar a endereçar endereços IP usando o namespace IPv6 e, portanto, incluí-
::ffff:
los em seu código, porque no futuro haverá dados hexadecimais reais entre esses dois pontos. Se você retirá-lo por motivos estéticos, seu código será interrompido quando for alternado para uma rede IPv6 ou confrontado com um endereço IPv6.Algumas redes estão rodando IPv6 e você logo será confrontado com endereços IP IPv6; dê o salto agora ou arrisque quebrar seu código no futuro.
A versão TL; DR (curta) da questão é: Tudo está funcionando bem. Não mude, é a versão IPv6 de um endereço IPv4.
Se você deseja tornar seu código compatível com IPv6, basta verificar o
::ffff:
prefixo ... se existir, remova-o e processe o restante como IPv4 ... se::ffff:
não existir, é um endereço IPv6 e precisa ser processado como tal. Você pode verificar se há pontos na string, se sim, é IPv4.Lembre-se de tudo, exceto os ajustes que você precisa fazer nos endereços IP, você está apenas gravando o IP, certo? Será importante que o analisador e os agregados de log esperem
::ffff:127.0.0.1
e tal no futuro. A menos que você precise alterar um IP, deixe-o como está sendo recebido.fonte
::ffff:
prefixo . Você sabe, um IPv6 tem muitas notações.Esta parece ser uma peculiaridade do ipv6: para endereços ipv4, ipv6 parece misturar a notação ipv6 com a notação ipv4.
Para obter os endereços ipv4 e ipv6 na notação simples e não misturada, estou usando:
fonte
Se você só precisa de IPv4, pode forçar o servidor de nó a escutar usando IPv4.
Para uma edição expressa do aplicativo
/bin/www
:mudança
para
Isso funcionou para mim, pelo menos.
https://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback
fonte
O Windows 7 tem IPv6 habilitado por padrão. Embora meu servidor escute apenas no IPv4, o Windows 7 envia o
::ffff:
prefixo para o IPv4 como parte da transição para o IPv6Transição de IPv4
fonte
Eu estava tendo problemas ao tentar comparar endereços mapeados ipv4 e achei a biblioteca ipaddr.js útil :-)
por exemplo
fonte
Tente isso para obter o endereço IP exato removendo as sub-redes,
fonte
Você pode obter seu endereço IP sozinho ou com a família especificada usando soquetes
fonte
fonte