Wireguard 无法与 AllowedIps 中包含的 enpoint 配合使用

Wireguard 无法与 AllowedIps 中包含的 enpoint 配合使用

我在我的服务器上运行一个 wireguard enpoint 作为 docker 容器,并通过 roadwarrior 客户端通过 LTE 连接到它:

wireguard 网络图

真实服务器地址为静态公网IP,客户端配置如下(不涉及部分除外):

[Interface]
Address = 10.254.99.2

[Peer]
AllowedIps = 10.254.99.1/32
Endpoint = 192.168.5.55

如果我从 docker 容器内 ping 客户端,则此操作正常。但由于我还想从 docker 主机访问客户端,因此我在服务器上添加了一条路由:

ip route add 10.254.99.0/24 via 172.17.0.2 dev docker0 src 192.168.5.55

因此,我将src地址添加到服务器上的 AllowedIps 列表中:

[Peer]
AllowedIps = 10.254.99.1/32, 192.168.5.55/32

这样一来,所有东西都停止工作了。我无法再从服务器或容器内 ping 客户端。如果我改为允许客户端上的所有 IP,则一切都按预期工作:

[Peer]
AllowedIps = 0.0.0.0/0

但我不想让所有流量都通过隧道。正确的做法是什么?

答案1

您不能在客户端EndpointAllowedIPs设置中使用相同的地址*。Endpoint应该是服务器的地址外部隧道,并AllowedIPs应包括您想要访问的所有地址里面隧道。

要修复此问题,请删除src添加到服务器的路由上的设置,以便路由仅使用服务器docker0接口的地址:

ip route add 10.254.99.0/24 via 172.17.0.2 dev docker0

然后更改 WireGuard 客户端的AllowedIPs设置以包含服务器docker0接口的地址(172.17.0.1):

AllowedIps = 10.254.99.1/32, 172.17.0.1/32

您的服务器现在将使用其docker0接口地址(172.17.0.1)作为通过 WireGuard 网络发送的数据包的源。


但是,与其在服务器上添加额外的路由层,最简单的做法是在“主机”网络模式下运行 WireGuard 容器(使用--network=host标记docker run,或network_mode: host设置docker-compose)。这样可以将 WireGuard 容器的wg0接口直接暴露给主机,这样你就不需要在服务器上添加额外的路由规则,也不需要AllowedIPs在客户端添加额外的路由规则。

在这种情况下,服务器只会使用 WireGuard 接口自己的10.254.99.1地址作为通过 WireGuard 网络发送的数据包的源。


* 除非你在客户端上设置了一些特殊的数据包路由/过滤规则,而不是使用 WireGuard 客户端为你设置的默认规则

相关内容