對於通過 Wireguard 進入的連接,通過同一設備發迴響應
我有一個在我的私有 LAN 中執行的伺服器,它使用 Wireguard
lanserver
連接到公共伺服器。使用 iptables規則通過 Wireguard 連接將 TCP 連接轉發到某些埠。publicserver``publicserver``lanserver``DNAT
在 上
lanserver
,Wireguard 設置為 NetworkManager 連接。它通過 Wireguard 使用AllowedIPs = 0.0.0.0/0, ::/0
. 這會導致設置以下 ip 規則lanserver
:[root@lanserver ~]# ip rule show 0: from all lookup local 31100: from all lookup main suppress_prefixlength 0 31101: not from all fwmark 0xcb2e lookup 52014 32766: from all lookup main 32767: from all lookup default [root@lanserver ~]# ip route show table 52014 default dev wg0 proto static scope link metric 50
此設置工作正常。使用 iptables 規則將傳入的 TCP 連接
publicserver
轉發到。由於 ip 規則與之匹配,因此lanserver
將響應發回。publicserver``31101
有一個例外:當我嘗試
publicserver
從我的個人電腦打開 TCP 連接以使用 IPv6 時pc
,它也位於我的私有 LAN 中,它不起作用。問題似乎是兩者在同一個公共子網pc
中lanserver
都有一個 IPv6 地址。publicserver
成功轉發連接lanserver
,但響應不是通過 Wireguard 連接路由回,而是直接pc
由於 ip rule31100
。如何確保通過 Wireguard 介面進入的連接的所有響應
lanserver
也通過 Wireguard 介面發回,無論它們的源 IP 是否在本地子網中?我可以從以下幾個方向思考解決方案:
- 在 上禁用 IPv6
lanserver
,導致它與 不在同一子網中pc
。不是一個很好的解決方案。- 用於埠轉發
SNAT
。publicserver
不是一個可接受的解決方案,因為轉發埠後面的一些服務需要知道真正的源 IP。AllowedIPs
在 Wireguard 對等體中明確提及本地 IPv6 子網。這不起作用,因為 IPv6 子網每 24 小時更改一次。- 添加一個自定義 IP 規則,該規則以某種方式匹配所有傳入的連接
wg0
並為它們使用路由表52014
。我不確定如何準確指定這樣的規則。此外,問題在於每次重新啟動 Wireguard 連接時,路由表的數量都會發生變化。創建此類規則的正確位置可能是PostUp
腳本,但 NetworkManager 似乎不允許指定一個。
在嘗試了不同的選項後,我決定停止使用 NetworkManager,而是直接使用 wg-quick。在 Fedora 伺服器上,這非常簡單,我只需要使用刪除 NetworkManager 連接
nmcli con del wg0
並啟用 wg-quick 服務systemctl enable --now wg-quick@wg0
(它從 讀取配置/etc/wireguard/wg0.conf
)。切換到 wg-quick 有以下優點:
- 我可以指定自定義
PostUp
命令來配置更複雜的路由設置- Wireguard 路由表的數量似乎是恆定的
51820
,即使我找不到任何關於此的文件。這使得設置自定義 ip 規則變得更加容易。然後我使用
PostUp
命令wg0.conf
設置額外的 ip 規則,以確保任何 Wireguard 流量也將通過 Wireguard 響應。有兩種選擇可以實現這一點:選項 1:源 IP 匹配
ip 規則根據 Wireguard 包的源 IP 地址(自動設置為請求最初傳入的 IP 地址)匹配 Wireguard 包:
[Interface] Address = 10.139.192.4/24 Address = fd52:30a4:f9e7:647a::4/64 PostUp = ip -4 rule add from 10.139.192.4 lookup 51820 PreDown = ip -4 rule del from 10.139.192.4 lookup 51820 PostUp = ip -6 rule add from fd52:30a4:f9e7:647a::4 lookup 51820 PreDown = ip -6 rule del from fd52:30a4:f9e7:647a::4 lookup 51820
選項 2:fwmark
一些 iptables 規則配置為
mark
在通過以下方式傳入的包上設置wg0
:iptables -t mangle -A INPUT -j CONNMARK -i wg0 --set-mark 1 ip6tables -t mangle -A INPUT -j CONNMARK -i wg0 --set-mark 1 iptables -t mangle -A OUTPUT -j CONNMARK -m connmark --mark 1 --restore-mark ip6tables -t mangle -A OUTPUT -j CONNMARK -m connmark --mark 1 --restore-mark
然後
mark
通過 IP 規則匹配:PostUp = ip -4 rule add fwmark 1 lookup 51820 PreDown = ip -4 rule del fwmark 1 lookup 51820 PostUp = ip -6 rule add fwmark 1 lookup 51820 PreDown = ip -6 rule del fwmark 1 lookup 51820
可以在此處找到有關此解決方案的更多詳細資訊。