Linux 上的 VM 和网桥路由难题

Linux 上的 VM 和网桥路由难题

我有以下设置:

      Hypervisor host 1              |            Hypervisor host 2
                                     |
------------------                   |
| VM             |                   |
| 10.244.140.10  |                   |
| GW 10.244.140.1|                   |    Route to 10.244.8.0/24 
------------------                   |    goes through br1
        |                            |
 /--------------\ /-------------\    |   /-------------\  /--------------\
 |     br0      | |     br1     |    |   |     br1     |  |     br0      |
 |10.244.140.254| | 10.244.8.21 |    |   | 10.244.8.1  |  | 10.244.140.1 |
 |              | | ....        |    |   | 10.244.8.33 |  |              |
 \--------------/ \-------------/    |   \-------------/  \--------------/
        |                |           |         |                 |
       eth0             eth1------------------eth1              eth0
        |                            |                           |
        \--------------------------------------------------------/

两台带有虚拟机的主机。定义了几个子网:10.244.140.0/24br0网桥,10.244.8.0/24br1桥梁。br1网桥有多个 IP 地址。没有 netfilter 规则。Netfilter 策略已设置ip_forward

VM 连接到br0在主机 1 上。它 ping 10.244.8.21,该地址位于不同的子网中,但位于同一主机 1 上。虚拟机的默认网关是 10.244.140.1,位于主机 2 上。

我天真的期望:回显请求数据包发送到br0在 host2 上,由于br0具有网关地址。然后数据包被路由到br1然后返回host1。

现实:数据包按预期到达。但是,它没有被路由。另一方面,发送到 10.244.8.33 的数据包到达br1在主机 2 上,回显答复。

我错在哪里? 更重要的是:我该如何解决这个问题?

虚拟机管理程序主机运行 OpenSuse Leaf 15 和 KVM。

编辑:由于我的声誉不足,无法添加评论,因此我将答案放在了问题中。感谢您的关心。

您的数据包“按预期”到达,它已经通过了子网边界,因此被路由。抱歉,我的描述不完整。它到达在主机 2 上的 br0,位于同一子网中,并且不会进一步路由。

重力:我想您的第一个问题现在已经得到答案了。 数据包的目标 MAC 地址是哪个当它穿过 host1 上的 br0 时?路由器的 MAC,即主机 2 上的 br0 的 MAC。它知道这一点是因为它确实收到了 ARP 响应。

答案1

反向路径过滤

我知道它存在,但我没有把它与我的问题联系起来。RPF 限制通过接收接口发送的回复数据包。在我的例子中,回复将通过不同的接口,因此被阻止。

解决方案是在两个虚拟机管理程序主机上禁用反向路径过滤,例如

# sysctl net.ipv4.conf.all.rp_filter=0

这使得主机容易受到某些网络攻击,但我的环境与恶劣的互联网隔离,所以我不在乎。

rp_filter有关详细信息,请参阅网络参数的内核文档页面

相关内容