如何在Node.js Express.js中将IPv6地址转换为IPv4地址?

7

NODEJS的请求对象提供了这个方法req.connection.remoteAddress来获取客户端的IP地址,但它以IPV6格式给出地址,如何将其转换为更易读的IPV4格式?


3
你说的是不可能的事情,因为你无法将128位转换为32位。 - Hemant Rajpoot
::ffff: 是 IPv6(128 位)空间内放置的 IPv4(32 位)地址的子网前缀。如果出于美观原因将其去除,当代码切换到 IPv6 网络或面对 IPv6 地址时,您的代码将会出现错误。 - Cr.
2个回答

4
问题是因为默认情况下,NodeJS监听IPv6地址,所以返回的是IPv6地址。如果告诉它只监听IPv4地址,则只会得到IPv4地址,并且它们的格式将符合您的期望(没有::ffff:前缀)。
如何实现这一点取决于您使用的库,但通常在指定要侦听的端口的位置,您还可以指定一个主机/接口/IP,这里您需要输入0.0.0.0表示“仅限IPv4”,而默认的::表示IPv6 + IPv4。
例如,使用NodeJS套接字库:
server.listen({
    port: 80,
    host: '0.0.0.0',
})

对于WebSockets:

...listen(80, '0.0.0.0');

谢谢您的回答,应该被接受。如果您使用的是express,则称为“hostname”。 - Sergio Arrighi

4
如果IPv6地址以::ffff:开头,则客户端正在使用IPv4与IPv6应用程序通信。在这种情况下,地址的其余部分是IPv4地址。它可能被写成::ffff:10.11.12.13,在这种情况下,您可以轻松地看到IPv4地址。它也可以写成::ffff:0a0b:0c0d::ffff:a0b:c0d,在这种情况下,您需要将地址的最后一部分从十六进制转换为十进制。
如果IPv6地址不以::ffff:开头,则客户端确实正在使用IPv6进行通信,并且无法进行转换,因为IPv4和IPv6是具有不同地址的不同协议。系统可以只有IPv4,只有IPv6或两者都有。通过查看地址,你无法知道它们之间的差异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接