请注意,本文编写于 1535 天前,最后修改于 1502 天前,其中某些信息可能已经过时。
背景
- 手里有仅支持
ipv6
的服务器,需要正常访问网络 - CERNET 用户迫于高额的流量费,寻求免流
准备工作
- 开始之前首先你要找你的
ISP
的客服申请一个至少是/96
的ipv6 address space
,并要他们做好路由 - 或者使用
IPv6
地址中专门给NAT64
划分的地址池64:ff9b::/96
,并在每一个客户端指定路由
部署
这里使用 debian10 做演示
如果你有专属的
ipv6 address space
,你需要将以下内容中的 64:ff9b::/96
修改为你申请到的 ipv6 block
DNS64
首先安装 unbound
:
apt -y update
apt -y install unbound dnsutils
新建一个配置文件:
nano /etc/unbound/unbound.conf.d/dns64.conf
写入如下配置:
server:
verbosity: 2
pidfile: "/var/run/unbound.pid"
use-syslog: yes
module-config: "dns64 iterator"
dns64-prefix: 64:ff9b::/96
dns64-synthall: no
interface: ::0
port: 53
access-control: ::0/0 allow
forward-zone:
name: "."
forward-addr: 114.114.114.114
重启/设置unbound开机自启:
systemctl restart unbound.service
systemctl enable unbound.service
测试一下DNS64服务能否正常工作,随便找一个不支持ipv6的域名dig看看,如果可以解析出我们伪造的ipv6地址就说明OK了:
root@server:~# dig @你的ipv6地址 AAAA www.baidu.com
; <<>> DiG 9.16.1-Ubuntu <<>> @你的ipv6地址 AAAA www.baidu.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65047
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com. IN AAAA
;; ANSWER SECTION:
www.baidu.com. 56 IN CNAME www.a.shifen.com.
www.a.shifen.com. 140 IN AAAA 64:ff9b::3d87:a979
www.a.shifen.com. 140 IN AAAA 64:ff9b::3d87:b920
;; Query time: 48 msec
;; SERVER: 你的ipv6地址#53(你的ipv6地址)
;; WHEN: 二 9月 08 13:53:05 CST 2020
;; MSG SIZE rcvd: 125
NAT64
接下来安装jool,利用jool来实现NAT64,需要注意的是jool不支持OpenVZ/LXC这类容器虚拟化:
apt -y install linux-headers-$(uname -r)
cd /opt
wget https://jool.mx/download/jool-dkms_4.1.3-1_all.deb
wget https://jool.mx/download/jool-tools_4.1.3-1_amd64.deb
apt -y install ./jool-dkms_4.1.3-1_all.deb ./jool-tools_4.1.3-1_amd64.deb
把jool自带的服务关闭了:
systemctl stop jool
systemctl disable jool
加载jool的模块到内核:
modprobe jool
查看模块加载是否成功:
lsmod | grep jool
如果有类似回显说明OK:
jool 进程号 0
jool_common 进程号 1 jool
nf_defrag_ipv6 进程号 1 jool
nf_defrag_ipv4 进程号 1 jool
x_tables 进程号 2 jool,ip_tables
现在添加一个实例,实例的 ipv6
地址池就是 ISP
分配给我们的:
jool instance add "test" --netfilter --pool6 64:ff9b::/96
现在NAT64服务就搭建好了,我们可以测试一下能否工作,在你的另一台只有ipv6的小鸡上更改DNS服务器地址:
nano /etc/resolv.conf
修改成刚才搭建的服务器地址:
nameserver 2001:da8:........
如果你没有申请到专属的
ipv6 address space
,即采用的是64:ff9b::/96
,你需要在 ipv6
小鸡上添加路由,一个示例命令如下ip -6 route add 64:ff9b::/64 via 你的nat64服务器ipv6地址
然后测试一下:
curl -6 -v www.baidu.com
回到我们的服务器内删除刚添加的实例/卸载模块:
jool instance remove "test"
modprobe -r jool
新建一个systemd服务文件:
nano /lib/systemd/system/jool-nat64.service
写入如下配置:
[Unit]
Description=JOOL NAT64
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/sbin/modprobe jool
ExecStart=/usr/bin/jool instance add "nat64" --netfilter --pool6 64:ff9b::/96
ExecStop=/usr/bin/jool instance remove "nat64"
CapabilityBoundingSet=CAP_SYS_MODULE CAP_NET_ADMIN
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
InaccessiblePaths=/tmp /dev
ProtectKernelTunables=yes
ProtectKernelModules=no
ProtectControlGroups=yes
RestrictAddressFamilies=AF_NETLINK
RestrictNamespaces=yes
LockPersonality=yes
MemoryDenyWriteExecute=yes
RestrictRealtime=yes
SystemCallArchitectures=native
[Install]
WantedBy=multi-user.target
使用systemd管理jool:
systemctl start jool-nat64.service
systemctl enable jool-nat64.service
坑
如果你的 DNS64+NAT64 服务器支持
ipv6 privacy extensions
,如果可以关闭的话,关闭它并重启服务器,如果不能关闭,以上所有的服务器ipv6地址均需要时刻修改为服务器的临时ipv6地址,否则客户端可能无法与之正常通信