每个自定义路由表(带默认网关)是否都需要链接范围路由?

每个自定义路由表(带默认网关)是否都需要链接范围路由?

我的 Centos 机器有一个自定义路由表foo_table,仅包含默认网关路由:

# ip route add default via 10.0.2.1 table foo_table
# ip route show table foo_table  
default via 10.0.2.1 dev bond0.2

策略规则使用下表路由来自 10.0.2.22 的所有流量:

# ip rule show
0:      from all lookup local 
32765:  from 10.0.2.22 lookup foo_table 
32766:  from all lookup main 
32767:  from all lookup default 

当我从 10.0.2.22 Centos 机器跟踪路由到同一本地子网上的另一台机器时,数据包首先被路由到路由器,然后再路由到服务器:

# traceroute -In 10.0.2.60
traceroute to 10.0.2.60 (10.0.2.60), 30 hops max, 60 byte packets
 1  10.0.2.1  3.573 ms  3.972 ms  4.219 ms
 2  10.0.2.60  1.461 ms  1.494 ms  1.700 ms

当然,我希望本地流量不会不必要地涉及路由器。

main路由表中,当然有一个针对本地子网的链接范围路由:

10.0.2.0/24 dev bond0.2  proto kernel  scope link  src 10.0.2.22

我的理解是,因为foo_table之前已经咨询过main(按照ip rule show),所以使用通过 10.0.2.1 的默认路由foo_table,即使目的地是链接本地地址。

foo_table这是否意味着我也必须添加链接范围路线?

# ip route add 10.0.2.0/24 dev bond0.2 scope link table foo_table
# ip route show table foo_table  
10.0.2.0/24 dev bond0.2  scope link
default via 10.0.2.1 dev bond0.2

这似乎解决了这个问题,但这是正确的方法吗?

# traceroute -In 10.0.2.60
traceroute to 10.0.2.60 (10.0.2.60), 30 hops max, 60 byte packets
 1  10.0.2.60  0.339 ms  0.355 ms  0.399 ms

我对正在发生的事情的理解正确吗?(我对路由的经验很少。)

答案1

您知道 的目的foo_table是什么吗?对我来说,它的作用似乎是通过路由器路由来自 10.0.2.22 接口(包括到本地子网)的所有流量,而您说这是您不想要的。 的内容是什么/etc/iproute2/rt_tables?您也没有说明表中的默认路由是什么main

为了避免这种情况,请按照建议添加子网路由foo_table,或者直接删除规则:

ip rule del from 10.0.2.22 lookup foo_table

据我所知,您不需要指定scope link添加子网路由foo_table,只需

ip route add 10.0.2.0/24 dev bond0.2 table foo_table

因为无论如何你都会指定与链接对应的前缀。也许我理解错了。

((顺便说一句,我想default主表中的路由可以移动到default表中以简化,但default按照惯例显示为空,可能是因为默认路由取决于配置的接口。))

答案2

对于遇到此问题的其他任何人,我在一个姊妹网站上找到了类似问题的答案:https://unix.stackexchange.com/questions/27850/routing-tables-and-default-routes

一般来说,在大多数 *nix 版本中,您会在路由表中看到两条规则(至少)。

您将拥有一条到本地网络的路由(本例中为 10.11.12.0/24):

10.11.12.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

其中一个用于标识您的默认路线。

0.0.0.0 10.11.12.1 0.0.0.0 UG 0 0 0 eth0

因此,这实际上告诉你的内核的是:

直接发送任何去往10.11.12.0/24eth0 的数据包,而不专门将它们发送到默认路由器(标志:U = 路由已启动)

将任何数据包发送到本地网络以外的任何地址(0.0.0.0 匹配任何内容)到网关(10.11.12.1)(标志:U = 路由已启动,G = 网关)。

如果您有更多接口,或者您是多宿主的,或者您配置了特定的网络或主机路由,您可能会看到比这更多的路由,但这是您定期看到的最低限度。

通过配置和启动接口,内核将自动创建该本地网络路由。

您不需要手动添加该路线。

相关内容