公共網路和本地網路之間的 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我的工作小組名字在哪裡。

答案1

如果節點 4,5,6 各自落後於自己CGNAT,然後像往常一樣,他們無法在他們之間進行適當的溝通。它們必須依賴節點 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 位址中允許的IP。這也應該自動將它們添加到路由表中。

節點 2 現在也必須是路由器,至少在其 WireGuard 介面上,該介面既是入口也是出口。在 Linux 上,這可以透過以下方式完成(假設有一個介面工作小組0):

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

其防火牆規則也必須允許轉送流量工作小組0

請注意,無需在 CGNAT 節點上定義其他 CGNAT 對等體,如果定義了它們一定不有其他CGNAT節點的IP位址允許的IP

  • 無法直接聯絡他們,
  • 如果後續設定了相同的地址允許的IP它將從先前的每個定義中刪除,並且只有最後定義的對等點才會擁有它。和密鑰路由IP 位址 <=> 對等點。

節點 5 和 6 必須具有相容的設定(也使用節點 2 作為路由器)。你也可以想像有:

  • 分割角色,其中 4 和 5 由節點 2 路由,4 和 6 由節點 3 路由,5 和 6 由節點 1 路由,
  • 或是在不同的IP區塊內有多個IP位址,這樣每個區塊都可以透過不同的路由節點進行路由,
  • 或在 WireGuard 流量中使用洋蔥路由和 WireGuard 流量,以便路由節點無法解碼不適合它們的流量,
  • 或使用多個獨立的 WireGuard 介面(它們之間不受加密金鑰互動的影響,而僅受路由表的影響),
  • 或之前選項的某種組合,

[...]

在所有情況下,對於任何拓撲更改,即使是由於故障而不是預期的更改,也需要一種在所有受影響的對等點中同步配置更改的方法,並且當前沒有專用工具可以執行此操作。


作為結論,這是一個博客,其中邊界網關協議(這將是缺少的工具)與 WireGuard 一起使用,具有多個地址,每個對等節點也有一個接口,只有該對等節點定義為迴避加密金鑰路由。可能可以從中學到一些東西,但這個主題對我來說太高級了。

Linux 上使用 WireGuard 的基於路由的 VPN

相關內容