Routing

Wireguard 使用一個客戶端作為另一個客戶端的網關

  • January 24, 2022

我有一個 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 以進行進一步路由。

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