Wireguard 不適用於 AllowedIps 中包含的 enpoint
我在我的伺服器上執行一個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
但我不想通過隧道路由所有流量。這樣做的正確方法是什麼?
您不能在客戶端
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 客戶端為您設置的預設值