如图所示,当 Linux 内核接收到一个数据包时,它会经过预路由链,然后做出路由决策,是将其转发到其他地方还是传送到本地进程。
输入接口的 IP 地址如何影响路由决策?
其他接口的 IP 地址如何影响路由决策?
路由表如何影响路由决策?
是否有任何好的资源可以描述内核如何做出此入站路由决策?
我想要实现的是将来自 eno1 且目的地为 95.123.123.62 的数据包转发到 virbr0(libvirtd
虚拟网络交换机)。然而,尽管目标 IP 属于 virbr0 接口,但它们似乎只是被放入输入链中。以下是 的输出ip address
:
83: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:54:00:39:d0:49 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
inet 95.123.123.62/32 scope global virbr0
valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 30:9c:23:b8:c2:08 brd ff:ff:ff:ff:ff:ff
altname enp0s31f6
inet 95.123.123.20/26 brd 95.216.225.63 scope global eno1
valid_lft forever preferred_lft forever
答案1
路由表如何影响路由决策?
从内部来看,全部根据路由表进行。Linux 有一个额外的路由表,即local
表,其中有属于同一系统的地址的特殊路由:
$ ip route ls table local
local 10.147.241.1 dev mlx0 proto kernel scope host
其内容是根据分配给接口的 IP 地址自动生成的。非常在少数情况下,您可能想要创建这样的路由或者直接调整此表,而您的情况似乎并非如此 – 相反,您不应该将此地址分配给接口。
这些表被挂接到“策略路由”系统中:
$ ip rule
0: from all lookup local
32766: from all lookup main
我想要实现的是将来自 eno1 的数据包(目的地为 95.123.123.62)转发到 virbr0(一个 libvirtd 虚拟网络交换机)。然而,它们似乎只是被放入输入链中,即使目标 ip 属于 virbr0 接口
这正是数据包进入输入链的原因——因为它们属于本地接口。
通常情况下,其他配置子网的地址 – 例如整个 192.168.122.0/24除了对于 192.168.122.1 – 通过接口转发,而配置的地址本身根据定义是本地的。
因此,将地址作为 /32 分配给 virbr0 会产生与您要求的完全相反的效果:它表示该地址是本地的,因此根据定义不会转发到任何地方。
如果具有该地址的虚拟机应该直接连接到网桥的另一端,则需要添加路线反而:
ip addr del 95.123.123.62/32 dev virbr0
ip route add 95.123.123.62/32 dev virbr0
没有网关的路由实际上就像“本地子网”路由一样工作 - 主机将尝试对具有该地址的(虚拟)机器进行 ARP。
答案2
我发现这个答案在 Unix 和 Linux 上,解释路由规则。基于此,
- 如果任何接口有目标 IP,数据包将被路由到本地进程。IP 可以属于不同的接口,所以这就是它只是在本地路由的原因,尽管这看起来有点奇怪。
- 否则,使用主路由表。