防止在 ifup 上創建本地網路路由
我有一個帶有 2 個乙太網介面和一個 USB 連接的蜂窩調製解調器的多宿主主機。乙太網介面以典型方式在主路由表上進行配置,只有一條預設路由分配給其中之一。
[/]# ip route show table main default via 192.168.4.1 dev eth0 metric 50 192.168.2.0/24 dev eth1 scope link src 192.168.2.10 192.168.4.0/22 dev eth0 scope link src 192.168.4.73
在單獨的“usbcell”路由表上,為單元介面分配了另一個預設路由。
[/]# ip route show table usbcell default via 10.26.128.2 dev usbcell src 10.26.128.1
IP 規則指示所有標有值 0x100 的數據包使用 usbcell 路由表。這些數據包在應用程序中的套接字級別進行標記。我們還添加了基於源的路由規則,以防止反向路徑過濾丟棄 usbcell 流量。
[/]# ip rule 0: from all lookup local 97: from 10.26.128.1 lookup usbcell 100: from all fwmark 0x100 lookup usbcell 32766: from all lookup main 32767: from all lookup default
Cell 介面具有由調製解調器硬體動態提供的 IP、網路遮罩和網關。該子網不歸運營商或我們所有,因此我想防止與連接到乙太網埠的任何其他網路發生衝突。這應該很容易,因為單元介面位於單獨的路由表上。但是,不幸的是,每當通過 ifup 啟動單元介面時,都會將到該介面的本地路由添加到主表中。這會將發往該子網的所有數據包路由到單元介面,而不僅僅是標記的數據包。如果我刪除本地路由,它會按預期工作。
usbcell 啟動時的主表:
[/]# ip route show table main default via 192.168.4.1 dev eth0 metric 50 10.26.128.0/17 dev usbcell scope link src 10.26.128.1 ## How do I prevent this? ## 192.168.2.0/24 dev eth1 scope link src 192.168.2.10 192.168.4.0/22 dev eth0 scope link src 192.168.4.73
當usbcell介面啟動時,有沒有辦法防止這個本地路由被添加到主表中?
10.26.128.0/17 dev usbcell scope link src 10.26.128.1
在此範例中,我希望將綁定到子網 10.26.128.0/17 的未標記數據包路由到主表預設路由(到 eth0)。
通常為了防止新地址自動創建其關聯的 LAN 路由,應將此地址添加到帶有標誌的介面
noprefixroute
(不要使用iproute2 5.8 測試它):ip address add 10.26.128.1/17 dev usbcell noprefixroute
這會將地址添加到介面,但不會在啟動介面時在主表中創建自動 LAN 路由。
這實際上也會阻止以後執行此命令:
# ip route add table usbcell default via 10.26.128.2 dev usbcell src 10.26.128.1 Error: Nexthop has invalid gateway.
因為有一條之前沒有檢測到的缺失路線(我很驚訝在 OP 的場景中一切都按預期工作)必須手動添加,否則該表將永遠不會匹配。所以最後:
ip route add table usbcell 10.26.128.2/32 dev usbcell # or 10.26.128.0/17 if you prefer ip route add table usbcell default via 10.26.128.2 dev usbcell src 10.26.128.1
或者,如果 usbcell 設備正在為任何地址執行代理 ARP(這在這種設備中很常見),這也可以代替(但會開始在主機上創建一個大的 ARP 表):
ip route add table usbcell default dev usbcell src 10.26.128.1
如果您的後端可以調整,那麼在那裡進行更改很容易。例如,使用ifupdown後端
/etc/network/interfaces
:iface usbcell inet manual pre-up ip addr add 10.26.128.1/17 dev usbcell noprefixroute down ip addr del 10.26.128.1/17 dev usbcell noprefixroute
同時也可以添加自定義路由:
pre-up ip rule add prio 100 fwmark 0x100 lookup usbcell pre-up ip rule add prio 97 from 10.26.128.1 lookup usbcell up ip route add table usbcell 10.26.128.2/32 dev usbcell up ip route add default via 10.26.128.2 dev usbcell src 10.26.128.1 down ip rule del prio 97 down ip rule del prio 100
如果你不能這樣做,你仍然可以覆蓋路由,這樣核心自動添加的路由就不會被使用。如果有一個指標,這將只是一個簡單的事情:
ip route add 10.26.128.0/17 via 192.168.4.1 dev eth0
但由於沒有(即度量 0,這是最好的優先級),兩者將具有相同的優先級,這變得不確定。除了優先級不確定性之外,在介面啟動後無法添加此路由,因為核心會抱怨:
RTNETLINK answers: File exists
所以只需添加兩條半路由(與 OpenVPN 在使用時添加兩條半預設路由相同
--redirect-gateway def1
)來覆蓋此路由:ip route add 10.26.128.0/18 via 192.168.4.1 dev eth0 ip route add 10.26.192.0/18 via 192.168.4.1 dev eth0
它們一起匹配完全相同的範圍 10.26.128.0/17。比 10.26.128.0/17 更具體,它們將始終佔上風。請記住,如果eth0曾經以管理方式關閉,這些路由將消失並且必須重新添加。因此,您應該將它們添加到配置eth0的設置中。