IPv6 过渡机制要解决什么问题?
从最早的 IPv4-only 网络,到 IPv4/IPv6 双协议网络,到最终态的 IPv6-only 网络,这其中涉及到三方:
不考虑 WAN 里不同 ISP 之间互联,LAN 和 WAN 里的网络有如下可能:
- LAN
- IPv4 only
- IPv4/IPv6 dual stack
- IPv6 only
- WAN
- IPv4 only
- IPv4/IPv6 dual stack
- IPv6 only
不考虑同样协议栈的直连,那么 LAN ⟶ WAN ⟶ LAN 互联有如下可能:
- IPv6 ⟶ IPv4 ⟶ IPv6: IPv6 客户端通过 IPv4-only 网络连接 IPv6 服务端
- 最早的 IPv6 互联方案,使用 IPv4 上的隧道技术比如 6in4, 6to4, 6rd,随着 IPv6 普及,ISP 转向 IPv6-only 网络,这种过渡方案会逐渐废弃
- IPv4 ⟶ IPv6 ⟶ IPv4: IPv4 客户端通过 IPv6-only 网络连接 IPv4 服务端
- 由于 ISP 支持双协议栈成本很高,ISP 倾向于部署 IPv6 only 的网络,使用 IPv4aaS 定义的技术(464XLAT, DS-Lite, lw4o6, MAP-E, MAP-T) 提供 IPv4 互联服务,这是目前的主流过渡方案
- IPv6 ⟶ IPv4 or IPv6 ⟶ IPv4: IPv6 客户端连接 IPv4 服务端
- IPv6 ⟶ IPv4: 由于 ISP 双协议栈支持成本,以及 IPv4 地址耗尽,ISP 会倾向于不给终端设备分配 IPv4 地址,这种情况下跟第二种类似
- IPv4 ⟶ IPv4 or IPv6 ⟶ IPv6: IPv4 客户端连接 IPv6 服务端
- IPv4 ⟶ IPv6: NAT-PT 和 NAPT-PT 已经废弃,这种过渡方案是不建议的,客户端应该升级到 IPv6 协议栈
综上,IPv6 过渡机制最根本的是要解决 IPv6 ⟶ IPv4 通信。
IPv6 到 IPv4 通信机制
IPv6 ⟶ IPv4 有两个问题要解决:
- IPv6 packet 到 IPv4 packet 协议转换,包括 IPv6 ↔︎ IPv4 和 ICMPv6 ↔︎ ICMPv4 的转换,有这些解决办法:
- 应用层网关,比如 HAProxy、Nginx 等,在双协议栈机器上转换。
- 网络层协议转换,这是 SIIT 和 NAT64 解决的。
- 有些 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 互操作办法:
- tunneling
- IPv6 over IPv4,参考 RFC 7059: A Comparison of IPv6-over-IPv4 Tunnel Mechanisms
- 6in4: 使用 IP 协议号 41,需要静态配置 tunnel;
- 6to4: tunnel 对端 IPv4 公网地址内嵌在 IPv6 地址中,因此无需配置静态隧道。目前基本没人用这个了,6rd 是推荐的方案;
- 6over4: 依赖 IPv4 multicast 自动建立隧道;
- isatap: 类似 6over4,但是不依赖 IPv4 multicast;容易使用,但是不推荐在生产环境使用;
- 6rd: 派生自 6to4,区别在于 ISP 为客户提供 relay,因此服务质量容易保证,也能快速部署(rd 意为 rapid deployment),推荐方案;
- teredo: 使用 UDP 封装,支持 NAT 穿透。目前基本没人用这个了。
- ayiya:使用 UDP/TCP/SCTP 封装,支持 NAT 穿透;
- 6PE, 6PVE: MPLS 网络上的 IPv6 和 IPv6 VPN;
- LISP
- GRE(RFC2784)
- L2TPv2
- IPv4 over IPv6
- 4in6: 需要静态配置 tunnel,可以使用 TSP 协议自动配置
- ayiya
- MAP-E
- Public 4over6: 不推荐,新的部署应该使用 Lightweight 4over6
- DS-Lite,推荐方案,CPE给客户分配 IPv4 私网地址(192.0.0.0/29),并用 IPv4-in-IPv6封装成 IPv6 数据包发给 ISP,ISP 的运营商级别 NAT 转换成 IPv4 数据包
- Lightweight 4over6: DS-Lite 的扩展,把 NAT 功能转到客户侧路由器
- IPv6 over IPv4,参考 RFC 7059: A Comparison of IPv6-over-IPv4 Tunnel Mechanisms
- translation
- SIIT
- SIIT-DC: 数据中心内部使用的 SIIT
- NAT64
- 464XLAT: 结合 RFC 6145 stateless NAT64(Customer side transLATor, CLAT) 和 RFC6146 stateful NAT64(Provider side transLATor, PLAT),CLAT 可以运行在客户侧路由器,也可以运行在客户设备上,PLAT 则运行在 ISP 网络里。
- IVI
- dIVI: 扩展了 IVI
- MAP-T: 即 dIVI-PD,扩展了 IVI 的设计。与 464XLAT、DS-Lite 相比,很大的好处是不需要运营商运行 stateful NAT64
- 4rd: 实验性质,比 MAP-E 和 MAP-T 更好
- TRT: 在传输层通过 client(IPv6) ⟶ relay(IPv6)、relay(IPv4) ⟶ server(IPv4) 两条网络连接来转发 TCP/UDP,配合 DNS64,将去往 ipv4-addr 流量路由到 relay server 的 ipv6-prefix:ipv4-addr 地址
- 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 地址)。
实现
- isatap: Windows XP、Vista、7、8、10, Windows Server 2008、2012, Linux, KAME(*BSD), Cisco IOS
- 6rd, 6to4, 6in4, ds-lite:
- NAT64
- https://www.jool.mx/ 看起来最流行
- https://www.wrapsix.org/ user space, faster than kernelspace Ecdysis, faster than userspace stateless Tayga
- https://ecdysis.viagenie.ca/index.html 有 Linux 内核模块,并且被收入 OpenBSD 的 pf 中
- FreeBSD 11.1 的 ipfw_nat64, ipfw_nptv6 (Linux iptables-extensions 中也有 SNPT 和 DNPT 用于转换 IPv6 地址前缀)
- http://www.litech.org/tayga/ 用户空间,知名,成熟稳定,但性能不够好
- https://github.com/fln/nat64 内核模块
- https://github.com/lynic/xlat 北邮同学作品,Go 语言实现
- IVI: http://www.ivi2.org/ 只有 linux-2.6 源码
- MAP-E + MAP-T: https://openwrt.org/docs/guide-user/network/map
- DNS64
- Bind 9
- Unbound
参考
- https://en.wikipedia.org/wiki/IPv6_transition_mechanism
- Silvia Hagen, IPv6 Essentials: Integrating IPv6 into Your IPv4 Network, O’Reilly Media (2014)
- RFC2765: Stateless IP/ICMP Translation Algorithm (SIIT)
- RFC7084: Basic Requirements for IPv6 Customer Edge Routers
- RFC8504: IPv6 Node Requirements
- RFC4213: Basic Transition Mechanisms for IPv6 Host and Routers
- RFC6144: Framework for IPv4/IPv6 Translation
- RFC6145: IP/ICMP Translation Algorithm
- RFC6146: Stateful NAT64
- RFC6147: DNS64
- RFC6052: IPv6 Addressing of IPv4/IPv6 Translators,定义了 64:ff9b::/96 前缀用于全球因特网
- RFC8215: Local-Use IPv4/IPv6 Translation Prefix,定义了 64:ff9b:1::/48 前缀用于局域网
- RFC4864: Local Network Protection for IPv6
- RFC4966: Reasons to Move the NAT-PT to Historic Status
- RFC6889: Analysis of Stateful 64 Translation
- RFC4038: Application Aspects of IPv6 Transition
- https://tools.ietf.org/html/draft-ietf-v6ops-transition-ipv4aas-15
- https://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml
- https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml