2012-10-02 34 views
2

我对作为开发人员和我的遗留应用程序的IPv6的引入意味着什么感到困惑。为IPv4编写的遗留应用程序中的IPv6地址

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

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

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

    到目前为止,这一直返回IPv4地址的格式A.B.C.D。如果使用IPv6的客户端连接到我的网站,这会改变吗?或者可能发生的情况是,各种隧道技术使IPv6客户端根据我的网站设置将自己伪装成IPv4客户端?

  3. 当涉及到检索和处理IP地址时,是否还有其他可能会遇到的IPv6问题?

回答

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

有一个whitepaper

  • 一个客户端,突出显示您作为软件开发人员遇到的最重要的问题。

  • +0

    感谢您解决困惑。这件事情看起来很复杂,我发言的大多数开发人员对此知之甚少。 – Gruber

    +1

    看来,不幸的是开发人员在规划引入IPv6时没有得到足够的重视。这会在不久的将来引起一些头痛。软件改进组织(sig.eu)做了一些研究,发现12%的商业软件并不是用来处理IPv6 ...... :-( –

    1

    我知道IPv4和IPv6在本质上是不兼容的。 IPv4客户端能够访问使用IPv6的网站吗?IPv6客户端能够访问IPv4网站吗?

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

    最初的想法是,整个世界将从“单栈IPv4”移动到“双栈”。然后,一旦每个人都在双栈,我们可以开始关闭IPv4并转移到“单栈IPv6”。

    但是这并没有发生,网络运营商已经看到小的压力IPv6部署和IANA和大多数区域性互联网注册机构已经耗尽IPv4地址。因此,我们已经结束了大量IPv4的日子已经过去的情况,但仍然有很多仅有v4的客户端和服务器。

    多种过渡机制已经弹出。其中包括:

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

    他们都不是解决所有的问题,其中一些创建自己的问题,但在组合使用它们可以让你与仅支持IPv4相对较少的运行V6-只有内部网络地址去跟世界其他地区。

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

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

    如果您的服务器通过使用“::”上的套接字来侦听ipv4和ipv6连接(Linux默认启用此功能,windows需要特定的套接字选项才能启用它),那么ipv4地址将被传递给应用程序该套接字为“ipv4映射地址”。你使用的库可能或我不会将它隐藏起来(我不熟悉MVC的功能)。

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

    当涉及到检索和处理IP地址时,是否还有其他可能会遇到的IPv6问题?

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


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