【问题标题】:IPv6 addresses in legacy applications written for IPv4为 IPv4 编写的遗留应用程序中的 IPv6 地址
【发布时间】:2012-10-02 08:20:35
【问题描述】:

对于作为开发人员和我的旧应用程序的我来说,引入 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 问题吗?

【问题讨论】:

    标签: network-protocols ipv6 ipv4


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

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

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

      • 地址存储
      • 具有多个 IPv6 地址的客户端
      • 一个同时使用 IPv4 和 IPv6 的客户端

    whitepaper 突出了您作为软件开发人员将遇到的最重要的问题。

    【讨论】:

    • 感谢您解惑。这件事看起来很复杂,我所接触的大多数开发人员对此知之甚少。
    • 不幸的是,在规划引入 IPv6 时,开发人员似乎没有得到足够的重视。这将在不久的将来引起一些头痛。软件改进小组 (sig.eu) 做了一些研究,发现 12% 的商业软件不是为处理 IPv6 而设计的...... :-(
    【解决方案2】:

    我了解 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:many)。这允许管理员运行仅 v6 的网络,并且仍然与 Internet 上的仅 v4 机器进行交互。这对于客户端来说是一个合理的解决方案,但对于服务器来说,它并不能真正解决地址耗尽的问题,因为您仍然需要为每台服务器提供一个专用的 ipv4 地址。
    • 反向代理,这些可以查看应用程序级别的数据,因此如果更高级别的协议给出主机名的指示(例如带有主机标头的 HTTP,带有 SNI 的 TLS),那么代理可以侦听单个公共 IPv4 地址并将请求定向到多个内部服务器。

    它们都不能解决所有问题,其中一些会产生自己的问题,但结合使用它们可以让您运行仅使用 v6 的内部网络,只有相对少数的 IPv4 地址可以与其他网络通信世界。

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

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

    如果您的服务器使用 "::" 上的套接字同时侦听 ipv4 和 ipv6 连接(Linux 默认启用此功能,Windows 需要特定的套接字选项来启用它),那么 ipv4 地址将使用套接字作为“ipv4 映射地址”。您使用的库可能会或我不会向您隐藏这一点(我不熟悉 spring MVC 的功能)。

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

    在检索和处理 IP 地址时,我可能会面临其他 IPv6 问题吗?

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


    我强烈建议您建立一个测试网络并开始试验这些东西。

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 1970-01-01
      • 2013-09-18
      • 2012-12-25
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多