在IPv6日益普及的今天,我们仍时常需要访问那些IPv4网络资源(例如GitHub),对于一台只有IPv6地址的服务器来说,这无疑是一大痛点。
本文将带你在一台Debian 12服务器上,使用 Tayga (高性能用户空间NAT64网关)、Unbound (轻量级DNS64服务器) 和 ndppd (NDP代理软件),从零开始搭建一个公共NAT64/DNS64服务,实现纯IPv6的客户机也能够访问纯IPv4的服务。
一、 环境与规划
在开始之前,请确保服务器满足以下条件:
- 操作系统: Debian 12
- 公网IPv4地址: 至少一个可以访问公网的IPv4地址,静态动态都可以
- 公网IPv6地址段: 至少一个静态的
/96
以上的IPv6地址段。 (本文示例:2602:aaaa:bbbb:cccc::/64
,服务器主地址为2602:aaaa:bbbb:cccc::1
)
网卡名称:
用来对外通信的主网卡的名称,根据自身情况填写。 (本文示例:
eth0
)
规划NAT64前缀:
我们将从自己的IPv6段中规划出一个/96
的子网,专门用于合成IPv4地址。
- 本文选定的前缀:
2602:aaaa:bbbb:cccc:6464:6464::/96
二、 系统基础配置
更新系统:
1
sudo apt update && sudo apt upgrade -y
开启内核转发: 要让服务器能像路由器一样转发数据包,必须开启内核的IP转发功能。
1
2
3
4
5
6
7
8# 编辑sysctl配置文件
sudo tee -a /etc/sysctl.conf > /dev/null <<EOT
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
EOT
# 立即应用配置
sudo sysctl -p
三、 配置Unbound (DNS64 服务器)
Unbound负责将只有IPv4地址的域名“欺骗性”地解析成一个包含该IPv4地址的特殊IPv6地址。
安装Unbound:
1
sudo apt install unbound -y
创建配置文件:
1
sudo nano /etc/unbound/unbound.conf.d/dns64.conf
将以下内容完整粘贴进去:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29server:
interface: ::
port: 53
do-ip4: no
do-ip6: yes
do-udp: yes
do-tcp: yes
access-control: 2a14:67c0::/29 allow # 自己加白名单进行控制,这里以Alice的IPv6作为示例
access-control: ::1 allow
hide-identity: yes
hide-version: yes
harden-glue: yes
harden-dnssec-stripped: yes
use-caps-for-id: yes
edns-buffer-size: 1472
prefetch: yes
num-threads: 1
msg-cache-size: 32m
rrset-cache-size: 64m
module-config: "dns64 validator iterator"
dns64-prefix: 2602:aaaa:bbbb:cccc:6464:6464::/96
forward-zone:
name: "."
forward-addr: 2606:4700:4700::1111@53
forward-addr: 2606:4700:4700::1001@53
forward-addr: 2001:4860:4860::8888@53
forward-addr: 2001:4860:4860::8844@53
四、 配置Tayga (NAT64 网关)
Tayga是执行协议转换的核心。
安装Tayga:
1
sudo apt install tayga -y
编辑配置文件:
1
sudo nano /etc/tayga.conf
清空文件内容,然后完整粘贴以下配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 创建名为 nat64 的虚拟网络接口
tun-device nat64
# 为Tayga内部通信分配一个私有IPv4地址
ipv4-addr 192.168.255.1
# 定义NAT64前缀,必须与Unbound配置中的dns64-prefix一致
prefix 2602:aaaa:bbbb:cccc:6464:6464::/96
# 定义用于映射IPv6客户端的私有IPv4地址池
dynamic-pool 192.168.255.0/24
# 数据存储目录
data-dir /var/spool/tayga
五、 配置UFW防火墙
配置UFW,允许流量在不同接口之间进行转发,并对外放行DNS服务端口,实现IPv6接口<-->NAT64<-->IPv4接口
的流量通路
添加转发策略:
1
2
3
4
5
6
7
8
9# 允许从 nat64 转发到 eth0
sudo ufw route allow in on nat64 out on eth0
# 允许从 eth0 转发到 nat64
sudo ufw route allow in on eth0 out on nat64
# 以上配置是默认ipv4和ipv6都在eth0接口下,如果不是的话,还需要放行nat64和ipv6接口之间的流量
# sudo ufw route allow in on nat64 out on ipv6接口
# sudo ufw route allow in on ipv6接口 out on nat64放行DNS服务端口:
1
sudo ufw allow 53
六、 配置ndppd (NDP代理)
这是让外部客户端能够找到我们服务器上合成的IPv6地址的关键一步。
我在这里踩坑踩了好久,不知道什么原因,我的系统上使用net.ipv6.conf.eth0.proxy_ndp = 1
并不能成功代理NDP,最后换用了ndppd才解决。
安装ndppd:
1
sudo apt install ndppd -y
编辑配置文件:
1
sudo nano /etc/ndppd.conf
粘贴以下配置内容:
1
2
3
4
5
6
7
8
9# 需注意,这里应当代理监听IPv6的网卡,如果不是eth0请自行修改
proxy eth0 {
router yes
timeout 500
ttl 30000
rule 2602:aaaa:bbbb:cccc:6464:6464::/96 {
static
}
}
七、 启动所有服务
全部配置完成之后,启用全部服务。
设置全部服务开机自启,并同时启动所有服务:
1
2
3sudo systemctl enable --now unbound
sudo systemctl enable --now tayga
sudo systemctl enable --now ndppd
八、 最终验证
- 找一台只有IPv6连接的客户机。
- 将其DNS服务器地址设置为您的NAT64服务器的公网IPv6地址(
2602:aaaa:bbbb:cccc::1
)。 - 在客户机上,访问任何一个只有IPv4的网站: 成功返回结果,大功告成!
1
curl -v http://ipinfo.io