在 WireGuard 和 BIRD 之前,先把 Linux 本身配置成一台合格的路由器:能转发、能承载本机 DN42 地址、防火墙边界清晰、不会因为反向路径检查丢包。
安装基础工具#
sudo apt updatesudo apt install -y iproute2 curl jq tcpdump wireguard bird2确认 WireGuard 能创建接口:
sudo ip link add wg-test type wireguardsudo ip link del wg-test开启转发并关闭 rp_filter#
创建 /etc/sysctl.d/99-dn42.conf:
sudo tee /etc/sysctl.d/99-dn42.conf >/dev/null <<'EOF'net.ipv4.ip_forward=1net.ipv6.conf.all.forwarding=1net.ipv6.conf.default.forwarding=1
net.ipv4.conf.all.rp_filter=0net.ipv4.conf.default.rp_filter=0EOF
sudo sysctl --systemrp_filter 会检查包的返回路径是否和入接口匹配。DN42 经常有多条隧道和非对称路径,开启它可能导致“对端能发来、我回不去”或“BGP 建立但业务不通”。
检查:
sysctl net.ipv4.ip_forwardsysctl net.ipv6.conf.all.forwardingsysctl net.ipv4.conf.all.rp_filter配置 dummy/loopback 地址#
给本节点配置稳定 DN42 地址:
sudo modprobe dummysudo ip link add dn42 type dummysudo ip addr add 172.22.107.1/32 dev dn42sudo ip addr add fd42:3777:3777::1/128 dev dn42sudo ip link set dn42 up临时命令重启后会失效,推荐使用 systemd-networkd 持久化。
/etc/systemd/network/10-dn42.netdev:
[NetDev]Name=dn42Kind=dummy/etc/systemd/network/10-dn42.network:
[Match]Name=dn42
[Network]Address=172.22.107.1/32Address=fd42:3777:3777::1/128启用:
sudo systemctl enable --now systemd-networkdsudo networkctl reloadip addr show dev dn42如果你的公网网卡由云厂商 agent、NetworkManager 或 netplan 管理,不要盲目切换整机网络管理方式。只用 systemd-networkd 管 dummy 接口即可。
netplan 注意事项#
普通 netplan ethernets: 配置不会凭空创建 dummy 接口。也就是说,仅写下面内容通常不够:
network: version: 2 ethernets: dn42: addresses: - 172.22.107.1/32要么使用 .netdev 创建 dummy,要么确认当前 netplan 版本明确支持你要使用的虚拟接口类型。
防火墙#
不要直接:
iptables -P FORWARD ACCEPT更稳妥的做法是只放行 DN42 隧道相关转发。示例:
sudo iptables -A FORWARD -i wg+ -o wg+ -j ACCEPTsudo iptables -A FORWARD -i wg+ -o dn42 -j ACCEPTsudo iptables -A FORWARD -i dn42 -o wg+ -j ACCEPT
sudo ip6tables -A FORWARD -i wg+ -o wg+ -j ACCEPTsudo ip6tables -A FORWARD -i wg+ -o dn42 -j ACCEPTsudo ip6tables -A FORWARD -i dn42 -o wg+ -j ACCEPTnftables 思路:
table inet filter { chain forward { type filter hook forward priority filter; policy drop; iifname "wg*" oifname "wg*" accept iifname "wg*" oifname "dn42" accept iifname "dn42" oifname "wg*" accept }}如果系统已有 firewalld、ufw 或自写 nftables 规则,应合并到现有规则集中,不要混用多套工具制造顺序问题。
NAT 边界#
DN42 是路由网络。拥有并宣告自己的 DN42 前缀后,应让对端看到真实 DN42 源地址,不应该默认 MASQUERADE。
正常方式:
服务绑定在 172.22.107.1 / fd42:3777:3777::1BIRD 宣告 172.22.107.0/27 / fd42:3777:3777::/48peer 通过 BGP 学到你的前缀只有本地普通 LAN 临时访问 DN42 时才考虑 NAT:
sudo iptables -t nat -A POSTROUTING \ -s 192.168.100.0/24 -d 172.20.0.0/14 -o wg+ -j MASQUERADEIPv6 场景优先路由自己的 ULA 前缀,不推荐 NAT66。
DNS#
Linux 使用 systemd-resolved 时,可以把 .dn42 查询转发到 DN42 DNS:
sudo resolvectl dns wg-peer1 172.20.0.53sudo resolvectl domain wg-peer1 '~dn42'DNS 服务器地址请替换成你信任且可达的 DN42 resolver。DN42 wiki 也提供 DNS 服务说明。
自检#
ip addr show dev dn42ip route showip -6 route showsysctl net.ipv4.ip_forwardsysctl net.ipv6.conf.all.forwardingsysctl net.ipv4.conf.all.rp_filteriptables -S FORWARDnft list ruleset进入下一篇 WireGuard 配置前,至少确认:
dn42接口存在。- 本机 DN42 IPv4/IPv6 地址存在。
- IPv4/IPv6 forwarding 已开启。
rp_filter已关闭。- 防火墙不会阻断后续 WireGuard/BGP 流量。