Skip to main content

One post tagged with "Linux"

View All Tags

· 5 min read

在 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 --system

rp_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 ACCEPT

nftables 思路:

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 MASQUERADE

IPv6 场景优先路由自己的 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 流量。

参考资料#