当使用 RTLINK 从(网络命名空间)Linux 内核查询可用的 IP 路由时,我注意到在一个测试系统上 RTLINK 返回一条没有属性的路由RTA_OIF
,即没有指定传出网络接口。
不幸的是,我不知道如何使用该ip route add
命令重现这种情况(用于测试),并且到目前为止,我范围内的任何人都无法解释最初创建此路由的“内容”,而没有任何传出网络接口的指示。通过查看 Linux 内核源代码,我注意到传出网络接口属性实际上是可选的。然而,我的尝试总是ip route add
以内核自动添加的传出网络接口或无法访问而告终:
ip route add 1.1.1.1/32 via 1.1.1.2
给出RTNETLINK answers: Network is unreachable
.
下一次(失败)尝试:
ip addr add 1.1.1.2/32 dev ens33
ip route add 1.1.1.1/32 via 1.1.1.2
ip route show
...然后给出1.1.1.1 via 1.1.1.2 dev ens33
,其中内核自动插入一个合适的传出网络接口(因此RTA_OIF
存在,即使我一开始没有指定它)。
搜索“没有传出接口的 linux ip 路由”或类似内容不会给我任何可用的结果——除非我在这里忽略了一些重要的东西。
那么,如何创建一个(测试)案例,其中我有一个没有传出网络接口的 IP 路由?我在这里忽略了什么?
答案1
事实证明,没有传出网络接口的路由(不是:与路由相关的规则)至少用于以下三个用例:
- 所谓的黑洞路由,IP 堆栈会默默地丢弃与该路由匹配的所有流量。
- 无法到达的路由,其中 IP 堆栈丢弃所有发往这些路由的流量,并另外触发 ICMP(v6) 不可达响应。
- 禁止IP 堆栈再次丢弃所有流量的路由也会发送 ICMP(v6) 响应,但这次是“禁止”而不是“无法访问”。
这些路线可以轻松创建,如下所示:
# ip route add blackhole 1.2.3.4
# ip route add unreachable 1.2.3.5
# ip route add prohibit 1.2.3.6
然后ip route show
确认这些路由没有传出网络接口:
$ ip route show
...
blackhole 1.2.3.4
unreachable 1.2.3.5
prohibit 1.2.3.6