You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动