200字
自建NAT64服务器,原生ipv6访问ipv4
2025-10-11
2025-10-11
VPS

准备工作

你需要:

  • 一个双栈小鸡(同时拥有IPv4和IPv6)
  • Root权限
  • systemd/openrc相关知识
  • 已安装Linux系统(下面会有Alpine、Debian/Ubuntu和RHEL/CentOS的例子)
  1. 找出你的IPv6子网
    ip -6 route
    你会看到类似这样的内容:2001:db8🔢:/64 dev eth0 proto kernel metric 256 pref medium

这显示了你的/64子网和网络接口。记下来,后面要用!

  1. 为IPv4映射选择一个/96前缀
    从你的子网中选一个/96前缀的幸运数字用于映射IPv4地址。如果你的子网是2001:db8🔢:/64,你可以用 2001:db8:1234:64:ff9b::/96,这种格式用96位作为IPv6前缀,32位用来嵌入IPv4地址。
  2. 添加本地路由
ip -6 route add local 2001:db8:1234:64:ff9b::/96 dev lo

复制

  1. 设置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替换成你自己的实际值哦!

  1. 测试本地路由设置
ping -6 2001:db8:1234:64:ff9b::1234

复制

如果遇到问题,检查一下防火墙是开的,ICMPv6是通的。

注意:有些云厂商对流量有限制。比如Oracle Cloud会过滤掉那些没有绑定到VNIC的IPv6地址的流量。龟壳一生黑。

  1. 下载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

复制

  1. 设置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

复制

  1. 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

复制

  1. 创建启动脚本,让你的设置在重启后不会丢失
    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设置成功

自建NAT64服务器,原生ipv6访问ipv4
作者
Administrator
发表于
2025-10-11
License
CC BY-NC-SA 4.0

评论