简介

这篇文章和上一篇文章类似,仍然是围绕着“如何实现 IPv6 网络到 IPv4 网络的可访问性“进行的,然而与上一篇文章的出发点不同,上一篇文章是从网站/应用作者的角度出发,描述应当怎样主动面向 IPv6-only 用户提供服务,而这篇文章将站在用户自己的角度,探讨作为一个用户应当怎样做才能实现 IPv6 主机到 IPv4-only 网络的可访问性。

可扩展性问题

在上一篇文章中我们讨论了:如果一个网站只面向 IPv4 网络提供服务,如何让 IPv6-only 的客户端能够访问它,具体来说我们介绍了两种方式:HTTP Message 转发 (layer 7) 和 Stream 转发 (layer 4).

然而,用这种手动的、一次只解决一件事的方式来解决 IPv6-only 网络到 IPv4-only 的可访问性问题是非常低效的。

因为,当你有多个网站,需要做这样的操作的时候,会非常麻烦,这时你有下列选择:

  1. 继续在 layer 4 转发,但是要为每一个需要被转发的网站,单独申请一个 IPv6;
  2. 还是在 layer 4 转发,只申请一个 Public IPv6 地址, 但是需要解析出请求的 Host, 让 packet 重路由然后 DNAT 到 Host 对应的 IPv4;
  3. 在 layer 7 转发,转发机自己充当一个 Web server, 在 HTTP Message 的层面转发(而不是转发 packet),转发机要能够访问到被代理网站的域名的 TLS 证书和私钥,这增加了额外的握手和 HTTP 消息解析的成本,并且需要额外的精力,去保障转发机始终能够访问到有效的被代理网站的域名证书和私钥;

总的来说都很不方便,一定有更省事、更优雅解决方法。

DNS64 和 NAT64

DNS64 描述一个 DNS 服务器如何给一个从未设置过 AAAA 资源记录的域名解析出 IPv6 地址。

DNS64 默认使用一个特别约定好的 IPv6 前缀(也叫 Well Known Prefix,简称 WKP),64:ff9b::/96, 来凭空构造出一个本不存在的 IPv6 解析结果,具体来说,当一个启用了 DNS64 功能的 DNS 服务器在收到一个针对于域名 example.com 的 AAAA 类型的查询请求时:

举例来说,github.com 这个域名原本没有设置 AAAA 记录,换句话说默认情况下你无法查到此域名对应的 IPv6 地址,然后,若你向一个启用了 DNS64 的 DNS 服务器查询 github.com 的 AAAA 记录,你会得到:

0064:ff9b:0000:0000:0000:0000:c01e:ff70
                              ^
                              IPv4.

这个结果。

因为 0xc0 0x1e 0xff 0x70(也就是 192.30.255.112)正是 github.com 的 A 记录查询结果(是它的 IPv4 网络上的服务器的 IP 地址)。

可以执行以下命令,并且观察标准输出内容,来验证: