Wireguard 使用一個客戶端作為另一個客戶端的網關
我有一個 Wireguard VPN 設置,基本上如下所示:
P1 ---- S ---- P2 --- Internet
IP地址:
P1 = 10.200.1.5
S = 10.200.1.1
P2 = 10.200.1.3
我通過
allowedIps = 0.0.0.0/0
在 P1 的客戶端配置中指定將 P1 的所有流量重定向到 S。現在我希望 S 將流量路由到 P2。我在 S 上嘗試了以下操作:
ip rule add from 10.200.1.5 lookup 200 ip route add default via 10.200.1.3 dev wg0 table 200 sysctl -w net.ipv4.ip_forward=1
但是,當我在 P2 上執行 tcpdump 時,我看不到任何流量進入。P1 也沒有遇到任何網際網路連接。
編輯:通過 S 測試自定義路由表
ip route get 8.8.8.8 from 10.200.1.5 iif wg0
給出以下響應
8.8.8.8 from 10.200.1.5 via 10.200.1.3 dev wg0 table 200 cache iif wg0
然而,這似乎很好
tcpdump -nn -i wg0
顯示
S
無法訪問,如下所示09:58:22.207251 IP 10.200.1.5.9134 > 8.8.8.8.53: 36555+ A? play.googleapis.com. (37) 09:58:22.207270 IP 10.200.1.1 > 10.200.1.5: ICMP host 8.8.8.8 unreachable, length 73
WireGuard 是第 3 層介面,因此這樣的聲明
via 10.200.1.3
無效,因為它將用於鏈路層協議(通常是 ARP)來解析此處不存在的第 2 層地址。所以
ip route add default via 10.200.1.3 dev wg0 table 200
可以重寫:
ip route add default dev wg0 table 200
這有助於記住這部分不是選擇數據包到 P1 或 P2 的部分:WireGuard 也有自己的內部路由:cryptokey -routing,這是通過
AllowedIPs
在每個對等點的配置中正確設置來完成的。有一個重要限制:與標準路由相反,AllowedIPs
不支持任何重疊地址。如果嘗試這樣做(例如在伺服器 S 上AllowedIPs = 0.0.0.0/0
為 Peer P2 設置),這將自動擦除(該)其他對等點上的衝突地址(例如AllowedIPs = 10.200.1.5
從 Peer P1 擦除,因為0.0.0.0/0
與其他任何東西重疊)並且連接將受到影響( S 不會將任何內容加密路由到 P1:不再連接)。有兩種方法可以解決這個問題:
- 使用兩個不同的 WireGuard 介面
之前的限制是針對每個 WireGuard 介面的。使用第二個介面可以避免這種衝突,但會使路由更加複雜。現在在路由表200和/或主表中可能需要多個條目:一個用於左側介面,一個(預設)用於右側介面。
- 對沖突的範圍進行一組減法
實際上可能有工具能夠計算集合 0.0.0.0/0 和集合 10.200.1.5 之間的差異,但我不知道它們。還有一個名為
netmask
(首頁:https ://github.com/tlby/netmask )的方便工具,它有助於將範圍轉換為最小的網路遮罩集:$ netmask 0.0.0.0:9.255.255.255 10.200.1.3 11.0.0.0:255.255.255.255 0.0.0.0/5 8.0.0.0/7 10.200.1.3/32 11.0.0.0/8 12.0.0.0/6 16.0.0.0/4 32.0.0.0/3 64.0.0.0/2 128.0.0.0/1
這些是應該在伺服器 S 上用於對等 P2 的值(用逗號分隔),
AllowedIPs
因此加密密鑰路由將在那里路由任何東西,除了 10.0.0.0/8,其中只有 10.200.1.3 將在 P2 端定義,在 P1 一側保留已定義的 10.200.1.5:不再有重疊。P1 發送到 Internet 的數據包現在應該繼續到 P2 以進行進一步路由。