2個wireguards隧道之間的路由流量
這是我在本地網路上的拱門:
機器架構:
<wg_client_1 (int
wg1)> ----- <(int
wg1) wg_term_1 (int
wg0)> ----- <(int
wg0) 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
(intwg1
) 和wg_term_1
(intwg1
) 之間建立了一條隧道。隧道正在工作。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
。以下是
wg
on 命令的結果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
以下是
wg
on 命令的結果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
以下是
wg
on 命令的結果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
) 可以 pingwg_term_2
(10.241.0.2
或10.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.2
from時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
並且
tcpdump
onwg_term_2
沒有顯示任何內容……所以流量沒有路由……
wg_term_1
IPv4 轉發在和上啟用wg_term_2
:net.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_1
UDP 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_2
UDP 192.168.123.21:51820 -> 192.168.123.22:51820
- 在wg0上刪除,因為源不匹配任何允許的 ip,因此無法與對等點關聯。
相反,從wg_term_2到wg_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_2的wg0的對等允許的 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 的加密路由不接受任何重疊。