【问题标题】:how to convert ipv6 address to ipv4 address in nodejs expressjs?如何在nodejs expressjs中将ipv6地址转换为ipv4地址?
【发布时间】:2017-11-02 09:17:51
【问题描述】:

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

【问题讨论】:

  • 你说的是不可能的事情,因为你不能将 128bit 转换为 32bit
  • ::ffff: 是放置在 IPv6(128 位)空间内的 IPv4(32 位)地址的子网前缀。如果出于美观原因将其剥离,您的代码将在使用时中断切换到 IPv6 网络或遇到 IPv6 地址。

标签: node.js httprequest ipv6 ipv4 request-object


【解决方案1】:

如果 IPv6 地址以 ::ffff: 开头,则客户端正在使用 IPv4 与 IPv6 应用程序通信。在这种情况下,地址的其余部分是 IPv4 地址。它可能我们写成::ffff:10.11.12.13,在这种情况下你可以很容易地看到 IPv4 地址。也可以写成::ffff:0a0b:0c0d::ffff:a0b:c0d,此时需要将地址的最后一部分从十六进制转换为十进制。

如果 IPv6 地址不是以::ffff: 开头,那么客户端实际上是在与 IPv6 通信,并且无法进行转换,因为 IPv4 和 IPv6 是具有不同地址的不同协议。系统可以只有 IPv4、只有 IPv6 或两者的组合。您无法通过查看地址来知道这一点。

【讨论】:

    【解决方案2】:

    问题是因为默认情况下,NodeJS 侦听 IPv6,因此它返回 IPv6 地址。如果您告诉它仅侦听 IPv4,那么您将仅获得 IPv4 地址,并且它们将采用您期望的格式(无 ::ffff: 前缀)。

    您如何执行此操作取决于您使用的库,但通常在您指定要侦听的端口的位置,您还可以指定主机/接口/IP,在这里您可以输入 0.0.0.0 来表示“仅限 IPv4”,而不是默认的 ::,即 IPv6+IPv4。

    以 NodeJS 套接字库为例:

    server.listen({
        port: 80,
        host: '0.0.0.0',
    })
    

    对于 WebSocket:

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

    【讨论】:

      最近更新 更多