每个自定义路由表(带默认网关)是否需要链接作用域路由?

我的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路由所有stream量:

 # 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 )之前查询的,所以使用通过foo_table中的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 

我对发生的事情的理解是正确的吗? (我对路由有最less的经验。)

你知道foo_table的目的是什么吗? 对我来说,它的效果似乎是通过路由器路由从10.0.2.22接口(包括本地子网)的所有stream量,你说什么是你不想要的。 /etc/iproute2/rt_tables的内容是什么? 你也不会说main表中的默认路由是什么。

为了避免这种情况,可以按照您的build议将子网路由添加到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情况下默认路由是空的,也许是因为默认路由取决于configuration的接口。))

对于任何碰到这种情况的人,我在兄弟网站上发现了一个类似的问题: https : //unix.stackexchange.com/questions/27850/routing-tables-and-default-routes

一般来说,你会在大多数* nix的路由表中看到两条规则(至less)。

你将有一条路由到你的本地networking(对于这个例子,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

那么,这有效地告诉你的内核是:

直接发送到eth0的10.11.12.0/24数据包,不需要特别发送到默认路由器(flags:U = route is UP)

发送任何数据包到本地networking(0.0.0.0匹配任何东西)到网关(10.11.12.1)以外的任何地址(标志:U =路由为Up,G =网关)。

如果你有更多的接口,或者你是多宿主的,或者你configuration了特定的networking或主机路由,你可能会看到更多的路由,但这是你经常看到的最低限度的路由。

通过configuration和调出接口,内核将自动创build本地networking路由。

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