Skip to main content

WireGuard 接入 DN42

· 5 min read

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.pub

private 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::1

TCP 可以使用 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。

参考资料#