Wireguard 站点到站点接口和 Internet 之间的路由

Wireguard 站点到站点接口和 Internet 之间的路由

我有一个 Linux VPS,用作两个使用 iptables 和 Wireguard VPN 隧道的站点的互联网网关。虽然两个站点通过 VPS 的互联网访问都正常,但我无法从站点 B 访问站点 A,反之亦然。当前的配置是:

VPS:
wg0 - 10.10.0.0/31 (----> Site A wg0 10.10.0.1/31)
wg1 - 10.20.0.0/31 (----> Site B wg0 10.20.0.1/31)
eth0 - Internet (public IP)

Site A Router:
wg0 - 10.10.0.1/31 (----> VPS wg0 10.10.0.0/31)
eth0 - 172.16.10.0/24 (local lan)
eth1 - Internet (carrier grade NAT)

Site B Router:
wg0 - 10.20.0.1/31 (---- > VPS wg1 10.20.0.0/31)
eth0 - 172.16.20.0/24 (local lan)
eth1 - Internet (carrier grade NAT)

VPS wg0.conf:

[Interface]
Address = 10.10.0.0/31
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ListenPort = 60174
PostUp = iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# BEGIN_PEER SITE A
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PresharedKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.10.0.0/31, 172.16.10.0/24
# END_PEER SITE A

VPS wg1.conf:

[Interface]
Address = 10.20.0.0/31
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ListenPort = 60175
PostUp = iptables -A FORWARD -i eth0 -o wg1 -j ACCEPT; iptables -A FORWARD -i wg1 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i eth0 -o wg1 -j ACCEPT; iptables -D FORWARD -i wg1 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# BEGIN_PEER SITE B
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PresharedKey = Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.20.0.0/31, 172.16.20.0/24
# END_PEER SITE B

VPS iptables 配置:

# Generated by iptables-save v1.8.7 
*filter
:INPUT DROP [215:23625]
:FORWARD DROP [21:1140]
:OUTPUT ACCEPT [20568:6762867]
-A INPUT -p udp -m udp --dport 60174 -j ACCEPT
-A INPUT -p udp -m udp --dport 60175 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o wg1 -j ACCEPT
-A FORWARD -i eth0 -o wg0 -j ACCEPT
-A FORWARD -i wg1 -j ACCEPT
-A FORWARD -i wg0 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on 
# Generated by iptables-save v1.8.7 
*nat
:PREROUTING ACCEPT [2094:151039]
:INPUT ACCEPT [7:501]
:OUTPUT ACCEPT [12:841]
:POSTROUTING ACCEPT [870:73441]
-A POSTROUTING -o eth0 -j MASQUERADE

站点 A wg0.conf:

[Interface]
Address = 10.10.0.1/31
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# BEGIN_PEER VPS
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PresharedKey = Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 0.0.0.0/0

站点 B wg0.conf:

[Interface]
Address = 10.20.0.1/31
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# BEGIN_PEER VPS
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PresharedKey = Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 0.0.0.0/0

VPS 上启用 IP 转发。

我可以从站点 A ping 到 VPS (10.20.0.0) 上的 wg1,但无法 ping 站点 B 隧道的另一端 (10.20.0.1) 或站点 B 的 LAN 上的任何内容。反之亦然:I可以从站点 B ping 到 VPS 上的 wg0 (10.10.0.0),但无法 ping 站点 A 隧道的另一端 (10.10.0.1) 或站点 A 的 LAN 上的任何内容。我目前的防火墙完全打开在 wg 接口上进行测试,所以我知道它没有被阻止,这是一个路由问题。从 VPS 本身,我可以 ping 通隧道的另一端以及两个站点上的 LAN。问题似乎只是 VPS wg 接口之间的路由。

VPS 上允许的 IP 的 wg0.conf 包括 172.16.10.0/24 和 10.10.0.1/31,因此我无法将它们设置为 wg1.conf 中允许的,反之亦然。

我看到的所有其他指南都是针对作为单个主机的 Wireguard 对等点,而不是对等点作为另一个网络的路由器。

我猜是允许的 IP 造成了问题,但不确定。我猜测修复它的方法很简单,比如 VPS 上的 wg 接口之间的 NAT,以某种方式使用 FwMark 标签,使用不同的路由表,或者将 wg 接口放入不同的网络命名空间,但我不确定什么是最好的途径往下走。

答案1

PersistentKeepalive您可能只需要在站点 A 和 B 路由器上的 WireGuard 配置中添加一个设置:

[Interface]
Address = 10.10.0.1/31
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# BEGIN_PEER VPS
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PresharedKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 0.0.0.0/0
Endpoint = vps.example.com:60174
PersistentKeepalive = 25

这将导致 WireGuard 每 25 秒从路由器向您的 VPS 发送一个保活数据包,通过路由器和 VPS 之间的 CGNAT 保持开放连接,从而允许 VPS 以其他方式发送流量。

答案2

事实证明我想得太多了,让事情变得比必要的更加复杂。

我不需要 VPS 上的 2 个 wg 接口。我将其减少到 1,将两个站点配置为对等点,并将相关的允许网络添加到每个对等点。

相关内容