我有一台带有 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)。
答案1
通常,为了防止新地址自动创建其关联的 LAN 路由,应将该地址添加到带有标记的接口noprefixroute
(不要使用ip路由25.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
如果你的后端可以调整,那么就很容易在那里改变它。例如与如果向上向下后端在/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 更具体,它们将始终占上风。请记住,如果以太网0一旦行政上关闭,这些路线就会消失并且必须重新添加。所以你应该将它们添加到设置配置中以太网0。