Networking

防止在 ifup 上創建本地網路路由

  • October 11, 2020

我有一個帶有 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的設置中。

引用自:https://unix.stackexchange.com/questions/611602