公共网络和本地网络之间的 Wireguard 网格

公共网络和本地网络之间的 Wireguard 网格

我目前的网格设置如下: 在此处输入图片描述

每个节点上的 wireguard 配置与此类似:

[Interface]
Address = 10.1.0.1/32
PrivateKey =
ListenPort = 5888

[Peer] # example public node [1-3]
PublicKey =
AllowedIPs = 10.1.0.2/32
Endpoint = X.X.X.X:5888
PersistentKeepalive = 25

[Peer] # example node behind cgnat [4-6]
PublicKey = 
AllowedIPs = 10.1.0.51/32
PersistentKeepalive = 25

这样我就可以 ping 上图中的所有绿线。但我无法 ping CGNAT 中节点之间的任何红线。我该怎么做?


尝试 1 (无Node3)

例如 CGNAT ( Node4)

[Interface] # NODE 4
Address = 10.3.0.3/32
PrivateKey = 

[Peer] # NODE 1, 5 & 6
PublicKey = 
AllowedIPs = 10.3.0.1/32,10.3.0.51/32,10.3.0.52/32
Endpoint = X.X.X.X:5888
PersistentKeepalive = 25

[Peer] # NODE 2
PublicKey = 
AllowedIPs = 10.3.0.2/32
Endpoint = X.X.X.Y:5888
PersistentKeepalive = 25

示例公共端点 ( Node1)

[Interface] # NODE 1
Address = 10.3.0.1/32
PrivateKey = 
ListenPort = 5888

[Peer] # NODE 5
PublicKey = 
AllowedIPs = 10.3.0.51/32
PersistentKeepalive = 25

[Peer] # NODE 6
PublicKey = 
AllowedIPs = 10.3.0.52/32
PersistentKeepalive = 25

[Peer] # NODE 2
PublicKey = 
AllowedIPs = 10.3.0.2/32
Endpoint = X.X.X.Y:5888
PersistentKeepalive = 25

[Peer] # NODE 4
PublicKey = 
AllowedIPs = 10.3.0.3/32
PersistentKeepalive = 25

我也曾跑过Node1

$ sysctl -w net.ipv4.ip_forward=1
$ sysctl -w net.ipv4.conf.maxnet.forwarding=1

maxnet我的 wg 名称在哪里?

答案1

如果节点 4、5、6 分别位于自己的后面中央国家机关事务管理局,那么像往常一样,它们无法在它们之间进行正常通信。它们必须依靠节点 1、2、3 来中继流量。因此这些 CGNAT 节点将需要额外的允许IP对于一些公共对等体,在其设置中允许其他 CGNAT 节点通过公共节点,并且这些公共节点必须设置为路由器。

假设节点 4 的 IP 地址为 10.1.0.51/32 并使用节点 2 作为路由节点:

[Interface]
Address = 10.1.0.51/32
PrivateKey =

[Peer] # example public node 1
PublicKey =
AllowedIPs = 10.1.0.1/32
Endpoint = X.X.X.X:5888
PersistentKeepalive = 25

[Peer] # example public node 2
PublicKey =
AllowedIPs = 10.1.0.2/32,10.1.0.52/32,10.1.0.53/32
Endpoint = Y.Y.Y.Y:5888
PersistentKeepalive = 25

[Peer] # example public node 3
PublicKey =
AllowedIPs = 10.1.0.3/32
Endpoint = Z.Z.Z.Z:5888
PersistentKeepalive = 25

其他 CGNAT 节点的 IP 地址预计通过节点 2 路由,并应添加到该对等节点的允许IP。这也应该会自动将它们添加到路由表中。

节点 2 现在也必须是路由器,至少在其 WireGuard 接口上,该接口既是入口又是出口。在 Linux 上,例如,可以使用以下方法完成此操作(假设接口WG0):

sysctl -w net.ipv4.conf.wg0.forwarding=1

其防火墙规则还必须允许转发流量WG0

请注意,无需在 CGNAT 节点上定义其他 CGNAT 对等体,如果已定义,则它们一定不有其他 CGNAT 节点的 IP 地址允许IP

  • 无法直接联系到他们,
  • 如果在后续的允许IP它将在每个先前的定义中删除,并且只有最后定义的对等体才能拥有它。加密密钥路由IP 地址 <=> 对等。

节点 5 和 6 必须具有兼容的配置(也使用节点 2 作为路由器)。您还可以想象有:

  • 划分角色,其中 4 和 5 由节点 2 路由,4 和 6 由节点 3 路由,5 和 6 由节点 1 路由,
  • 或者在不同的 IP 块内拥有多个 IP 地址,以便每个 IP 块可以通过不同的路由节点进行路由,
  • 或者在 WireGuard 流量中使用洋葱路由,以便路由节点无法解码非预期的流量,
  • 或者使用多个独立的 WireGuard 接口(它们之间不受加密密钥交互的影响,而只受路由表的影响),
  • 或者之前选项的某种组合,

[...]

在所有情况下,对于任何拓扑变化,即使是由于故障而非预期的变化,也需要一种方法来同步所有受影响对等方中的配置变化,并且目前没有专门的工具来执行此操作。


作为结论,这里有一篇博客边界网关协议(这将是缺失的工具)与 WireGuard 一起使用,具有多个地址,并且每个对等节点都有一个接口,并且仅定义该对等节点以避开加密密钥路由。 可能从中可以学到一些东西,但这个主题对我来说太高级了。

使用 WireGuard 在 Linux 上实现基于路由的 VPN

相关内容