IPv6 过渡机制要解决什么问题?

从最早的 IPv4-only 网络,到 IPv4/IPv6 双协议网络,到最终态的 IPv6-only 网络,这其中涉及到三方:

network

不考虑 WAN 里不同 ISP 之间互联,LAN 和 WAN 里的网络有如下可能:

  1. LAN
    1. IPv4 only
    2. IPv4/IPv6 dual stack
    3. IPv6 only
  2. WAN
    1. IPv4 only
    2. IPv4/IPv6 dual stack
    3. IPv6 only

不考虑同样协议栈的直连,那么 LAN ⟶ WAN ⟶ LAN 互联有如下可能:

  1. IPv6 ⟶ IPv4 ⟶ IPv6: IPv6 客户端通过 IPv4-only 网络连接 IPv6 服务端
    • 最早的 IPv6 互联方案,使用 IPv4 上的隧道技术比如 6in4, 6to4, 6rd,随着 IPv6 普及,ISP 转向 IPv6-only 网络,这种过渡方案会逐渐废弃
  2. IPv4 ⟶ IPv6 ⟶ IPv4: IPv4 客户端通过 IPv6-only 网络连接 IPv4 服务端
    • 由于 ISP 支持双协议栈成本很高,ISP 倾向于部署 IPv6 only 的网络,使用 IPv4aaS 定义的技术(464XLAT, DS-Lite, lw4o6, MAP-E, MAP-T) 提供 IPv4 互联服务,这是目前的主流过渡方案
  3. IPv6 ⟶ IPv4 or IPv6 ⟶ IPv4: IPv6 客户端连接 IPv4 服务端
    • IPv6 ⟶ IPv4: 由于 ISP 双协议栈支持成本,以及 IPv4 地址耗尽,ISP 会倾向于不给终端设备分配 IPv4 地址,这种情况下跟第二种类似
  4. IPv4 ⟶ IPv4 or IPv6 ⟶ IPv6: IPv4 客户端连接 IPv6 服务端
    • IPv4 ⟶ IPv6: NAT-PT 和 NAPT-PT 已经废弃,这种过渡方案是不建议的,客户端应该升级到 IPv6 协议栈

综上,IPv6 过渡机制最根本的是要解决 IPv6 ⟶ IPv4 通信。

IPv6 到 IPv4 通信机制

IPv6 ⟶ IPv4 有两个问题要解决:

  1. IPv6 packet 到 IPv4 packet 协议转换,包括 IPv6 ↔︎ IPv4 和 ICMPv6 ↔︎ ICMPv4 的转换,有这些解决办法:
    • 应用层网关,比如 HAProxy、Nginx 等,在双协议栈机器上转换。
    • 网络层协议转换,这是 SIIT 和 NAT64 解决的。
  2. 有些 IPv4 协议会在协议的载荷里嵌入 IPv4 地址或者域名,客户端通过 IPv6 协议拿到后,如果客户端是双协议接入,那么可以直接用 IPv4 协议通信,如果是客户端或者 ISP 是 IPv6 only 接入,那么需要一种机制把 IPv4 地址转成 IPv6 地址再通讯,这有几个办法:
    • DNS64:比如 Bind 9 和 Unbound,它们可以把 A 记录加个前缀改写成 AAAA 记录,缺点是会破坏 DNSSEC ,客户端可以用 DNS over TLS,DNS over HTTPS 之类的办法解决,但总之并不完美,而且也不支持协议载荷里直接内嵌 IPv4 地址。
    • RFC7050 定义的 ipv4only.arpa. 域名,用其返回的 AAAA 地址,把末尾 32bit 替换成目标 IPv4 地址。
    • 464XLAT 中的 CLAT(Customer side transLATor) : Android 4.3, iOS 12.0, Windows 10, FreeBSD 11.3 & 12.1 支持 CLAT,可以将 IPv4 数据包转成 IPv6 数据包再发出去。这种方式显然比 DNS64 方案更好。

IPv6 过渡机制

除了双协议栈,有两种 IPv4/IPv6 互操作办法

  1. tunneling
    1. IPv6 over IPv4,参考 RFC 7059: A Comparison of IPv6-over-IPv4 Tunnel Mechanisms
      1. 6in4: 使用 IP 协议号 41,需要静态配置 tunnel;
      2. 6to4: tunnel 对端 IPv4 公网地址内嵌在 IPv6 地址中,因此无需配置静态隧道。目前基本没人用这个了,6rd 是推荐的方案;
      3. 6over4: 依赖 IPv4 multicast 自动建立隧道;
      4. isatap: 类似 6over4,但是不依赖 IPv4 multicast;容易使用,但是不推荐在生产环境使用;
      5. 6rd: 派生自 6to4,区别在于 ISP 为客户提供 relay,因此服务质量容易保证,也能快速部署(rd 意为 rapid deployment),推荐方案
      6. teredo: 使用 UDP 封装,支持 NAT 穿透。目前基本没人用这个了。
      7. ayiya:使用 UDP/TCP/SCTP 封装,支持 NAT 穿透;
      8. 6PE, 6PVE: MPLS 网络上的 IPv6 和 IPv6 VPN;
      9. LISP
      10. GRE(RFC2784)
      11. L2TPv2
    2. IPv4 over IPv6
      1. 4in6: 需要静态配置 tunnel,可以使用 TSP 协议自动配置
      2. ayiya
      3. MAP-E
      4. Public 4over6: 不推荐,新的部署应该使用 Lightweight 4over6
      5. DS-Lite推荐方案,CPE给客户分配 IPv4 私网地址(192.0.0.0/29),并用 IPv4-in-IPv6封装成 IPv6 数据包发给 ISP,ISP 的运营商级别 NAT 转换成 IPv4 数据包
      6. Lightweight 4over6: DS-Lite 的扩展,把 NAT 功能转到客户侧路由器
  2. translation
    1. SIIT
    2. SIIT-DC: 数据中心内部使用的 SIIT
    3. NAT64
    4. 464XLAT: 结合 RFC 6145 stateless NAT64(Customer side transLATor, CLAT) 和 RFC6146 stateful NAT64(Provider side transLATor, PLAT),CLAT 可以运行在客户侧路由器,也可以运行在客户设备上,PLAT 则运行在 ISP 网络里。
    5. IVI
    6. dIVI: 扩展了 IVI
    7. MAP-T: 即 dIVI-PD,扩展了 IVI 的设计。与 464XLAT、DS-Lite 相比,很大的好处是不需要运营商运行 stateful NAT64
    8. 4rd: 实验性质,比 MAP-E 和 MAP-T 更好
    9. TRT: 在传输层通过 client(IPv6) ⟶ relay(IPv6)、relay(IPv4) ⟶ server(IPv4) 两条网络连接来转发 TCP/UDP,配合 DNS64,将去往 ipv4-addr 流量路由到 relay server 的 ipv6-prefix:ipv4-addr 地址
    10. BIH: 让遗留的 IPv4-only 应用访问 IPv6-only 服务

推荐的 Dual stack client ⟶ IPv6-only network ⟶ IPv4 server 通信机制:464XLAT、DS-Lite、Lw4o6、MAP(MAP-E, MAP-T), 4rd,注意这些除了 464XLAT,其它几个都是需要 ISP 分配特殊的地址段给 Customer 侧才能应用在 IPv6-only network 的方案,而 464XLAT 依赖的 DNS64 和 NAT64 可以在应用级别绕过去(服务端总是使用域名 + 域名预先配置 NAT64 server 地址,客户端特殊处理 IPv4 地址)。

实现

  1. isatap: Windows XP、Vista、7、8、10, Windows Server 2008、2012, Linux, KAME(*BSD), Cisco IOS
  2. 6rd, 6to4, 6in4, ds-lite:
    1. https://openwrt.org/docs/guide-user/network/ipv6_ipv4_transitioning
  3. NAT64
    1. https://www.jool.mx/ 看起来最流行
    2. https://www.wrapsix.org/ user space, faster than kernelspace Ecdysis, faster than userspace stateless Tayga
    3. https://ecdysis.viagenie.ca/index.html 有 Linux 内核模块,并且被收入 OpenBSD 的 pf 中
    4. FreeBSD 11.1 的 ipfw_nat64, ipfw_nptv6 (Linux iptables-extensions 中也有 SNPT 和 DNPT 用于转换 IPv6 地址前缀)
    5. http://www.litech.org/tayga/ 用户空间,知名,成熟稳定,但性能不够好
    6. https://github.com/fln/nat64 内核模块
    7. https://github.com/lynic/xlat 北邮同学作品,Go 语言实现
  4. IVI: http://www.ivi2.org/ 只有 linux-2.6 源码
  5. MAP-E + MAP-T: https://openwrt.org/docs/guide-user/network/map
  6. DNS64
    1. Bind 9
    2. Unbound

参考

  1. https://en.wikipedia.org/wiki/IPv6_transition_mechanism
  2. Silvia Hagen, IPv6 Essentials: Integrating IPv6 into Your IPv4 Network, O’Reilly Media (2014)
  3. RFC2765: Stateless IP/ICMP Translation Algorithm (SIIT)
  4. RFC7084: Basic Requirements for IPv6 Customer Edge Routers
  5. RFC8504: IPv6 Node Requirements
  6. RFC4213: Basic Transition Mechanisms for IPv6 Host and Routers
  7. RFC6144: Framework for IPv4/IPv6 Translation
  8. RFC6145: IP/ICMP Translation Algorithm
  9. RFC6146: Stateful NAT64
  10. RFC6147: DNS64
  11. RFC6052: IPv6 Addressing of IPv4/IPv6 Translators,定义了 64:ff9b::/96 前缀用于全球因特网
  12. RFC8215: Local-Use IPv4/IPv6 Translation Prefix,定义了 64:ff9b:1::/48 前缀用于局域网
  13. RFC4864: Local Network Protection for IPv6
  14. RFC4966: Reasons to Move the NAT-PT to Historic Status
  15. RFC6889: Analysis of Stateful 64 Translation
  16. RFC4038: Application Aspects of IPv6 Transition
  17. https://tools.ietf.org/html/draft-ietf-v6ops-transition-ipv4aas-15
  18. https://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml
  19. https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml