WireGuard 公网 Peer 打通两个测试环境的私网
目前公司有两个测试环境,简单理解为:一个产品一个测试环境,服务器在阿里云的不同地域,所以他们的私网是不互通的。
有一个测试环境的域名直接解析到了它那个地域的私网 IP,从另一个环境根本访问不到。
之前的同事虽然在一台服务器上起过 VPN,但实在不好用 —— 不能两个人同时连,平常还得连着好几个 VPN 才能访问全部测试环境。
我们依旧是熟悉的 WireGuard,熟悉的 CentOS 7。
INFO
之前讲过怎么在 CentOS 7 上装 WireGuard,这里就不重复了:VPN怎么又双叒叕掉了,我直接换方案 - WireGuard 部署实录
那个老 VPN 就是之前修了一整天的 L2TP:修公司的VPN修了一整天
📌 网络拓扑
先看整体结构:
Windows 客户端(10.66.0.2)
|
v 原有用户 VPN:wg0
中心服务器
公网 EIP:<中心EIP>
私网 IP:172.29.216.127
wg0:10.66.0.1/24
wg-site:10.68.0.1/30,UDP 51821
|
v 公网 WireGuard Peer 隧道
目标服务器
公网 EIP:<目标服务器EIP>
私网 IP:172.18.225.251
wg-site:10.68.0.2/30,UDP 51821
|
v
目标业务站点:test.example.com -> 172.18.225.251
访问路径一句话:
10.66.0.2 -> <中心EIP> -> <目标服务器EIP> -> 172.18.225.251
WARNING
<目标服务器EIP> 与 172.18.225.251 是同一台目标服务器的公网 EIP 和私网 IP,并非两台机器。
规划好的网段如下:
| 项目 | 网段 / 地址 |
|---|---|
| 原有用户 VPN 网段 | 10.66.0.0/24 |
| 中心服务器原有接口 | wg0 / 10.66.0.1 |
| 示例 Windows 用户 | 10.66.0.2 |
| 站点隧道网段 | 10.68.0.0/30 |
| 中心服务器新接口 | wg-site / 10.68.0.1 |
| 目标服务器新接口 | wg-site / 10.68.0.2 |
| WireGuard UDP 端口 | 51821 |
| 目标业务地址 | 172.18.225.251/32 |
前置条件:
- 中心服务器已运行原有用户 WireGuard 接口
wg0 - 两台 ECS 均安装
wireguard内核模块、wg与wg-quick - 目标服务器 CentOS 7 使用外置 WireGuard 内核模块,不要求升级内核或重启服务器
- 两台 ECS 分别有可用公网 EIP
- 两端阿里云安全组放行 UDP 51821(测试阶段可临时允许
0.0.0.0/0,成功后应仅允许对端 EIP)
🔑 密钥生成
两台服务器各执行一次:
install -d -m 700 /etc/wireguard
umask 077
wg genkey | tee /etc/wireguard/site.key | wg pubkey > /etc/wireguard/site.pub
cat /etc/wireguard/site.pub
只交换 site.pub。
DANGER
私钥 site.key 不可发送、不可写入文档、不可出现在任何聊天和截图里。
🛠️ 中心服务器配置
文件:/etc/wireguard/wg-site.conf
[Interface]
Address = 10.68.0.1/30
ListenPort = 51821
PrivateKey = <中心服务器 site.key 内容>
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -I INPUT 1 -p udp --dport 51821 -j ACCEPT
PostUp = iptables -I FORWARD 1 -i wg0 -o wg-site -s 10.66.0.0/24 -d 172.18.225.251/32 -j ACCEPT
PostUp = iptables -I FORWARD 1 -i wg-site -o wg0 -s 172.18.225.251/32 -d 10.66.0.0/24 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
PostDown = iptables -D INPUT -p udp --dport 51821 -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -o wg-site -s 10.66.0.0/24 -d 172.18.225.251/32 -j ACCEPT
PostDown = iptables -D FORWARD -i wg-site -o wg0 -s 172.18.225.251/32 -d 10.66.0.0/24 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
[Peer]
PublicKey = <目标服务器 site.pub 内容>
AllowedIPs = 10.68.0.2/32, 172.18.225.251/32
TIP
中心服务器无需配置目标 Endpoint。目标服务器使用 PersistentKeepalive 主动连接后,中心会自动学习对端公网 endpoint。
🛠️ 目标服务器配置
文件:/etc/wireguard/wg-site.conf
[Interface]
Address = 10.68.0.2/30
ListenPort = 51821
PrivateKey = <目标服务器 site.key 内容>
# 允许原有用户 VPN 访问本机业务地址
PostUp = iptables -I INPUT 1 -i wg-site -s 10.66.0.0/24 -d 172.18.225.251/32 -j ACCEPT
PostDown = iptables -D INPUT -i wg-site -s 10.66.0.0/24 -d 172.18.225.251/32 -j ACCEPT
[Peer]
PublicKey = <中心服务器 site.pub 内容>
Endpoint = <中心EIP>:51821
AllowedIPs = 10.68.0.1/32, 10.66.0.0/24
PersistentKeepalive = 25
WARNING
目标服务器的 AllowedIPs 必须包含 10.66.0.0/24,否则 Windows 客户端的回包送不回中心服务器。
⚙️ 安全组与启动
两台 ECS 的阿里云安全组放行:
- 协议:UDP
- 端口:
51821
建议验证后收紧来源:
| 入方向服务器 | 允许来源 |
|---|---|
| 中心服务器 | <目标服务器EIP>/32 |
| 目标服务器 | <中心EIP>/32 |
两端分别启动新接口:
chmod 600 /etc/wireguard/wg-site.conf
systemctl enable --now wg-quick@wg-site
DANGER
不得重启原有用户接口,会中断所有 Windows 用户:
# 错误:会中断 Windows 用户
systemctl restart wg-quick@wg0
站点隧道需要重启时,只操作 systemctl restart wg-quick@wg-site。
✅ 验证
两端分别执行:
wg show wg-site
ip -4 addr show wg-site
systemctl status wg-quick@wg-site --no-pager
成功标志:
latest handshake: ... ago
transfer: ... received, ... sent
中心服务器上验证到业务地址的连通性:
ip route get 172.18.225.251
ping -c 3 172.18.225.251
curl -v --connect-timeout 5 http://172.18.225.251/
预期路由:
172.18.225.251 dev wg-site src 10.68.0.1
🖥️ Windows 客户端配置
Windows 客户端继续连接原有中心服务器,只需给原有 Peer 增加测试环境的业务地址:
AllowedIPs = 172.18.225.251/32, 172.29.216.126/32, 172.29.216.127/32
保存后执行「停用 -> 启用」,测试:
ping 172.18.225.251
curl.exe -v http://172.18.225.251/
curl.exe -v http://test.example.com/
如果业务端口不是 80,例如 83:
curl.exe -v http://test.example.com:83/
🔍 故障排查
Destination Host Unreachable
若中心服务器显示:
From 10.68.0.1 Destination Host Unreachable
ping: sendmsg: Destination address required
说明路由已指向 wg-site,但没有 Peer endpoint,即尚未完成握手。执行:
wg show wg-site
若无 endpoint、latest handshake、收发流量,先检查公网 UDP 放行和公钥。
目标服务器只有发送流量
transfer: 0 B received, 5.78 KiB sent
说明目标服务器已向中心发握手包,但没收到回包。优先检查中心服务器的阿里云安全组 UDP 51821。
中心服务器抓包:
tcpdump -nn -i any udp port 51821
目标服务器触发新握手:
systemctl restart wg-quick@wg-site
判断:
- 无 UDP 包:检查阿里云安全组、EIP、出口策略和端口配置
- 有 UDP 包但无握手:检查双方 Peer 公钥是否互填
- 有握手但网站不通:检查中心 FORWARD、目标服务器 INPUT、业务端口和服务监听地址
active (exited) 是否正常
正常。wg-quick 创建网络接口后退出,systemd 通常显示:
Active: active (exited)
实际运行状态以 wg show wg-site、接口地址和握手状态为准。
📝 总结
日常检查清单:
wg show wg-site
ip route get 172.18.225.251
ss -lunp | grep 51821
tcpdump -nn -i any udp port 51821
安全建议:
- 每台服务器、每位用户使用独立密钥对
/etc/wireguard权限建议为700,配置和私钥文件权限为600- 安全组验证后限制为固定对端 EIP
- Windows 客户端仅配置必要的
AllowedIPs,避免无意接管全部互联网流量
DANGER
若任何 WireGuard 私钥曾出现在聊天、工单、截图或代码仓库中,应立即轮换该密钥对。
