我有以下设置:
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
有关详细信息,请参阅网络参数的内核文档页面。