在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. 更新系统:

    1
    sudo apt update && sudo apt upgrade -y
  2. 开启内核转发: 要让服务器能像路由器一样转发数据包,必须开启内核的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地址。

  1. 安装Unbound:

    1
    sudo apt install unbound -y
  2. 创建配置文件:

    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
    29
    server:
    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是执行协议转换的核心。

  1. 安装Tayga:

    1
    sudo apt install tayga -y
  2. 编辑配置文件:

    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. 添加转发策略:

    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

  2. 放行DNS服务端口:

    1
    sudo ufw allow 53

六、 配置ndppd (NDP代理)

这是让外部客户端能够找到我们服务器上合成的IPv6地址的关键一步

我在这里踩坑踩了好久,不知道什么原因,我的系统上使用net.ipv6.conf.eth0.proxy_ndp = 1并不能成功代理NDP,最后换用了ndppd才解决。

  1. 安装ndppd:

    1
    sudo apt install ndppd -y
  2. 编辑配置文件:

    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. 设置全部服务开机自启,并同时启动所有服务:

    1
    2
    3
    sudo systemctl enable --now unbound
    sudo systemctl enable --now tayga
    sudo systemctl enable --now ndppd

八、 最终验证

  1. 找一台只有IPv6连接的客户机。
  2. 将其DNS服务器地址设置为您的NAT64服务器的公网IPv6地址(2602:aaaa:bbbb:cccc::1)。
  3. 在客户机上,访问任何一个只有IPv4的网站:
    1
    curl -v http://ipinfo.io
    成功返回结果,大功告成!