为IPv4编写的旧应用程序中的IPv6地址

时间:2012-10-02 08:20:36

标签: network-protocols ipv6 ipv4

我对作为开发人员和遗留应用程序的IPv6的介绍意味着什么感到困惑。

  1. 据我所知,IPv4和IPv6本质上是不兼容的。 IPv4客户端是否能够使用IPv6访问网站,IPv6客户端是否能够访问IPv4网站?

  2. 我检查了我的Spring MVC网站访问者的IP地址:

    private String getIp(HttpServletRequest request) {
        return request.getRemoteAddr();
    }
    

    到目前为止,它始终以 a.b.c.d 格式返回IPv4地址。如果使用IPv6的客户端连接到我的网站,这会改变吗?或者是否会发生各种隧道技术使IPv6客户端根据我的网站设置伪装成IPv4客户端?

  3. 在检索和处理IP地址时,我可能会遇到其他任何IPv6问题吗?

2 个答案:

答案 0 :(得分:4)

  1. 它们之间没有翻译设备或代理服务器。仅IPv4和仅IPv6系统之间的直接通信是不可能的。有一些公共代理,如SixXS IPv4Gate and IPv6Gate,您可以在同时具有IPv4和IPv6的计算机上运行您自己的代理,或者您可以使用DNS64/NAT64从仅IPv6网络连接到IPv4服务器

  2. 是的,request.getRemoteAddr()会在客户端使用IPv6连接到您的服务器时为您提供IPv6地址。如果客户端使用例如NAT64,那么它们看起来就像是IPv4客户端,因此您将看不到IPv6地址。它看起来就像是你身边的一个大型IPv4 NAT盒。

  3. 是。想想这样的事情:

    • 存储地址
    • 具有多个IPv6地址的客户端
    • 使用IPv4和IPv6的一个客户端
  4. 有一个whitepaper突出了您作为软件开发人员将遇到的最重要的问题。

答案 1 :(得分:1)

  

据我所知,IPv4和IPv6本质上是不兼容的。 IPv4客户端是否能够使用IPv6访问网站,IPv6客户端是否能够访问IPv4网站?

如果没有某种转换机制,只有ipv4的客户端将无法与仅支持ipv6的服务器通信,反之亦然。

最初的想法是整个世界将从“单栈ipv4”转变为“双栈”。然后,一旦每个人都在双栈上,我们就可以开始关闭IPv4并转向“单栈ipv6”。

然而,没有发生这种情况,网络运营商几乎没有看到部署IPv6和IANA的压力,而且大多数RIR已经用完了IPv4地址。因此,我们最终处于IPv4充足的时代,但仍有许多仅限v4的客户端和服务器。

出现了各种过渡机制。包括:

  • 隧道机制,“自动隧道”,如6to4和teredo,以及配置隧道到固定端点。这些允许仅在v4网络上的支持v6的主机连接到仅限v6的服务。它们并没有真正帮助太多,因为你无法控制其他人的网络上的机器是否启用了它们。
  • NAT64,无状态(1:1)和有状态(1:多)。这允许管理员运行仅限v6的网络,并仍然可以与互联网上仅限v4的计算机进行交互。这对于客户来说是一个合理的解决方案,但对于服务器而言,它并没有真正解决地址耗尽的问题,因为您仍然发现自己需要为每个服务器提供专用的ipv4地址。
  • 反向代理,这些可以查看应用程序级数据,因此如果更高级别的协议给出主机名的指示(例如,带有主机头的HTTP,带有SNI的TLS),则代理可以侦听单个公共IPv4地址并直接向多个内部服务器发出请求。

它们都没有解决所有问题,其中一些会产生自己的问题但是在组合中使用它们可以允许您运行仅具有相对少数IPv4地址的仅限v6的内部网络来与其余部分进行通信世界。

  

我检查我的Spring MVC网站访问者的IP地址是这样的:....到目前为止,这总是返回格式为a.b.c.d的IPv4地址。如果使用IPv6的客户端连接到我的网站,这会改变吗?或者是否会发生各种隧道技术使IPv6客户端根据我的网站设置伪装成IPv4客户端?

如果你的服务器直接接受ipv6连接,它显然会看到一个ipv6地址。

如果您的服务器通过使用“::”上的套接字来侦听ipv4和ipv6连接(Linux默认启用此功能,则Windows需要特定的套接字选项才能启用它),然后ipv4地址将通过使用socket作为“ipv4映射地址”。您使用的库可能或我不会向您隐藏(我不熟悉Spring MVC的功能)。

如果您接受来自nat64或代理的连接,您显然会看到nat / proxy的地址。在代理的情况下,可以根据代理发送的信息确定客户端的真实IP地址。

  

在检索和处理IP地址时,我可能会遇到其他任何IPv6问题吗?

将IPv4地址存储/传输为32位整数或长度限制较短的字符串的任何地方都可能需要返工。

我强烈建议您为自己设置一个测试网络并开始尝试这些东西。