![公共网络和本地网络之间的 Wireguard 网格](https://linux22.com/image/760800/%E5%85%AC%E5%85%B1%E7%BD%91%E7%BB%9C%E5%92%8C%E6%9C%AC%E5%9C%B0%E7%BD%91%E7%BB%9C%E4%B9%8B%E9%97%B4%E7%9A%84%20Wireguard%20%E7%BD%91%E6%A0%BC.png)
每个节点上的 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 一起使用,具有多个地址,并且每个对等节点都有一个接口,并且仅定义该对等节点以避开加密密钥路由。 可能从中可以学到一些东西,但这个主题对我来说太高级了。