2015-04-02 126 views
57

我目前正在尝试获取请求的用户的IP。问题是IP正在返回::ffff:127.0.0.1而不是127.0.0.1。我尝试使用trusted proxy选项(虽然不使用代理),而req.ips为空。使用4.x Express.js。Express.js req.ip返回:: ffff:127.0.0.1

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

那么你用什么'req.ip'或'req.ips'? – 2015-04-02 11:32:02

+0

'req.ip',刚试过'req.ips'作为测试。我只是不确定是什么导致前缀':: ffff:'。 – rockerBOO 2015-04-02 11:33:27

+0

http://stackoverflow.com/q/5861107/1700321,http://en.wikipedia.org/wiki/IPv6_address#Presentation'虚线四舍五入符号'。 – 2015-04-02 11:35:25

回答

82

::ffff:是一个子网前缀对于位于IPv6(128位)空间内的IPv4(32位)地址。 IPv6分为两部分,子网前缀和接口后缀。每个长度为64位,或者4个4个十六进制字符组。

在IPv6中,你被允许删除前导零,然后取出连续的零,这意味着::ffff:实际上转化为0000:0000:ffff:0000,该地址已被指定为IPv4向IPv6子网前缀,因此,任何IPv6的处理器就会明白它的工作与一个IPv4地址并相应地处理它。

在不久的将来,IP地址将全部是IPv6,这是因为我们在IPv4地址空间中几乎没有数字(42亿,减去一些空间用于其他目的)。

IPv6允许更大的空间。 “对于任何人来说,340美元都足以成为 ” - 比尔盖茨谈到IPv6。

它开始解决使用IPv6命名空间的IP地址,因此包括::ffff:在你的代码,因为在将来会有那些冒号之间真正的十六进制数据是非常重要的。如果您出于审美原因将其剥离,则当您的代码切换到IPv6网络或遇到IPv6地址时,您的代码将会中断。

某些网络当前正在运行IPv6,您将很快遇到IPv6 IP地址;立即做出飞跃或将来有可能破坏您的代码。

TL; DR(简称)版本的问题是:一切工作正常。不要改变它,它是IPv4地址的IPv6版本。

IPv6 IPv4

如果你想使你的代码兼容IPv6,所有你需要做的是检查是否有::ffff:前缀...如果存在,将其删除并将其余部分处理为IPv4 ...如果::ffff:不存在,则它是IPv6地址,需要按照这种方式进行处理。 您可以通过查看句点是否在字符串中进行仔细检查,如果是,则为IPv4。

请记住,除了需要对IP地址进行的调整外,您只需记录IP,对吗?解析器和日志聚合将在未来期望::ffff:127.0.01等等。除非您需要更改IP,否则请将其保留为您收到的内容。

9

默认情况下,Windows 7启用了IPv6。虽然我的服务器监听仅IPv4时,Windows 7将::ffff:前缀到IPv4的过渡到IPv6

::ffff:0:0:0/96的一部分 - 用于IPv4翻译地址的前缀这是无状态的IP/ICMP使用翻译(SIIT)协议。

Transition from IPv4

8

我是有在试图比较IPv4的问题映射地址,找到了ipaddr.js库有帮助:-)

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

这似乎是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) 
} 
0

您可以单独获得你的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]); 
     } 
相关问题