Linux-Networking

對於通過 Wireguard 進入的連接,通過同一設備發迴響應

  • March 9, 2022

我有一個在我的私有 LAN 中執行的伺服器,它使用 Wireguardlanserver連接到公共伺服器。使用 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 中,它不起作用。問題似乎是兩者在同一個公共子網pclanserver都有一個 IPv6 地址。publicserver成功轉發連接lanserver,但響應不是通過 Wireguard 連接路由回,而是直接pc由於 ip rule 31100

如何確保通過 Wireguard 介面進入的連接的所有響應lanserver也通過 Wireguard 介面發回,無論它們的源 IP 是否在本地子網中?

我可以從以下幾個方向思考解決方案:

  • 在 上禁用 IPv6 lanserver,導致它與 不在同一子網中pc。不是一個很好的解決方案。
  • 用於埠轉發SNATpublicserver不是一個可接受的解決方案,因為轉發埠後面的一些服務需要知道真正的源 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

可以在此處找到有關此解決方案的更多詳細資訊。

引用自:https://serverfault.com/questions/1094912