Wireguard

Wireguard 不適用於 AllowedIps 中包含的 enpoint

  • November 12, 2021

我在我的伺服器上執行一個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 客戶端。如果我允許客戶端上的所有 Ips,一切都會按預期工作:

[Peer]
AllowedIps = 0.0.0.0/0

但我不想通過隧道路由所有流量。這樣做的正確方法是什麼?

您不能在客戶端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 客戶端為您設置的預設值

引用自:https://serverfault.com/questions/1083016