[未解决] 双wg子网互联 [draft]title
2025-02-03date
最后一跳还没着落
description
恭喜你发现我的🌿稿一篇呀 🎉~
is draft
WARNING
本文所述方案不完善,可用的解决方案见这里

我有若干机器在公网,少数不在公网,我想让在公网的机器实现 full mesh 互联,不在公网的通过公网机器进行中转实现互相连接。由于是一次性工作所以忽略掉配置复杂度。

为了实现:

  1. 避免单点故障
  2. 在内网机器上可以通过指定地址选择中继路由到其它内网机器
  3. 任意公网机器可选通过指定地址从其它公网机器中转访问内网机器

我尝试使用如下最小拓扑:

  • 两个公网机器,通过wireguard互为对等节点,形成 full mesh。
  • 一个内网机器,单个网络接口具备两个wg内网地址,分别与两个公网机器peer,形成两个wg子网

两个公网机器用 A,B 表示,一个内网机器用 O 表示(?。

目前已经实现上述预期的1、2两点,但第三点未能实现,以下是最小配置:

主机对应的ip:

  • A: 10.0.4.1
  • B: 10.0.3.1
  • O: 10.0.4.2 和 10.0.3.2

接口配置

> cat wg0.netdev 
[NetDev]
Kind=wireguard
MTUBytes=1300
Name=wg0

[WireGuard]
ListenPort=51820
PrivateKeyFile=/run/vaultix/wgy

# peer O
[WireGuardPeer]
AllowedIPs=10.0.4.2/32
PersistentKeepalive=15
PublicKey=BCbrvvMIoHATydMkZtF8c+CHlCpKUy1NW+aP0GnYfRM=

# ...


# peer B
[WireGuardPeer]
AllowedIPs=10.0.3.0/24
Endpoint=172.234.92.148:51820
PersistentKeepalive=15
PublicKey=jQGcU+BULglJ9pUz/MmgOWhGRjpimogvEudwc8hMR0A=

网络配置

> cat 10-wg0.network 
[Match]
Name=wg0

[Network]
IPMasquerade=ipv4
IPv4Forwarding=true
Address=10.0.4.1/24

[Route]
Destination=10.0.3.0/24

接口配置

> cat wg0.netdev 
[NetDev]
Kind=wireguard
MTUBytes=1300
Name=wg0

[WireGuard]
ListenPort=51820
PrivateKeyFile=/run/vaultix/wgab

[WireGuardPeer]
AllowedIPs=10.0.3.2/32
PersistentKeepalive=15
PublicKey=BCbrvvMIoHATydMkZtF8c+CHlCpKUy1NW+aP0GnYfRM=

# peer A
[WireGuardPeer]
AllowedIPs=10.0.4.0/24
PersistentKeepalive=15
PublicKey=V3J9d8lUOk4WXj+dIiAZsuKJv3HxUl8J4HvX/s4eElY=

网络配置

> cat 10-wg0.network
[Match]
Name=wg0

[Network]
IPMasquerade=ipv4
IPv4Forwarding=true
Address=10.0.3.1/24

[Route]
Destination=10.0.4.0/24

接口配置

> cat wg0.netdev 
[NetDev]
Kind=wireguard
MTUBytes=1300
Name=wg0

[WireGuard]
PrivateKeyFile=/run/vaultix/wg

[WireGuardPeer]
AllowedIPs=10.0.3.0/24
Endpoint=172.234.92.148:51820
PersistentKeepalive=15
PublicKey=jQGcU+BULglJ9pUz/MmgOWhGRjpimogvEudwc8hMR0A=

[WireGuardPeer]
AllowedIPs=10.0.4.0/24
Endpoint=102.111.0.1:41822
PersistentKeepalive=15
PublicKey=V3J9d8lUOk4WXj+dIiAZsuKJv3HxUl8J4HvX/s4eElY=

网络配置

> cat 10-wg0.network
[Match]
Name=wg0

[Network]
DHCP=no
IPMasquerade=ipv4
IPv4Forwarding=true
Address=10.0.3.2/24
Address=10.0.4.2/24

如上所示,

AO,BO 已经成功组网并且能够正常使用,但是从A(10.0.4.1) ping O在BO子网的地址(10.0.3.2)并不联通,反之亦然。具体体现在:

10.0.4.1 ping 10.0.3.210.0.3.1的wg接口抓包显示出入站流量,但是诡异地有两个一组的ICMP Echo Request, 预期应该是一个ICMP Req 一个 Reply?

# 10.0.3.1 抓包
> sudo tcpdump -i wg0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on wg0, link-type RAW (Raw IP), snapshot length 262144 bytes
19:04:09.460114 IP 10.0.4.1 > 10.0.3.2: ICMP echo request, id 37, seq 8, length 64
19:04:09.460126 IP 10.0.4.1 > 10.0.3.2: ICMP echo request, id 37, seq 8, length 64
# 空行我自己加的
19:04:10.484178 IP 10.0.4.1 > 10.0.3.2: ICMP echo request, id 37, seq 9, length 64
19:04:10.484189 IP 10.0.4.1 > 10.0.3.2: ICMP echo request, id 37, seq 9, length 64

19:04:11.508106 IP 10.0.4.1 > 10.0.3.2: ICMP echo request, id 37, seq 10, length 64
19:04:11.508117 IP 10.0.4.1 > 10.0.3.2: ICMP echo request, id 37, seq 10, length 64
^C
6 packets captured
6 packets received by filter
0 packets dropped by kernel

因为预期是 4.1 -> 3.1 -> 3.2,但是数据在3.1就出现了异常,3.2上抓包没有任何结果。孩子被卡了两天了呜呜

以下是正常的 10.0.3.1 的子网机器ping它的抓包流量,作为对照:

19:08:25.054781 IP 10.0.3.3 > abhoth: ICMP echo request, id 4, seq 5, length 64
19:08:25.054798 IP abhoth > 10.0.3.3: ICMP echo reply, id 4, seq 5, length 64
keywords
All Systems Operational
©2018-2025 Secirian | CC BY-SA 4.0