iproute2 继承或复制表

iproute2 继承或复制表

我已经使用以下命令在 Linux“路由器”上设置了源策略路由:

ip rule add from 192.168.1.0/24 table FOO
ip route add default dev eth0 table FOO

从该子网转发的数据包到达 Internet 目的地。

问题是表 FOO 不从表 main 继承本地连接的路由。
我可以手动添加本地连接的路由,但显然这很脆弱并且需要更多维护。

我希望表 FOO 继承表 main 的所有路由,然后我可以使用“ip 路由更改默认值”而不是“ip 路由添加默认值...”。

表 main 的默认路由必须保留在其他子网中。

我怎样才能做到这一点 ?

答案1

以下是添加新路由表和规则的常用方法,这是 OP 不希望的:

  1. 创建一个包含“例外”的新路由表,称为FOO
  2. 添加带有选择此表的条件的规则FOO
  3. 因为规则获得较低(更好)的优先级,所以FOO首先读取新表,因此通常完全绕过该main表。为了“纠正”此问题,main将表中的路由复制到表中FOO

规则看起来像这样:

# ip rule 
0:  from all lookup local 
32765:  from 192.168.1.0/24 lookup FOO 
32766:  from all lookup main 
32767:  from all lookup default 

OP 不希望必须执行 3.,因为它会在路线更改时增加管理负担。

据我了解,这就是OP所希望的:

  1. 每个本地交通都应使用表中的常用路线进行处理main
  2. 如果流量来自192.168.1.0/24其默认路由,则应从表中获取FOO(此处dev eth0
  3. 否则,流量将使用“通常”的默认路由。

让我们按照这个顺序来实现它,而不是通常的顺序。结果可能不完全是问题中所描述的,但应该是所希望的。如果没有要解决的实际问题以及 OP 给出的正确配置,有些事情可能看起来很尴尬(例如重用 的输出将ip route默认路由从 table 移动main到 table default)。

从通常的规则开始:

# ip rule
0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

请注意,该default表是空的(默认情况下)并且可以免费使用。

# ip route show table default
#
  1. 将查找的规则移至main较低优先级

    # ip rule add priority 32000 from all lookup main
    # ip rule del priority 32766
    
  2. 实施例外情况

    # ip route add default dev eth0 table FOO
    # ip rule add priority 32100 from 192.168.1.0/24 lookup FOO
    
  3. 将“通常”默认路由从 table 移至maintable default,以允许在规则 32100 处触发异常。如果之前未找到匹配项,则规则 32767 仍将提供表中的默认路由default,不会出现连接丢失。

    # ip route add $(ip route show 0.0.0.0/0) table default
    # ip route del default
    

规则现在看起来像这样:

# ip rule
0:  from all lookup local 
32000:  from all lookup main 
32100:  from 192.168.1.0/24 lookup FOO 
32767:  from all lookup default 

容器中的几个示例(这没有多大意义,只是为了查看涉及的表):

# ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
eth0@if12        UP             66:d4:11:94:49:5f <BROADCAST,MULTICAST,UP,LOWER_UP> 
local0@if9       UP             00:16:3e:6a:c1:e9 <BROADCAST,MULTICAST,UP,LOWER_UP> 
# ip -4 -br a
lo               UNKNOWN        127.0.0.1/8 
local0@if9       UP             10.0.3.66/24 
# ip route
10.0.3.0/24 dev local0 proto kernel scope link src 10.0.3.66 
# ip route show table FOO
default dev eth0 scope link 
# ip route show table default
default via 10.0.3.1 dev local0 

# ip -o route get 10.0.3.2
10.0.3.2 dev local0 src 10.0.3.66 \    cache 
# ip -o route get 8.8.8.8
8.8.8.8 via 10.0.3.1 dev local0 table default src 10.0.3.66 \    cache 
# ip -o route get 8.8.8.8 from 192.168.1.2 iif local0
8.8.8.8 from 192.168.1.2 dev eth0 table FOO \    cache  iif local0

就是这样。唯一的用法差异是“通常”默认路由现在必须在表default( 253) 而不是表main( )中设置254。必须调整引导脚本来处理它:设置不应指定默认路由或网关,而应运行一个额外的自定义脚本来执行此操作ip route add default ... table default。对于 Debian,这可以通过命令来完成post-up例如 post-up ip route add default via xxx table default || :) 在/etc/network/interfaces。对于 RHEL7,这应该完成路线-XXX文件。对于systemd的新网络方法,我不知道。

答案2

只需添加

ip rule add from 192.168.1.0/24 table main suppress_prefixlength 0

数据包将前往table main并查找路由,但table main不会使用默认路由。

然后数据包转到table FOO并被路由到eth0

相关内容