准备工作
你需要:
- 一个双栈小鸡(同时拥有IPv4和IPv6)
- Root权限
- systemd/openrc相关知识
- 已安装Linux系统(下面会有Alpine、Debian/Ubuntu和RHEL/CentOS的例子)
- 找出你的IPv6子网
ip -6 route
你会看到类似这样的内容:2001:db8🔢:/64 dev eth0 proto kernel metric 256 pref medium
这显示了你的/64子网和网络接口。记下来,后面要用!
- 为IPv4映射选择一个/96前缀
从你的子网中选一个/96前缀的幸运数字用于映射IPv4地址。如果你的子网是2001:db8🔢:/64,你可以用2001:db8:1234:64:ff9b::/96
,这种格式用96位作为IPv6前缀,32位用来嵌入IPv4地址。 - 添加本地路由
ip -6 route add local 2001:db8:1234:64:ff9b::/96 dev lo
复制
- 设置NDP代理
NDP代理的目的是让你的服务器能够回应针对NAT64前缀的NDP和RA请求。
Alpine:
# 安装npd6
apk add npd6
# 配置npd6
cat > /etc/npd6.conf <<EOF
prefix=2001:db8:1234:64:ff9b:: # 你选择的前缀
interface=eth0
ralogging=off
listtype=none
listlogging=off
collectTargets=100
linkOption=false
ignoreLocal=true
routerNA=true
maxHops=255
pollErrorLimit=20
EOF
# 启动服务
rc-update add npd6
service npd6 start
复制
Debian/Ubuntu:
# 安装ndppd
apt install ndppd
# 配置ndppd
cat > /etc/ndppd.conf <<EOF
proxy eth0 {
rule 2001:db8:1234:64:ff9b::/96 {
static
}
}
EOF
# 启动服务
systemctl enable ndppd
systemctl start ndppd
复制
RHEL/CentOS:
# 安装ndppd
dnf install ndppd
# 配置同Debian
# 然后启动服务
systemctl enable ndppd
systemctl start ndppd
复制
记得把2001:db8🔢64:ff9b::和eth0替换成你自己的实际值哦!
- 测试本地路由设置
ping -6 2001:db8:1234:64:ff9b::1234
复制
如果遇到问题,检查一下防火墙是开的,ICMPv6是通的。
注意:有些云厂商对流量有限制。比如Oracle Cloud会过滤掉那些没有绑定到VNIC的IPv6地址的流量。龟壳一生黑。
- 下载NAT64服务器:
curl -fsSL -o nat64 https://github.com/ysshz-ns/nat64/releases/download/v1.0.0/nat64
chmod +x nat64
# 如果是alpine, 运行apk add libc6-compat
复制
如果墙里访问墙外,你可能要开启tcp-brutal加速,我的github上有更详细的说明
然后配置iptables重定向流量:
ip6tables -t mangle -A PREROUTING -d 2001:db8:1234:64:ff9b::/96 -p tcp -j TPROXY --on-port=8888 --on-ip=::1
复制
运行服务器:
./nat64
复制
- 设置DNS64
你可以选择两种DNS64部署模式
服务器端DNS64:你可以在双栈服务器上同时运行DNS64和NAT64。不推荐,比较慢。
客户端DNS64:在你的纯IPv6客户端机器上运行DNS64,只在双栈服务器上运行NAT64。这种方法通常更好,因为它提供:
- 更快的DNS解析(本地DNS查询)
- 对通过NAT64的流量有完全控制权
- 能够选择性地只让某些域名走NAT64
你需要在v6小鸡上安装并配置Unbound,指向你的NAT64服务器的前缀。
# Debian/Ubuntu
apt install unbound
# Alpine
apk add unbound
# RHEL/CentOS
dnf install unbound
复制
配置DNS64:
cat > /etc/unbound/unbound.conf.d/dns64.conf <<EOF
server:
module-config: "dns64 iterator"
dns64-prefix: 2001:db8:1234:64:ff9b::/96
do-not-query-localhost: yes
forward-zone:
name: "."
forward-addr: 1.1.1.1@53
forward-addr: 8.8.8.8@53
EOF
复制
将2001:db8🔢64:ff9b::/96替换为你实际的NAT64前缀,并调整forward-addr为你的DNS服务器。
重启Unbound并配置DNS:
systemctl restart unbound
echo "nameserver ::1" > /etc/resolv.conf
复制
- NAT64作为服务运行
对于systemd系统:
cat > /etc/systemd/system/nat64.service <<EOF
[Unit]
Description=NAT64 Server
After=network.target
[Service]
ExecStart=/path/to/nat64 -p 8888
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl enable nat64
systemctl start nat64
复制
对于使用OpenRC的Alpine:
cat > /etc/init.d/nat64 <<EOF
#!/sbin/openrc-run
command=/path/to/nat64
command_args="-p 8888"
pidfile=/run/nat64.pid
depend() {
need net
after network
}
start() {
ebegin "Starting NAT64"
start-stop-daemon --start --make-pidfile --pidfile \${pidfile} --background --exec \${command} -- \${command_args}
eend \$?
}
EOF
chmod +x /etc/init.d/nat64
rc-update add nat64 default
service nat64 start
复制
- 创建启动脚本,让你的设置在重启后不会丢失
Alpine:
cat > /etc/local.d/nat64-setup.start <<EOF
#!/bin/sh
ip -6 route add local 2001:db8:1234:64:ff9b::/96 dev lo
ip6tables -t mangle -A PREROUTING -d 2001:db8:1234:64:ff9b::/96 -p tcp -j TPROXY --on-port=8888 --on-ip=::1
EOF
chmod +x /etc/local.d/nat64-setup.start
复制
Debian/Ubuntu:
cat > /etc/network/if-up.d/nat64-setup <<EOF
#!/bin/sh
ip -6 route add local 2001:db8:1234:64:ff9b::/96 dev lo
ip6tables -t mangle -A PREROUTING -d 2001:db8:1234:64:ff9b::/96 -p tcp -j TPROXY --on-port=8888 --on-ip=::1
EOF
chmod +x /etc/network/if-up.d/nat64-setup
复制
测试
访问http://test.ustc.edu.cn,如果能访问,说明NAT64设置成功