我有两个使用 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 网关本身上运行curl -v http://10.1.0.23/
,并且在 wg0 网络中得到响应。平工作到。我可以访问网络内的所有服务器。wg1-client 和 wg1-server 也是如此。我也可以通过 VPN 网关浏览互联网。但是,当我尝试从我的 wg1-client 调用 wg0-server 时curl -v http://10.1.0.23/
,应该是路由(我认为)通过 vpn-gate 并从那里通过 wg1 -> wg0 没有响应。
我想念什么?
通过阅读 WireGuard 的Cryptokey Routing解释:
=>传入地址必须
AllowedIPs
与 Peers 中定义的加密密钥相关联并允许。=> 同样,传出地址必须在其中,
AllowedIPs
以便可以选择正确的加密密钥及其对等当前远程端点。当客户端运行
curl -v http://10.1.0.23/
时,传出的数据包会:10.100.0.2 不在网关 Peer 条目的服务器 wg0 中,因此数据包被丢弃。
AllowedIPs
同样,如果服务器尝试访问客户端(其路由已正确配置为使用wg0),它将找不到与目标地址匹配的 Peer,因此在发送时会收到错误(错误,作为网络返回的错误系统调用,可能特定于 WireGuard:(
ENOKEY
必需的密钥不可用))。因此,如果客户端都在 10.100.0.0/24 中,则它们必须出现在网关的 Peer 部分的每个服务器的配置中,在
AllowedIPs
条目中。因此,如果网关的地址是 10.1.0.1(在 OP 中找不到此信息),则服务器都应包含类似于以下内容的内容:反向不会有问题,因为客户端配置为将wg0上收到的任何IP关联到网关。
网关本身不必更改任何配置。