Networking

2個wireguards隧道之間的路由流量

  • August 25, 2020

這是我在本地網路上的拱門:

機器架構:

<wg_client_1 (intwg1 )> ----- <(intwg1 ) wg_term_1 (intwg0 )> ----- <(intwg0) wg_term_2 (int eth2)>

網路架構:

<||wg_client_1|| (int wg1 : 10.242.0.2)(10.242.0.0/24 network)> ----- <(int wg1 : 10.242.0.1)(10.242.0.0/24 network)||wg_term_1||(int wg0 : 10.241.0.1)(10.241.0.0/24 network)> ----- <(int wg0 : 10.241.0.2)(10.241.0.0/24 network) ||wg_term_2|| (int eth2 :10.243.0.1) (10.243.0.0/24 network)>

  • 所有機器都是我本地網路上的虛擬機
  • 所有機器都有“真實”地址(192.168.123.0/24),但我希望它們通過隧道進行通信。我使用它們在192.168.123.0/24網路中的地址通過 SSH 連接到機器上。
  • 我在wg_client_1(int wg1) 和 wg_term_1(int wg1) 之間建立了一條隧道。隧道正在工作。wg_term_1能ping通10.242.0.2,也wg_client_1能ping通10.242.0.1
  • 我已經在wg_term_1和之間建立了一條隧道wg_term_2。這條隧道也在工作。wg_term_1能ping通10.241.0.2,也wg_term_2能ping通10.241.0.1

以下是wgon 命令的結果wg_client_1

# wg
interface: wg1
 public key: yQO6xpv+3HC+xTyfxzC503vr+E84VBnphntfwFJXREA=
 private key: (hidden)
 listening port: 49149

peer: CywdYs8L0TD7zLvMqHnqL/N2WoqRmDuDvn6skg+8wUc=
 endpoint: 192.168.123.21:51821
 allowed ips: 10.0.0.0/8
 latest handshake: 8 seconds ago
 transfer: 11.39 KiB received, 236.84 KiB sent

以下是wgon 命令的結果wg_term_1

# wg
interface: wg1
 public key: CywdYs8L0TD7zLvMqHnqL/N2WoqRmDuDvn6skg+8wUc=
 private key: (hidden)
 listening port: 51821

peer: yQO6xpv+3HC+xTyfxzC503vr+E84VBnphntfwFJXREA=
 endpoint: 192.168.123.23:49149
 allowed ips: 10.0.0.0/8
 latest handshake: 58 seconds ago
 transfer: 236.84 KiB received, 11.43 KiB sent

interface: wg0
 public key: HGF89Hcphaf+Uua214hSc/mZa/p2vmIUeT6IwrN7I3Y=
 private key: (hidden)
 listening port: 51820

peer: +xTyPmYo9+IPBC72MFzIWFHrQyz5N6v67rjZz3q5CR4=
 endpoint: 192.168.123.22:51820
 allowed ips: 10.241.0.2/32
 latest handshake: 17 seconds ago
 transfer: 10.03 KiB received, 233.33 KiB sent
 persistent keepalive: every 25 seconds

以下是wgon 命令的結果wg_term_2

# wg
interface: wg0
 public key: +xTyPmYo9+IPBC72MFzIWFHrQyz5N6v67rjZz3q5CR4=
 private key: (hidden)
 listening port: 51820

peer: HGF89Hcphaf+Uua214hSc/mZa/p2vmIUeT6IwrN7I3Y=
 endpoint: 192.168.123.21:51820
 allowed ips: 10.241.0.1/32
 latest handshake: 1 minute, 3 seconds ago
 transfer: 1.23 KiB received, 6.79 KiB sent
 persistent keepalive: every 25 seconds

現在,我想10.242.0.0/24在第二條隧道(介於wg_term_1和之間)中路由客戶端網路流量 ( wg_term_2)。我希望wg_client_1( 10.242.0.1) 可以 ping wg_term_2(10.241.0.210.243.0.1)。

所以我將這些路由添加到 wg_client_1 :

ip route add 10.241.0.0/24 via 10.242.0.1
ip route add 10.243.0.0/24 via 10.242.0.1

這些路由到 wg_term_1 :

ip route add 10.242.0.0/24 via 10.242.0.1
ip route add 10.241.0.0/24 via 10.241.0.2
ip route add 10.243.0.0/24 via 10.241.0.2

但是當我做ping 10.241.0.2from時wg_client_1,它不起作用。這是 wg_term_1 上的 tcpdump:

# tcpdump -i wg0 -i wg1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wg1, link-type RAW (Raw IP), capture size 262144 bytes
03:58:31.451778 IP 10.242.0.2 > 10.241.0.2: ICMP echo request, id 432, seq 1, length 64
03:58:32.464024 IP 10.242.0.2 > 10.241.0.2: ICMP echo request, id 432, seq 2, length 64
03:58:33.488174 IP 10.242.0.2 > 10.241.0.2: ICMP echo request, id 432, seq 3, length 64

並且tcpdumponwg_term_2沒有顯示任何內容……所以流量沒有路由……

wg_term_1IPv4 轉發在和上啟用wg_term_2net.ipv4.ip_forward=1

誰能解釋發生了什麼以及為什麼流量沒有正確路由?謝謝

更新:重寫了這個答案的大部分內容,雖然它使 OP 的問題起作用,但使用了我糾正的有缺陷的解釋。加密密鑰關聯當然在兩個 WireGuard 介面之間是獨立的,並且它們之間不互動。每個 WireGuard 介面僅在多個對等點之間進行互動,但 OP 每個介面僅使用一個對等點,因此這裡沒有這個特定問題。

WireGuard 的加密密鑰路由是基於密鑰的附加路由層,超出了核心的標準網路堆棧路由。在每個介面上,它將allowed-ips與對等點相關聯。它用於路由到正確的(多個)對等點以進行出口,也用於將數據包與給定的對等點關聯以進行入口,然後接受此數據包。因此,要正確通信,必須在 WireGuard 介面上有正確的路由兼容的 allowed-ips條目。

它沒有寫出來,但我假設 OP 還在 wg_term_2 上添加一條到wg_client_1的 LAN 的路由,例如:

10.242.0.0/24 via 10.241.0.1 dev wg0 

或者簡單地說(因為它是第 3 層隧道,所以不需要網關):

10.242.0.0/24 dev wg0

wg_client_1 ping 10.241.0.2 (即:wg_term_2)時,數據包是:

  • 通過wg1介面路由
  • 加密路由到wg1上的對等點,其中目的地與其允許的 ips 10.0.0.0/8 匹配
  • 通過到達wg_term_1UDP 192.168.123.23:49149 -> 192.168.123.21:51821
  • 在wg1上接受,因為源匹配其 allowed-ips 10.0.0.0/8
  • 通過wg0介面路由
  • 加密路由到wg0上的對等點,其中目的地與其允許的 ips 10.241.0.2/32 匹配
  • 通過到達wg_term_2UDP 192.168.123.21:51820 -> 192.168.123.22:51820
  • wg0上刪除,因為源不匹配任何允許的 ip,因此無法與對等點關聯。

相反,從wg_term_2wg_client_1(仍然具有正確的路由但不是正確的allowed-ips)在此處生成特定錯誤:

# ip route get 10.242.0.2
10.242.0.2 via 10.241.0.1 dev wg0 src 10.241.0.2 uid 0 
   cache 
# ping 10.242.0.2
PING 10.242.0.2 (10.242.0.2) 56(84) bytes of data.
From 10.241.0.2 icmp_seq=1 Destination Host Unreachable
ping: sendmsg: Required key not available
^C
--- 10.242.0.2 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

完成這項工作所需的唯一最小設置是將wg_client_1的 IP 地址添加到wg_term_2wg0的對等允許的 ips 上:

# wg set wg0 peer HGF89Hcphaf+Uua214hSc/mZa/p2vmIUeT6IwrN7I3Y= \
   allowed-ips 10.241.0.1/32,10.242.0.2/32

可能會允許所涉及的 LAN:

# wg set wg0 peer HGF89Hcphaf+Uua214hSc/mZa/p2vmIUeT6IwrN7I3Y= \
    allowed-ips 10.241.0.0/24,10.242.0.0/24

並完成設置和加密路由 10.243.0.0/24 LAN,這可以在wg_term_1上設置(也將以前的 /32 重寫為 /24):

# wg set wg0 peer +xTyPmYo9+IPBC72MFzIWFHrQyz5N6v67rjZz3q5CR4= \
    allowed-ips 10.241.0.0/24,10.243.0.0/24

在這種特定情況下,可能有可能在 wg_term_1 上有一個帶有兩個對等點的 WireGuard 介面*,但是應該注意為每個對等點寫入最小的允許 ips*條目:10.242.0.0/24(而不是 10.0.0.0)。 0.0/8) 在一側和 10.241.0.0/24,10.243.0.0/24 在另一側:與較窄範圍勝過較寬範圍的路由相反,WireGuard 的加密路由不接受任何重疊。

引用自:https://unix.stackexchange.com/questions/561816