有人咨询了一个比较有意思的问题:
我在lo上添加了10.0.1.1/24这个地址,为什么10.0.1.0/24整个段都可以在本机ping通呢?而且在本机telnet这个段任何地址的侦听0.0.0.0的端口也是通的,为什么?
答案似乎不难解释。 因为添加IPv4地址到lo口时,链路层路由就自动在Local表生成啊!
本文接着上面那篇继续写点儿细节。
比如,当我添加地址到lo口时:
[root@localhost ~]# ip addr add dev lo 10.0.1.1/24
按照IP路由规范,一条 链路层路由 将会自动生成,该路由项以添加地址前缀10.0.1.0/24为健值。由于地址是添加在lo口,而lo口的路由在IPv4关联了Local表,所以这条链路层路由被添加在了Local表中:
[root@localhost ~]# ip route show 10.0.1.0/24 dev lo tab local
local 10.0.1.0/24 proto kernel scope host src 10.0.1.1
现在我们知道,当我们在lo口添加一个非32位长度掩码的地址时:
该前缀的链路层网段路由会被添加在Local表中。
看另一方面,当数据包进入IP路由逻辑时,会用目标地址为健值按照下面的顺序查询路由表(基于Linux实现):
[root@localhost ~]# cat /etc/iproute2/rt_tables
255 local
254 main
253 default
0 unspec
我们看得出来,Local表是最优先被查询的(注意:后面4.X高