通過 Wireguard 對等體路由所有流量
我有一個 Wireguard VPN 設置,基本上如下所示:
P1 ---- S ---- P ---- LAN Px -----|
- S (ip 192.168.60.1) 是在 Ubuntu 20.04 上執行的 WG 伺服器,啟用了 ufw,具有公共 IP(使用 wg0 介面)。
- P (ip 192.168.60.2) 是在 CGNAT 後面執行的 WG 對等體,沒有公共 IP,連接到自己的 LAN。
- P1..Px 是其他 WG 對等點(ip 192.168.60.1x)。
ufw有如下配置:
To Action From -- ------ ---- 22/tcp ALLOW Anywhere 51820/udp ALLOW Anywhere Anywhere on eth0 ALLOW FWD Anywhere on wg0 Anywhere on wg0 ALLOW FWD Anywhere on eth0 Anywhere on wg0 ALLOW FWD Anywhere on wg0
我想實現來自 P1..Px 對等方的所有流量都通過 P 路由。
我嘗試了以下方法,但沒有成功:
- 在 P1 上,我將 S 的 AllowedIPs 設置為 0.0.0.0/0。在 SI 上,將 P 的 AllowedIPs 設置為 0.0.0.0/0。- 此配置使 S 無法通過 eth0 訪問(並且仍然不會將任何內容路由到 P)。
- 在 P1 上,我將 S 的 AllowedIPs 設置為 0.0.0.0/0。在 SI 上嘗試根據源 IP 配置基於策略的路由:
sudo ip rule add from 192.168.60.0/24 lookup 200 sudo ip route add default via 192.168.60.2 dev wg0 table 200
這可以防止 P1 連接到 192.168.60.0/24 以外的任何地方。
您可能應該首先
Table=off
在 S 和 P 上的 wg-quick conf 中使用。 的值AllowedIPs=
不會導致更改它們上的路由/策略路由規則。編輯:實際上,
Table=
在 P 上保持不變應該沒問題,除非您出於某些原因需要AllowedIPs=
S,0.0.0.0/0
而不是192.168.60.0/24
因為某些原因,例如需要流量源自自身以被路由 S。您不需要弄亂路由和路由自己對 P 進行規則,因為即使是前綴 inAddress=192.168.60.2/24
也應該配置必要的路由。下一段可能不適用於您所需要的——儘管它可能會給您一些關於事情如何工作的額外見解。您可能應該為S 和 P使用額外的 IP 子網,例如
192.168.59.0/30
。這將為您省去需要額外 ip 規則的麻煩。請記住192.168.60.0/24
在 P 上添加子網路由,與 一樣Table=off
,核心只會為Address=
欄位中的前綴添加前綴路由。好好利用PostUp=
(和PreDown=
)順便說一句。我不認為您想將源自 S 本身的流量路由到 P,因此您可能需要以下 ip 規則:
# ip rule add iif wg0 from 192.168.60.0/24 lookup 200
如果您確實需要將 ssh 和wireguard 伺服器回復以外的流量路由到 P,您還可以擁有:
# ip rule add iif lo lookup 200 # ip rule add iif lo ipproto tcp sport 22 lookup main # ip rule add iif lo ipproto udp sport 51820 lookup main
注意:您不能只匹配
from 192.168.60.1
第一條規則中的添加而忽略其他兩條,因為對於非回复流量,源地址通常(如果不總是)根據確定的路由選擇 - 它尚未設置為這點。請注意,命令的順序通常決定優先級,因此請確保在“子集”規則之前添加“超集”規則,否則後者將被前者覆蓋。
此外,最好保持
table 200
空白,直到所有期望規則都到位,否則可能會切斷主機的遠端訪問。最後 nexthop 在通往 L3 隧道的路由中沒有任何意義:
# ip route add default dev wg0 table 200
PS 確保您不僅在防火牆中允許 IP 轉發,而且還使用 sysctl 啟用它。