Loading... <div class="tip share">请注意,本文编写于 626 天前,最后修改于 592 天前,其中某些信息可能已经过时。</div> ## 背景 - 手里有仅支持 `ipv6` 的服务器,需要正常访问网络 - CERNET 用户迫于高额的流量费,寻求免流 ## 准备工作 - 开始之前首先你要找你的 `ISP` 的客服申请一个至少是`/96`的 `ipv6 address space`,并要他们做好路由 - 或者使用 `IPv6` 地址中专门给 `NAT64` 划分的地址池 `64:ff9b::/96`,并在每一个客户端指定路由 ## 部署 <div class="tip inlineBlock info"> 这里使用 debian10 做演示 </div> <div class="tip inlineBlock warning"> 如果你有专属的`ipv6 address space`,你需要将以下内容中的 `64:ff9b::/96` 修改为你申请到的 `ipv6 block` </div> ### DNS64 首先安装 `unbound`: ```bash apt -y update apt -y install unbound dnsutils ``` 新建一个配置文件: ```bash nano /etc/unbound/unbound.conf.d/dns64.conf ``` 写入如下配置: ```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开机自启: ```bash systemctl restart unbound.service systemctl enable unbound.service ``` 测试一下DNS64服务能否正常工作,随便找一个不支持ipv6的域名dig看看,如果可以解析出我们伪造的ipv6地址就说明OK了: ```bash 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这类容器虚拟化: ```bash 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自带的服务关闭了: ```bash 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` 分配给我们的: ```bash jool instance add "test" --netfilter --pool6 64:ff9b::/96 ``` 现在NAT64服务就搭建好了,我们可以测试一下能否工作,在你的另一台只有ipv6的小鸡上更改DNS服务器地址: ```bash nano /etc/resolv.conf ``` 修改成刚才搭建的服务器地址: ``` nameserver 2001:da8:........ ``` <div class="tip inlineBlock info"> 如果你没有申请到专属的 `ipv6 address space`,即采用的是`64:ff9b::/96`,你需要在 `ipv6` 小鸡上添加路由,一个示例命令如下 ``` ip -6 route add 64:ff9b::/64 via 你的nat64服务器ipv6地址 ``` </div> 然后测试一下: ```bash curl -6 -v www.baidu.com ``` 回到我们的服务器内删除刚添加的实例/卸载模块: ```bash 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 ``` ## 坑 <div class="tip inlineBlock error"> 如果你的 DNS64+NAT64 服务器支持 `ipv6 privacy extensions`,如果可以关闭的话,关闭它并重启服务器,如果不能关闭,以上所有的服务器ipv6地址均需要时刻修改为服务器的临时ipv6地址,否则客户端可能无法与之正常通信 </div> 最后修改:2020 年 10 月 11 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏