文章

NAT64 / DNS64?尝一下

本文为《年轻人的第一个 ASN》系列番外……虽然这玩意根本就出了一篇而已。


你说得对……但是为什么要用这个呢?

  • IPv4?老东西什么时候似啊,都 2025 年了,IPv6 的时代已经到来力!但是众所周知很多大厂因为各种原因仍然不支持 IPv6(比如 GitHub),个人认为 NAT64 是一个非常优雅的方案。

  • 以及,作为一个大学生,经常会用到一些只能在校内使用的服务,如果校园网爆了或者在校外的话就无法使用了。这种情况下就可以在校内布设一个 NAT64 路由器,把校内的 IP 暴露到公网上,就可以爽爽使用了!

Let's start from here!

等等,这些名词都是什么东西?

NAT64

NAT64 是一种通过网络地址转换(NAT)的形式促成 IPv6 与 IPv4 主机间通信的 IPv6 过渡机制。

——NAT64 - Wikipedia

换句话说,这玩意是让 IPv6-only 的主机访问 IPv4 用的。由于 IPv6 的地址空间比 IPv4 大的多,所以我们仅需一段 /96 就可以完成对整个 IPv4 地址空间的映射。这时,我们访问这个映射出来的 IPv6 地址,网关就会帮我们转发到对应的 IPv4 地址上,听起来就很方便对吧。

至于映射方式,有很多种,本篇文章用到的仅为其中最简单的一种。

我们直接拿一段 /96 Prefix,然后把 IPv4 地址拼在最后 32 bits 上,没了。

举个例子,如果前缀是 64:ff9b::/96 的话,我们需要翻译的 IPv4 地址是 192.168.1.1……

  • 我们先把这个 IPv4 地址转成 HEX 吧!192.168.1.1→C0 A8 01 01

  • 然后拼到前缀的后面……64:ff9b::c0a8:101,大功告成!

具体可参见:Section 2 - RFC 6052 - IPv6 Addressing of IPv4/IPv6 Translators

DNS64

DNS64 是指一种专门的 DNS 服务器,在其处理某个域名的 AAAA 记录查询时,如果该域名仅有 A 记录,那么 DNS64 会使用该 A 记录生成出来一项 AAAA 记录。生成出来的 IPv6 地址前缀指向一个 IPv6/IPv4 的转换器,而剩余 32 位嵌入了 A 记录中的 IPv4 地址。指向的转换器通常是一个 NAT64 服务器。

——DNS64 - IPv6过渡机制 - Wikipedia

正如为什么要用 DNS 一样,应该没人会记那个又臭又长的 IP 地址并在脑内自动转换吧。有了 DNS64,我们只需要配置 DNS 就可以直接享受用 IPv6 访问 IPv4 的便利了。

事前准备

  • 一个有双栈访问的 Linux 服务器。

    • 如果想用 IPv6 公网段的一段 IP 布设 NAT64 的话,需要一段 /64.

    • 如果无所谓的话,可以使用 Well-known Prefix,即 64:ff9b::/96

配置 NAT64

本文将使用 Jool 进行 NAT64 的配置,在本文中,我们将会使用 2a14:67c1:7f:6464::/96 作为示例 IP 段,请不要直接套用这里的配置,也不要试图访问这个 IP 段,这段 IP 上什么都没有。

Jool 是一个开源的 SIIT/NAT64 配置工具,官网在这里,根据你服务器的系统,跟着文档进行安装就好了。

安装好了?Jool,启动!

$ modprobe jool
$ jool instance add "nat" --netfilter --pool6 2a14:67c1:7f:6464::/96

哈↑哈↑,然后就没了。

如果你需要持久化这里的配置,根据你服务器的系统,查阅 Jool 官方文档中的配置方案就好了。

另一个设备测试一下?由于我们使用了一段 /96 Prefix,所以可以直接使用 {prefix}:{ip} 作为最后的 IP,举个例子的话,比如说 2a14:67c1:7f:6464::192.168.1.1 ,无需自行转换成 HEX 了。

试试 HTTP,比如 GitHub 呢?

  • 我们先用 dig github.com 获取到 github.com 的 A 记录指向 20.205.243.166

  • curl http://github.com -vvv --resolve github.com:443:[2a14:67c1:7f:6464::20.205.243.166]

It works! 如果你还是不能访问,可以试试重启服务器或重新配置 Jool。

配置 DNS64

你说得对,但是好难用啊,每次都要配置这个长的要命的 --resolve ,那有没有开箱即用的方案呢?

有的,兄弟,有的。在本文中,我们将会使用 bind 搭建我们的 DNS64 服务。

  1. apt-get install bind9 安装 bind,具体命令因系统而异。

  2. 用你最爱的文本编辑器打开 /etc/bind/named.conf.options ,将下面的内容狠狠塞入,记得把 Prefix 改成你实际用的:

options {
    directory "/var/cache/bind";
    dnssec-validation auto;
    auth-nxdomain no;
    listen-on { any; };
    listen-on-v6 { any; };

    allow-query {any;};
    dns64 2a14:67c1:7f:6464::/96 {
        clients { any; };
        mapped { any; };
        suffix ::;
    };
};
  1. 最后,用 systemctl restart named 重启 bind 服务,就大功告成了!

写在最后

嘻嘻,是不是很简单呢(迫真)

使用时需要注意,如果你使用了一段公网 IP 的话,那么你网关服务器上能访问到的所有 IP 都会被暴露到公网上,包括你内网里的妙妙服务,需要注意安全喵!