在多地办公或家庭实验室(Home Lab)场景中,实现两个私网网段的透明互访是一项基础且重要的需求。WireGuard 凭借其高性能、现代加密算法和极简配置,成为此类场景的首选方案。

本文记录了将两台 OpenWrt 路由器通过 WireGuard 实现站点到站点(Site-to-Site)互联的完整过程,并分享了两个关键故障(路由注入与上游 NAT 漂移)的排障思路。


1. 项目目标

实现两台 OpenWrt 路由器双向互通,使两侧私有网段设备能够透明访问。

设备角色与网络拓扑

  • R5S (服务端角色)
    • 上游:光猫拨号,具备动态公网 IP。
    • 职责:监听连接请求(DDNS + 端口映射已配置)。
    • 内网网段172.31.0.0/24
  • CPE (主动发起端/客户端角色)
    • 上游:无公网 IP(位于ISP大内网之后)。
    • 职责:主动向 R5S 发起握手与保活。
    • 内网网段192.168.66.0/24

地址与端口规划

  • 隧道网段10.66.66.0/24
    • R5S WG 地址:10.66.66.1/24
    • CPE WG 地址:10.66.66.2/24
  • 监听端口:UDP 51820(R5S 侧)

2. 实施方案

2.1 核心设计原则

  1. 服务端/客户端逻辑:R5S 具备公网入口做服务端,CPE 做主动发起端。
  2. 不使用 NAT:目标是私网真实双向互通。
  3. 独立防火墙区域 (Zone):在两端分别建立 vpn 区域,并开放 lan <-> vpn 的双向转发。
  4. 路由自动化:启用 Route Allowed IPs,确保 Allowed IPs 自动转化为系统路由。

2.2 关键步骤分解

R5S 端(服务端)

  1. 安装组件luci-proto-wireguard
  2. 创建接口:建立 wg0,配置私钥,监听端口设为 51820
  3. 配置 Peer (CPE)
    • 填写 CPE 的公钥。
    • Allowed IPs:10.66.66.2/32, 192.168.66.0/24
  4. 防火墙:创建 vpn zone 绑定 wg0。允许 Input/Output/ForwardACCEPT
  5. 转发规则:配置 lan -> vpnvpn -> lan 的转发。
  6. 端口放行:在 WAN 侧开放 UDP 51820
  7. 光猫映射:将外部 UDP 51820 映射至 R5S WAN 口。

CPE 端(客户端)

  1. 创建接口:建立 wg0,无需配置监听端口。
  2. 配置 Peer (R5S)
    • 填写 R5S 的公钥。
    • Endpoint Host:R5S 的 DDNS 域名。
    • Allowed IPs:10.66.66.1/32, 172.31.0.0/24
    • Persistent Keepalive:设为 25(维持 NAT 穿透)。
    • Route Allowed IPs:勾选。
  3. 同步配置防火墙与转发规则(同 R5S 侧)。

3. 排障过程记录

3.1 故障一:隧道互通但内网不通

现象:WireGuard 握手成功,两侧 10.66.66.x 地址可互相 ping 通,但无法访问对端 LAN 地址(如 CPE 无法访问 172.31.0.1)。

定位: 在 CPE 上执行 ip route get 172.31.0.1,结果显示流量走向了默认网关(WAN 口),而非 wg0

根因: CPE 端的 Peer 配置中,虽然写了对端 172.31.0.0/24 的 Allowed IPs,但 未勾选 Route Allowed IPs。导致系统路由表未注入该网段的路由。

修复: 勾选 Route Allowed IPs 后,路由自动生成,私网互通恢复。


3.2 故障二:运行一夜后隧道中断

现象:系统稳定运行后,第二天早上发现 latest handshake 停留在几小时前。CPE 端 wg show 显示只有 sent 流量,0 B received。

定位

  1. CPE 侧:DDNS 域名解析正确,握手包持续发送,但无回显。
  2. R5S 侧wg0 接口正常,但 ping 10.66.66.2 报错 Destination address required(没有可用的 endpoint)。
  3. 系统日志:发现 R5S 在凌晨经历过重启。

根因: R5S WAN 口通过 DHCP 获得地址。重启后,R5S 的内网地址从 192.168.1.109 漂移到了 192.168.1.67。 然而,上游光猫的端口映射目标 IP 仍指向旧地址。导致 CPE 发来的 UDP 握手包被光猫丢弃,握手无法重连。

修复: 更新光猫映射规则。 后续建议:在上游设备中为 R5S 的 WAN MAC 绑定固定 IP,或者在 R5S WAN 口使用静态 IP。


4. 总结与建议

成功三要素

  1. 路由注入:务必确认 AllowedIPs 写全,并开启 Route Allowed IPs
  2. 保活机制:NAT 后的客户端必须配置 PersistentKeepalive
  3. 映射稳定性:作为服务端的内网地址必须固定,防止 DHCP 漂移导致入站流量丢失。

常用调试命令

1
2
3
4
5
6
7
8
9
# 查看握手状态与流量
wg show

# 检查特定网段的路由走向
ip route get <对端IP>

# 验证 Uci 配置
uci show network | grep wg0
uci show firewall | grep vpn

WireGuard 站点互联并不复杂,但在 OpenWrt 等高度可定制化的环境中,防火墙 Zone 的配置与上游 NAT 的配合往往是容易产生“坑”的地方。希望这份记录能为您在部署类似方案时提供参考。