什么是没有传出网络接口的 Linux IP 路由(RTLINK 答案缺少“RTA_OIF”)以及如何创建一个用于测试?

什么是没有传出网络接口的 Linux IP 路由(RTLINK 答案缺少“RTA_OIF”)以及如何创建一个用于测试?

当使用 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

事实证明,没有传出网络接口的路由(不是:与路由相关的规则)至少用于以下三个用例:

  1. 所谓的黑洞路由,IP 堆栈会默默地丢弃与该路由匹配的所有流量。
  2. 无法到达的路由,其中​​ IP 堆栈丢弃所有发往这些路由的流量,并另外触发 ICMP(v6) 不可达响应。
  3. 禁止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

相关内容