我在我的服务器上运行一个 wireguard enpoint 作为 docker 容器,并通过 roadwarrior 客户端通过 LTE 连接到它:
真实服务器地址为静态公网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
您不能在客户端Endpoint
和AllowedIPs
设置中使用相同的地址*。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 客户端为你设置的默认规则