我的 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/24
eth0 的数据包,而不专门将它们发送到默认路由器(标志:U = 路由已启动)将任何数据包发送到本地网络以外的任何地址(0.0.0.0 匹配任何内容)到网关(10.11.12.1)(标志:U = 路由已启动,G = 网关)。
如果您有更多接口,或者您是多宿主的,或者您配置了特定的网络或主机路由,您可能会看到比这更多的路由,但这是您定期看到的最低限度。
通过配置和启动接口,内核将自动创建该本地网络路由。
您不需要手动添加该路线。