2 个wireguards 隧道之间的路由流量

2 个wireguards 隧道之间的路由流量

这是我本地网络上的拱门:

机器架构:

<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我在(int wg1) 和 wg_term_1(int )之间建立了一条隧道wg1。隧道正在运作。wg_term_1能ping通10.242.0.2,还能wg_client_1ping通10.242.0.1
  • wg_term_1我在和之间建立了一条隧道wg_term_2。这条隧道也正在运作。wg_term_1能ping通10.241.0.2,还能wg_term_2ping通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.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

并且没有显示任何内容...因此流量没有被路由tcpdump...wg_term_2

wg_term_1IPv4 转发在和上启用wg_term_2net.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_2wg_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 的加密路由不接受任何重叠。

相关内容