从零开始自建公共DNS64+NAT64服务器

转发一篇自己的博客,最新内容以博客为准

在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
    
  2. 开启内核转发:
    要让服务器能像路由器一样转发数据包,必须开启内核的IP转发功能。

    # 编辑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:

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

    sudo nano /etc/unbound/unbound.conf.d/dns64.conf
    

    将以下内容完整粘贴进去:

    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:

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

    sudo nano /etc/tayga.conf
    

    清空文件内容,然后完整粘贴以下配置:

    # 创建名为 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服务端口

  1. 添加转发策略:

    # 允许从 nat64 转发到 eth0
    sudo ufw route allow in on nat64 out on eth0
    
    # 允许从 eth0 转发到 nat64
    sudo ufw route allow in on eth0 out on nat64
    
  2. 放行DNS服务端口:

    sudo ufw allow 53
    

六、 配置ndppd (NDP代理)

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

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

  1. 安装ndppd:

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

    sudo nano /etc/ndppd.conf
    

    粘贴以下配置内容:

    proxy eth0 {
      router yes
      timeout 500
      ttl 30000
      rule 2602:aaaa:bbbb:cccc:6464:6464::/96 {
        static
      }
    }
    

七、 启动所有服务

全部配置完成之后,启用全部服务。

  1. 设置全部服务开机自启,并同时启动所有服务:

    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的网站:
    curl -v http://ipinfo.io
    
    成功返回结果,大功告成!
10 Likes

感谢分享,请教一下。只有ipv6的家宽,用了nat64,会不会影响家宽的质量。

默认IPv6优先,有IPv6的网站都会优先走IPv6,只有纯IPv4的才会走NAT64

我之前用的是一个家宽的nat64,访问ai网站,如pplx会走ipv4,但是单独ipv6也能访问。ipv4是nat64,导致ai降智了

感谢大佬教程

今天在配置tailscale,刚好看到了

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

准是孕妇效应。

你可以看看DNS64返回的AAAA记录,正常IPv6是本机就出去了,不会把包发往NAT64服务器,只有纯IPv4的才会走NAT64

谢谢,我去查看一下

好文码住

1 Like