防止在 ifup 上创建本地网络路由

防止在 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)。

答案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

相关内容