我试图了解什么是本地路由表。
如果我使用以下命令在其中添加一个随机地址:
sudo ip route add to local <any-ip-address> dev <network interface>
现在我可以 ping 该地址,但是 ifconfig 列出的接口均未使用该地址。
例子:
$ ping 192.168.22.22 -w 1
PING 192.168.22.22 (192.168.22.22) 56(84) bytes of data.
--- 192.168.22.22 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
$ sudo ip route add to local 192.168.22.22 dev wlp2s0
$ ping 192.168.22.22 -w 1
PING 192.168.22.22 (192.168.22.22) 56(84) bytes of data.
64 bytes from 192.168.22.22: icmp_seq=1 ttl=64 time=0.018 ms
64 bytes from 192.168.22.22: icmp_seq=2 ttl=64 time=0.015 ms
--- 192.168.22.22 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.015/0.016/0.018/0.004 ms
感觉它像一个环回一样工作,但是从 ifconfig 来看,lo 接口仍然只有 127.0.0.1 地址。如果我检查此表,ip route ls table local
我会看到以下内容:
$ ip route ls table local
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 192.168.0.0 dev wlp2s0 proto kernel scope link src 192.168.0.13
local 192.168.0.13 dev wlp2s0 proto kernel scope host src 192.168.0.13
broadcast 192.168.0.255 dev wlp2s0 proto kernel scope link src 192.168.0.13
local 192.168.22.22 dev wlp2s0 scope host
broadcast 192.168.122.0 dev virbr0 proto kernel scope link src 192.168.122.1
local 192.168.122.1 dev virbr0 proto kernel scope host src 192.168.122.1
broadcast 192.168.122.255 dev virbr0 proto kernel scope link src 192.168.122.1
那么本地表是什么以及在什么情况下我应该使用它?
我在某处读到它用于广播和本地机器托管的地址,但我不明白为什么我们需要为它创建一个特殊的表,以及什么时候应该向该表添加任何条目。
谢谢
答案1
首先,正如互联网上的一些信息解释的那样“本地表是内核维护的一个特殊路由表“。
如果你今天真的很勇敢,你甚至可以得到一些信息当地的具体方法如下:
man ip
——因为这是你在修改的命令,所以它的手册应该有一些关于此事的提示。你应该清楚地注意到现在有所谓的也可以看看部分。让我们仔细研究一下——除其他事项外,它还毫不掩饰地提到了 2 个可能的进一步调查对象:
ip-route(8)
ip-rule(8)
总而言之,我们现在有一些:
man 8 ip-route
的:
local
- 目的地被分配给该主机。数据包被回送并在本地传送。
…
实际上,还有一个表始终存在,它是不可见的,但更为重要。它是
local
表 (ID 255
)。此表包含本地和广播地址的路由。内核会自动维护此表,管理员通常不需要修改它,甚至不需要查看它。
man 8 ip-rule
的:
在启动时内核配置由三条规则组成的默认RPDB:
- 优先级:0,选择器:匹配任何内容,操作:查找路由表
local
(ID 255
)。该local
表是一个特殊的路由表,包含本地和广播地址的高优先级控制路由。
我个人对一些作者在引用手册中提供的信息感到满意,但如果您仍然感到饥饿,我想现在您知道如何钓鱼了。
答案2
poige 的回答涵盖了本地路由表 1) 特殊、2) 最高优先级和 3) 由内核维护,但它并没有回答“本地路由表用于什么?”这个问题,我将尝试解释。
本地环回
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
这些路由指定127.*.*.*
空间中的任何地址都将指向机器。该127.*.*.*
空间在IETF 规范始终是环回地址。要理解为什么 127.0.0.0/8 映射到127.*.*.*
,您必须了解CIDR 表示法如果你还不熟悉它。
127.0.0.0/8 - 此地址块被指定为 Internet 主机环回地址。由高级协议发送到此
地址块内任意地址的数据报都会在主机内环回。这
通常仅使用 127.0.0.1/32 进行环回。如
[RFC1122] 第 3.2.1.3 节所述,整个 127.0.0.0/8 地址块内的地址不会合法地出现在任何网络上。
广播
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 192.168.0.0 dev wlp2s0 proto kernel scope link src 192.168.0.13
broadcast 192.168.0.255 dev wlp2s0 proto kernel scope link src 192.168.0.13
broadcast 192.168.122.0 dev virbr0 proto kernel scope link src 192.168.122.1
broadcast 192.168.122.255 dev virbr0 proto kernel scope link src 192.168.122.1
通常,数据包会发送到单个目标 IP。但是,有时将同一个数据包发送到子网的 IP 块很有用(例如,您的计算机可以向路由器子网内的所有地址发送特殊数据包以发现网络打印机,这些打印机会响应特殊数据包)。广播地址是一种特殊地址,其功能类似于发送到子网中的所有地址。通常,这些通常是子网中的第一个和最后一个地址。
不同子网中的本地路由
local 192.168.0.13 dev wlp2s0 proto kernel scope host src 192.168.0.13
local 192.168.122.1 dev virbr0 proto kernel scope host src 192.168.122.1
最后,剩余的地址是机器在每个子网上的地址。例如,192.168.0.0/24 子网上的设备 (192.168.0.14) 可以通过向 192.168.0.13 发送数据包来到达您的机器。
用户自定义
local 192.168.22.22 dev wlp2s0 scope host
这是最后一条未被考虑的路线,我认为它是你手动添加的。
答案3
本地路由表允许系统路由到适当的接口以到达地址。使用最具体(最小子网)的路由来选择路由。但是,您正在测试由环回地址处理的路由。
Ping 在接口级别响应,不需要监听过程。当 ping 分配给主机接口的地址时,网络会短路到环回接口的路由。到环回接口的路由可防止远程服务器监听流量。由于您已将路由分配给本地接口,因此环回接口将响应 ping。
通常你的路由表会有以下路由:
默认 (0.0.0.0/0):路由器的路由,它将流量路由到其他未知地址。这是用于连接互联网的路由。这应该直接路由到路由器,尽管可以通过指定中间路由器间接路由。
192.0.2.0/24:(可选,仅适用于多个接口)其中 192.0.2.0 是远程子网的网络地址,/24 是网络的大小。同样,这将路由到路由器。仅当路由由路由器(而不是封闭子网的路由器)路由时才需要此设置
192.0.2.0/24:(标准)。值如上所述)提供到所连接网络的路由。接口的 IP 地址必须在子网中。这将路由到为子网提供服务的路由器。但是,除非被更具体的路由覆盖,否则将直接路由到子网中其他主机的连接。
127.0.0.1/8:(标准)。这是附加到环回伪接口的环回地址。这些地址在实际接口上永远不应该出现。
还有其他专用路线,例如点对点和黑洞。这些路线很少使用。