从 wg1 到 wg0 的 Wireguard 路由

从 wg1 到 wg0 的 Wireguard 路由

我有两个使用 Wireguard 配置的网络。wg0 用于服务器,wg1 用于 VPN 用户。当 wg1 上的 VPN 用户想要访问 wg0 网络时,数据包应该通过其中一个 wg0 服务器(VPN 网关)进行路由。

VPN 网关和所有具有 wg0 接口的服务器上的 wg0.conf

[Interface]
Address = 10.1.0.15
ListenPort = 51820
PrivateKey = privatekey1

# node23
[Peer]
PublicKey = pubkey
AllowedIps = 10.1.0.23
Endpoint = node23.fqdn:51820

# node24
[Peer]
PublicKey = pubkey
AllowedIps = 10.1.0.24
Endpoint = node24:51820

# node25
[Peer]
PublicKey = pubkey
AllowedIps = 10.1.0.25
Endpoint = node25.fqdn:51820
...

VPN 网关上的 wg1.conf

[Interface]
Address = 10.100.0.1/32
ListenPort = 51810
PrivateKey = privatekey2

PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# user1    [Peer]
PublicKey = pubkey
AllowedIps =  10.100.0.2/32
...

这是用户 wg1.conf(实际上是 wg0,因为他们没有 10.1.0.0 地址)

[Interface]
Address = 10.100.0.2/32
ListenPort = 21841
PrivateKey = myprivatekey

[Peer]
PublicKey = pubkey
EndPoint = vpngate.fqdn:51810
AllowedIPs = 0.0.0.0/0

PersistentKeepalive = 25

因此,我可以在 VPN gate 本身上运行curl -v http://10.1.0.23/,并在 wg0 网络内收到响应。Ping 也可以正常工作。我可以访问网络内的所有服务器。wg1-client 和 wg1-server 也是如此。我还可以通过 VPN gate 浏览互联网。但是,当我尝试从 wg1-client 调用 wg0-server 时,curl -v http://10.1.0.23/它应该通过 vpn-gate 路由(我认为),然后从那里通过 wg1 -> wg0,但没有响应。

我错过了什么?

答案1

通过阅读 WireGuard 的密钥路由解释:

在服务器配置中,每个对等体(客户端)都能够将数据包发送到网络接口,其源 IP 与其相应的允许 IP 列表相匹配。例如,当服务器从对等体 gN65BkIK... 收到数据包时,在解密和验证后,如果其源 IP 为 10.10.10.230,则允许该数据包进入接口;否则,该数据包将被丢弃。

=> 一个传入地址必须在AllowedIPs与 Peers 中定义的加密密钥相关联并被允许。

在服务器配置中,当网络接口想要将数据包发送到对等方(客户端)时,它会查看该数据包的目标 IP,并将其与每个对等方的允许 IP 列表进行比较,以确定将其发送到哪个对等方。例如,如果要求网络接口发送目标 IP 为 10.10.10.230 的数据包,它将使用对等方 gN65BkIK... 的公钥对其进行加密,然后将其发送到该对等方最近的 Internet 端点。

=> 同样,传出地址必须在其中,AllowedIPs这样才能选择正确的加密密钥及其对等当前远程端点。

当客户端运行时curl -v http://10.1.0.23/,传出的数据包会执行以下操作:

10.100.0.2  ----> ✔ 10.100.0.1 ==> 10.1.0.1  ----> ❌ 10.1.0.23
        wg0       wg1                    wg0       wg0
client                     gateway                   server

10.100.0.2 不在服务器的WG0AllowedIPs为网关对等体条目,因此数据包被丢弃。

同样,如果服务器尝试访问客户端(其路由已正确配置为使用WG0),它无法找到与目标地址匹配的对等体,因此在发送时会收到错误(该错误作为网络系统调用返回的错误,可能是 WireGuard 特有的:(ENOKEY必需的密钥不可用))。

因此,如果客户端都在 10.100.0.0/24 中,则它们必须出现在网关的 Peer 部分的每个服务器配置中,在条目中AllowedIPs。因此,如果网关的地址是 10.1.0.1(在 OP 中找不到此信息),则服务器都应包含类似以下内容:

# gateway
[Peer]
PublicKey = pubkey
AllowedIPs = 10.1.0.1,10.100.0.0/24
Endpoint = vpngate.fqdn:51820

反向不会有问题,因为客户端已配置为关联任何接收 IP 地址WG0到网关。

网关本身不需要改变任何配置。

相关内容