网络
WireGuard 组网笔记:从握手到排错
WireGuard 的配置只有几行,但每一行都可能成为故障点。它的模型很干净:每个对端 = 一个公钥 + 一组 AllowedIPs,加密和路由是同一张表——AllowedIPs 既决定"发给谁的包要加密",也决定"收到的包允许来自哪个内网段"。
最小可用配置
# 服务端 wg0.conf
[Interface]
Address = 10.66.66.1/24
ListenPort = 51820
PrivateKey = <服务端私钥>
[Peer]
PublicKey = <客户端公钥>
AllowedIPs = 10.66.66.2/32
# 客户端
[Interface]
Address = 10.66.66.2/32
PrivateKey = <客户端私钥>
[Peer]
PublicKey = <服务端公钥>
Endpoint = vpn.example.com:51820
AllowedIPs = 10.66.66.0/24 # 只走内网;写 0.0.0.0/0 则是全隧道
PersistentKeepalive = 25 # NAT 后面必加,保活映射健康检查:先看握手时间
wg show
# 每个 peer 关注三行:
# latest handshake: 30 seconds ago ← 2 分钟内 = 活着
# transfer: 12.04 MiB received, 3.21 MiB sent
# endpoint: 203.0.113.9:51820latest handshake 为空或很久以前,说明隧道根本没建立,后面的 ping 测都不用做。握手每约 2 分钟自动重协商一次,所以健康隧道的握手时间永远不会太老。
握手不成功:分层排错清单
- 包到没到?在服务端抓计数:临时加一条统计规则或
tcpdump -ni any udp port 51820,让客户端重连,看有没有入站包。没包到 → 查云防火墙 / 路由器端口转发 / 运营商拦截,别在配置里打转。 - 包到了不回?多半是公钥对错:客户端配的服务端公钥、服务端存的客户端公钥,任意一边抄错都会静默失败(WireGuard 对无效包不报错)。重新核对两边
wg show的 public key。 - 握手成功但 ping 不通内网?查 AllowedIPs 覆盖、服务端
sysctl net.ipv4.ip_forward、以及回程路由 / NAT 规则(MASQUERADE)。记住回程:对端要知道怎么回到隧道网段。 - 小包通、大包卡?典型 MTU 问题。先把接口 MTU 降到 1280 验证,再逐步上调找到临界点。
- 时通时断?NAT 映射过期——客户端加
PersistentKeepalive = 25;或 DDNS 入口 IP 变了而 Endpoint 写的域名解析有缓存,重启客户端强制重新解析。
排错心法:WireGuard 失败时几乎不给错误信息,所以要靠"分段验证":先证明 UDP 包能到达,再证明密钥能握手,最后才证明路由能转发。三段分开测,永远不要同时改两处。
服务端转发内网的最小规则集
sysctl -w net.ipv4.ip_forward=1
# 隧道网段 → 内网的 NAT(按你的接口名调整)
iptables -t nat -A POSTROUTING -s 10.66.66.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -i wg0 -j ACCEPT
iptables -A FORWARD -o wg0 -j ACCEPT