DN42 peer 之间通常不在同一个物理网络,需要先建立隧道。WireGuard 是 DN42 中最常见的隧道方案之一:配置简单、性能好、跨平台。
一条 peer 一个接口#
WireGuard 可以在一个接口上放多个 peer,但它会根据 peer 的 public key 和 AllowedIPs 做内部选择。DN42 的路由选择应该交给 BGP,因此更推荐:
每个 DN42 peer 一个独立 WireGuard 接口每个接口一个 BGP session路由选择交给 BIRD这样排障清楚,也避免多个 peer 的 AllowedIPs 重叠。
生成密钥#
sudo install -d -m 700 /etc/wireguardumask 077wg genkey | sudo tee /etc/wireguard/wg-peer1.key | wg pubkey | sudo tee /etc/wireguard/wg-peer1.pub把公钥发给 peer:
sudo cat /etc/wireguard/wg-peer1.pubprivate key 永远不要发给别人。
wg-quick 配置#
创建 /etc/wireguard/wg-peer1.conf:
[Interface]PrivateKey = <LOCAL_PRIVATE_KEY>ListenPort = 23777Address = fe80::3777/64Table = offMTU = 1420
[Peer]PublicKey = <PEER_PUBLIC_KEY>Endpoint = peer.example.net:23777AllowedIPs = 172.20.0.0/14, 172.31.0.0/16, 10.0.0.0/8, fd00::/8, fe80::/10PersistentKeepalive = 25重点解释:
Table = off非常重要。wg-quick 默认会把AllowedIPs写进路由表,但 DN42 的路由应由 BIRD 决定。Address = fe80::3777/64给接口配置 link-local 地址,后续可用 IPv6 link-local 建 BGP。AllowedIPs必须至少覆盖 BGP 邻居地址和你希望这条 WireGuard 链路承载的 DN42 地址空间。DN42 wiki 示例中也提醒,如果使用很宽的AllowedIPs,没有Table = off可能把流量错误导向 peer。PersistentKeepalive = 25适合 NAT 后面的节点。
启动:
sudo systemctl enable --now wg-quick@wg-peer1sudo wg show wg-peer1你应该看到:
latest handshake: 几秒或几分钟前transfer: rx/tx 都有计数点对点地址#
DN42 中常用 IPv6 link-local 建 BGP,不一定需要给每条隧道分配 IPv4 点对点地址。
如果 peer 要求配置 IPv4/IPv6 点对点地址,wg-quick 不擅长直接表达 /32 peer /32 这种关系,可以使用 PostUp:
PostUp = /sbin/ip addr add dev %i 172.22.107.1/32 peer 172.22.144.66/32PostDown = /sbin/ip addr del dev %i 172.22.107.1/32 peer 172.22.144.66/32/sbin/ip 的实际路径可以用 which ip 查询。
动态 DNS endpoint#
WireGuard 只在接口启动时解析一次 Endpoint 域名。如果 peer 的公网地址经常变化,需要周期性重新解析并更新 endpoint。
常见做法:
使用 WireGuard 官方 reresolve-dns 脚本或者定时重启对应 wg-quick 接口或者让 peer 提供稳定地址生产环境更推荐使用重新解析脚本,而不是频繁重启接口。
MTU#
普通公网 IPv4/IPv6 上跑 WireGuard,MTU = 1420 是常见起点。以下场景需要降低:
- PPPoE。
- WireGuard 外面还有 VMess/Trojan/QUIC。
- 底层又套了 VXLAN/GRE/IPIP。
- 发现小包通、大包不通。
测试:
ping -M do -s 1372 172.20.0.1ping6 -M do -s 1352 fd00::1tracepath 172.20.0.1tracepath6 fd00::1TCP 可以使用 MSS clamp 辅助:
sudo iptables -t mangle -A FORWARD \ -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
sudo ip6tables -t mangle -A FORWARD \ -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu但 MSS clamp 只影响 TCP,不会修复 UDP、ICMP、QUIC。接口 MTU 仍然要测准。
排障#
没有 handshake:
sudo wg show wg-peer1sudo tcpdump -ni any udp port 23777常见原因:
- 公钥填错。
- Endpoint 域名或端口填错。
- 云安全组未放行 UDP。
- NAT 后没有 keepalive。
- 对端还没启动接口。
handshake 有了但 BGP 不通:
ip addr show wg-peer1ping6 -I wg-peer1 fe80::1常见原因:
AllowedIPs没有包含fe80::/10。- BIRD neighbor 没有写
%wg-peer1。 - 防火墙拦截 TCP 179。