如图所示,当 Linux 内核收到数据包时,它会经过预路由链,然后做出路由决策,决定是否将其转发到其他地方或将其传递到本地进程。
输入接口的IP地址如何影响路由决策?
其他接口的 IP 地址如何影响路由决策?
路由表如何影响路由决策?
是否有任何好的资源来描述内核如何做出此入站路由决策?
我想要实现的目标是将目标地址为 95.123.123.62 的 eno1 数据包转发到 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
在内部,都是根据路由表制定的。Linux 有一个额外的路由表,
local
该表具有属于同一系统的地址的特殊路由:其内容是根据分配给接口的 IP 地址自动生成的。在极少数情况下,您可能想要创建此类路由或直接调整此表,而您的情况似乎并非如此 - 相反,您一开始就不应该将此地址分配给接口。
这些表被挂接到“策略路由”系统中:
这正是数据包进入输入链的原因 - 因为它们属于本地接口。
通常,所配置子网的其他地址(例如,除192.168.122.1 之外的整个 192.168.122.0/24)将通过接口转发,而所配置的地址本身根据定义是本地的。
因此,将地址分配给 virbr0 作为 /32 具有与您所要求的完全相反的效果:它表明该地址是本地地址,因此根据定义不会转发到任何其他地方。
如果具有该地址的虚拟机应该直接连接到网桥的另一端,则需要添加一条路由:
没有网关的路由实际上就像“本地子网”路由一样工作 - 主机将尝试为具有该地址的(虚拟)机器进行 ARP。
我在 Unix & Linux 上找到了这个答案,解释了路由规则。基于此,似乎