背景

  • 手里有仅支持 ipv6 的服务器,需要正常访问网络
  • CERNET 用户迫于高额的流量费,寻求免流

准备工作

  • 开始之前首先你要找你的 ISP 的客服申请一个至少是/96ipv6 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地址,否则客户端可能无法与之正常通信

最后修改:2020 年 10 月 11 日
如果觉得我的文章对你有用,请随意赞赏