NAT环境下借助WireGuard实现跨站点网络访问的可行性及配置方案咨询
NAT环境下借助WireGuard实现跨站点网络访问的可行性及配置方案咨询
嘿,你的思路完全靠谱!用一台云服务器(也就是你说的Site C)作为中间中转节点,打通Site A和NAT后的Site B的WireGuard连接,这正是解决这类场景的标准方案——业内常叫它WireGuard的中转(Relay)模式,配置起来其实没你想的那么复杂,我给你一步步拆解:
核心逻辑先理清楚
因为Site B在NAT后面没法主动接收外部连接,所以让Site B主动连到有公网IP的Site C上,保持一个持久连接(防止NAT映射超时失效);同时Site A也连到Site C,这样Site C就相当于一个“桥梁”,把Site A和Site B的流量转发给对方,最终实现Site A通过Site B上网的需求。
具体配置步骤
1. 先搞定Site C(云服务器)的WireGuard配置
Site C需要有公网IP,并且开放UDP端口51820(WireGuard默认端口,也可以自己修改)。先生成密钥对:
wg genkey | tee sitec_private.key | wg pubkey > sitec_public.key
然后创建配置文件/etc/wireguard/wg0.conf:
[Interface] PrivateKey = <Site C的私钥(从sitec_private.key里复制)> Address = 10.0.0.1/24 # 给Site C分配一个私有网段的IP ListenPort = 51820 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE SaveConfig = true # Site A的Peer配置 [Peer] PublicKey = <Site A的公钥> AllowedIPs = 10.0.0.2/32 # Site A的WireGuard私有IP # Site B的Peer配置 [Peer] PublicKey = <Site B的公钥> AllowedIPs = 10.0.0.3/32 # Site B的WireGuard私有IP
启动并设置开机自启:
wg-quick up wg0 systemctl enable wg-quick@wg0
2. 配置Site B(NAT后的节点)的WireGuard
同样先生成密钥对:
wg genkey | tee siteb_private.key | wg pubkey > siteb_public.key
创建配置文件/etc/wireguard/wg0.conf:
[Interface] PrivateKey = <Site B的私钥> Address = 10.0.0.3/24 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE SaveConfig = true [Peer] PublicKey = <Site C的公钥> Endpoint = <Site C的公网IP>:51820 # 主动连到Site C AllowedIPs = 10.0.0.0/24, 0.0.0.0/0, ::/0 # 允许接收Site C、Site A的流量,以及所有上网流量 PersistentKeepalive = 25 # 关键!每25秒发个包保持NAT映射不失效
启动并自启,同时开启IP转发:
wg-quick up wg0 systemctl enable wg-quick@wg0 sysctl -w net.ipv4.ip_forward=1 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf # 持久化配置
3. 配置Site A(当前所在节点)的WireGuard
生成密钥对:
wg genkey | tee sitea_private.key | wg pubkey > sitea_public.key
创建配置文件/etc/wireguard/wg0.conf:
[Interface] PrivateKey = <Site A的私钥> Address = 10.0.0.2/24 SaveConfig = true [Peer] PublicKey = <Site C的公钥> Endpoint = <Site C的公网IP>:51820 AllowedIPs = 0.0.0.0/0, ::/0 # 所有流量都通过WireGuard转发(也就是走Site B的网络) PersistentKeepalive = 25
启动并自启,同样开启IP转发:
wg-quick up wg0 systemctl enable wg-quick@wg0 sysctl -w net.ipv4.ip_forward=1 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
关键注意事项
- 三个节点的公钥要互相配对:Site C的配置里要加Site A和Site B的公钥,Site A和Site B的配置里要加Site C的公钥,别搞混了。
- Site C的云服务商安全组和服务器防火墙一定要开放UDP 51820端口,不然连不上。
- 如果只想让特定流量走Site B,而不是全部上网流量,可以修改Site A的
AllowedIPs,比如只写Site B的内网网段+需要访问的特定外网IP段。 - 如果Site B的NAT是对称型的(大部分运营商家庭宽带都是这种),中转模式是唯一可靠的方案,别尝试打洞了,成功率极低。
备注:内容来源于stack exchange,提问作者David




