NAT64 / DNS64?尝一下
本文为《年轻人的第一个 ASN》系列番外……虽然这玩意根本就出了一篇而已。
你说得对……但是为什么要用这个呢?
IPv4?老东西什么时候似啊,都 2025 年了,IPv6 的时代已经到来力!但是众所周知很多大厂因为各种原因仍然不支持 IPv6(比如 GitHub),个人认为 NAT64 是一个非常优雅的方案。
以及,作为一个大学生,经常会用到一些只能在校内使用的服务,如果校园网爆了或者在校外的话就无法使用了。这种情况下就可以在校内布设一个 NAT64 路由器,把校内的 IP 暴露到公网上,就可以爽爽使用了!
Let's start from here!
等等,这些名词都是什么东西?
NAT64
NAT64 是一种通过网络地址转换(NAT)的形式促成 IPv6 与 IPv4 主机间通信的 IPv6 过渡机制。
换句话说,这玩意是让 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 服务器。
正如为什么要用 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 服务。
用
apt-get install bind9
安装 bind,具体命令因系统而异。用你最爱的文本编辑器打开
/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 ::;
};
};
最后,用
systemctl restart named
重启 bind 服务,就大功告成了!
写在最后
嘻嘻,是不是很简单呢(迫真)
使用时需要注意,如果你使用了一段公网 IP 的话,那么你网关服务器上能访问到的所有 IP 都会被暴露到公网上,包括你内网里的妙妙服务,需要注意安全喵!