Linux
在Linux中,如何通過特定設備將路由添加到前綴,該前綴中的某些目的地通過預設路由?
我目前正在處理一個 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,並通過預設網關將其他預設流量路由。