Skip to main content

2 posts tagged with "WireGuard"

View All Tags

· 3 min read

DN42 是一个由社区维护的实验网络。参与者通过隧道互联,用 BGP 交换路由,并在 .dn42 域名空间内提供服务。它不是公网互联网,也不是商用 VPN,而是一个非常适合学习 BGP、路由策略、隧道、RPKI/ROA 和网络运维的实验环境。

本系列按照真实上线顺序组织:

1. 了解 DN42 社区和 registry2. 准备 ASN、地址段和 route/route6 对象3. 配置 Linux 转发、dummy 地址和防火墙4. 使用 WireGuard 与 peer 建立隧道5. 使用 BIRD2 建立 BGP 邻居并过滤路由6. 做日常运维、监控和 Looking Glass

示例信息#

后续文章统一使用下面这组示例。实际部署时请替换成你自己的信息。

ASN:        AS4242423777Router ID: 172.22.107.1IPv4 Host:  172.22.107.1/32IPv4 Net:   172.22.107.0/27IPv6 Host:  fd42:3777:3777::1/128IPv6 Net:   fd42:3777:3777::/48Loopback:   dn42WG IF:      wg-peer1WG LLA:     fe80::3777WG Port:    23777

示例 peer:

Peer ASN:       AS4242420001Peer endpoint:  peer.example.net:23777Peer WG pubkey: <PEER_PUBLIC_KEY>Peer WG LLA:    fe80::1

推荐阅读顺序#

  • 01-registry-and-peering.md:申请资源、理解社区规则、找 peer。
  • 02-linux-network-basics.md:配置 Linux 内核转发、dummy 接口、防火墙和 DNS。
  • 03-wireguard-for-dn42.md:用 WireGuard 建立 DN42 隧道。
  • 04-bird2-routing.md:用 BIRD2 建 BGP 邻居、过滤路由、导入内核。
  • 05-operations-and-looking-glass.md:排障、监控、ROA 更新、bird-lg-go。

上线心法#

DN42 配置最容易出错的地方不是某一条命令,而是概念边界混在一起:

  • WireGuard 负责隧道,不负责选择全网最佳路由。
  • BIRD 负责 BGP 和路由策略,不负责创建 WireGuard 隧道。
  • Linux kernel 负责实际转发,BIRD 学到路由后还需要正确安装进 kernel。
  • DN42 registry 负责声明资源归属,ROA/route 对象缺失会导致路由被过滤。
  • 防火墙负责边界控制,不应该用 iptables -P FORWARD ACCEPT 简单放开一切。

每一步都可以独立验证。新手不要一次性复制整套配置上线,应该按“隧道通、BGP 通、路由通、服务通”的顺序逐层排查。

主要参考资料#

· 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。

参考资料#