这是我本地网络上的拱门:
机器架构:
<wg_client_1 (int
工作组1)> ----- <(int
工作组1) wg_term_1 (int
工作组0 工作)> ----- <(int
组0) 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
),但我希望它们通过隧道进行通信。我使用网络中的地址通过 SSH 连接到计算机192.168.123.0/24
。 wg_client_1
我在(intwg1
) 和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
。
wg
这是命令的结果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
这是命令的结果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
这是命令的结果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.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
...wg_term_2
wg_term_1
IPv4 转发在和上启用wg_term_2
:
net.ipv4.ip_forward=1
任何人都可以解释发生了什么以及为什么流量没有正确路由?谢谢
答案1
更新:重写了这个答案的大部分内容,虽然它使OP的问题起作用,但使用了我更正的有缺陷的解释。当然,加密密钥关联在两个 WireGuard 接口之间是独立的,并且它们之间不交互。每个 WireGuard 接口仅在多个对等点之间存在交互,但 OP 每个接口仅使用一个对等点,因此此处不存在这一特定问题。
线卫士密钥路由是基于密钥的附加层路由,超出了内核的标准网络堆栈路由。在每个接口上,它将allowed-ips
与一个对等点相关联。它用于路由到正确的(多个)对等点以进行出口,并将数据包与给定的对等点相关联以进行入口,然后接受此数据包。所以要正确地沟通,就必须有正确的路线,和兼容的允许的 ipsWireGuard 接口上的条目。
没有写,但我认为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_1ping 10.241.0.2(即:wg_term_2),数据包为:
- 路由通过工作组1界面
- 加密路由到对等点工作组1其中目的地与其 allowed-ips 10.0.0.0/8 匹配
- 到达wg_term_1通过
UDP 192.168.123.23:49149 -> 192.168.123.21:51821
- 接受于工作组1因为源与其 allowed-ips 10.0.0.0/8 匹配
- 路由通过工作组0界面
- 加密路由到对等点工作组0其中目的地与其 allowed-ips 10.241.0.2/32 匹配
- 到达wg_term_2通过
UDP 192.168.123.21:51820 -> 192.168.123.22:51820
- 落在工作组0因为源与任何允许的 ip 不匹配,所以无法与对等方关联。
反过来,从wg_term_2到wg_client_1(仍然是正确的路线,但不是正确的允许的 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的工作组0的对等方允许的 ip:
# 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
在这种特定情况下,可以有一个 WireGuard 接口wg_term_1与两个同行,但应该小心地写出最小的允许的 ips每个对等点的条目:一侧为 10.242.0.0/24(而不是 10.0.0.0/8),另一侧为 10.241.0.0/24,10.243.0.0/24:与较窄范围胜过较宽范围的路由相反, WireGuard 的加密路由不接受任何重叠。