Linux

在Linux中,如何通過特定設備將路由添加到前綴,該前綴中的某些目的地通過預設路由?

  • March 16, 2022

我目前正在處理一個 VPN,其連接端點位於子網內,前綴應通過該特定 VPN 進行隧道傳輸。

因此,基本上問題歸結為與(更大的)一組目標地址(/16 遮罩)匹配,除了一個完全包含的(小)特定目標子集,不應以這種方式路由(而是通過預設路由) .

如果問題是關於過濾的,在 Linux 中使用它可以使用ipset類似的設置來實現

ipset create MyVPN hash:net
ipset add MyVPN $MYVPNNET/$MYVPNMASK
ipset add MyVPN $MYVPNENDPOINT nomatch

然而,這樣的 ipsets 只能在 netfilter 中使用。

現在我的問題是,如何使用 Linux 高級 IP 路由設置等效的東西,即ip route命令系列?

事實證明,在 Linux 中可以使用ipset匹配來選擇路由表。額外的成分是使用 netfilter 規則,該規則將匹配傳出數據包並對其應用fwmark,然後可用於選擇專用路由表。然後,此專用路由表將僅包含一條通過 VPN 的預設路由。

這是腳本形式的總體構想,如何設置。

通過 TUN 路由的子網

DSTNETS=.../.. .../..

從通過 TUN 的路由中排除這些目的地

EXCLUDE=... ...

用於此連接的 TUN 設備及其參數 這些通常由 VPN 守護程序提供

TUNDEV=...
TUNADDR=.../..
TUNPEER=...

用於匹配目標的 ipset 名稱。基於 TUN 名稱

IPSET=${TUNDEV}ipset

我們需要一個 netfilter fwmark 和一個 iproute2 表。fwmarks 和表是 32 位值,限於有符號整數範圍,即

$$ 0, 2³¹-1 $$fwmarks 可以用作表示多個標誌的位遮罩,因此根據我們的需要,可以設置單個特定位(或少數),或者設置一個非常具體的值,然後比較是否相等。

FWMARK=0x...
TABLE=0x...

創建 ipset 並使用要匹配和不匹配的 IP 地址範圍和子網填充它。

ipset create $IPSET hash:net
for d in $DSTNETS ; do ipset add $IPSET $d ; done
for x in $EXCLUDE ; do ipset add $IPSET $x nomatch ; done

創建一個新的 iproute2 規則表,用於為所有設置了 fwmark 的數據包進行路由查找

ip rule add fwmark $FWMARK table $TABLE

這就是奇蹟發生的地方:創建一個 netfilter 規則,它將匹配源自該主機的數據包,用於匹配我們剛剛創建的 ipset 的目標,並用我們選擇的 fwmark 標記它們。由於我們之前創建的規則,這些數據包將使用該特定表而不是全域表進行路由。

iptables -t mangle -A OUTPUT -m set --match-set $IPSET dst -j MARK --set-mark $FWMARK

還要添加一個 netfilter 規則來覆蓋這些數據包的源地址,因為如果它們與 VPN 使用的地址範圍不匹配,目標網路可能會拒絕它們

iptables -t nat -A POSTROUTING -m set --match-set $IPSET dst -j SNAT --to-source $INTERNAL_IP4_ADDRESS

現在我們可以設置實際的 TUN 設備了。嚴格來說,這些步驟之前可能已經完成,但是在 TUN 出現和建立路由規則之間的短時間內,一些數據包可能會陷入困境

ip link set dev $TUNDEV up
ip addr add $TUNADDR peer $TUNPEER dev $TUNDEV 

最後在我們的專用路由表中建立一個通過 TUN 的預設路由,由於 fwmark 規則,只有與我們的 ipset 匹配的數據包才會命中該路由

ip route add default dev $TUNDEV table $TABLE

要拆掉所有東西,只需反向執行腳本,刪除東西;ipset可以使用單個命令進行編輯destroy

路線是根據最具體的優先方法計算的。因此,如果您的小子網需要預設路由,請將其放在首位,然後添加其他路由:

本例中的預設網關是 10.0.0.1 VPN 是 10.0.0.2

ip route add 10.0.1.0/24 via 10.0.0.1
ip route add 10.2.0.0/16 via 10.0.0.2
ip route add default via 10.0.0.1

將通過預設網關將流量路由到子網 (10.0.1.0),通過 10.0.0.2 路由 VPN,並通過預設網關將其他預設流量路由。

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