Linux 由 OVS 数据包重定向的丢弃

Linux drops redirected by OVS packets

同事们,

我无法通过 Linux 主机转发重定向的(外部)数据包。有我正在试验的网络模型:

     +----+(enp2)   +----+   +----+
     | H2 +---------+ o- +---+ H3 | (192.0.2.153)
     +--+-+         | br |   +----+
        |(enp1)     +-+--+
        |             |
        |             |
        |             |
+-------+--------+  +-+--+
|   ovs i-br     +--+ R1 |
+-------+--------+  +----+
        |
        |
     +--+-+
     | H1 | (10.9.8.100)
     +----+

对于从 H1 到 H3 的流量,存在常规路由(通过 R1),但出于某些原因,我需要通过 H2 转移某些类型的流量,为此使用 OVS 规则。添加规则后:

ovs-ofctl add-flow i-br dl_type=0x0800,in_port=1,nw_proto=6,tp_dst=80,actions=output:4

我在 enp1@H2 上看到传入的数据包:

15:21:51.596752 IP (tos 0x0, ttl 64, id 48926, offset 0, flags [DF], proto TCP (6), length 60)
    10.9.8.100.44444 > 192.0.2.153.http: Flags [S], cksum 0x5f93 (correct), seq 774826047, win 64860, options [mss 1410,sackOK,TS val 3466298181 ecr 0,nop,wscale 7], length 0

虽然允许在 H2 上转发 (net.ipv4.ip_forward=1),但 rpf 已关闭 (net.ipv4.conf.(default|all).rp_filter=0),从 H2 到双方的 ping 工作正常,iptables FORWARD 接受所有内容并配置路由:

10.9.8.0/24 dev enp1s0 proto kernel scope link src 10.9.8.135
192.0.2.0/24 dev enp2s0 proto kernel scope link src 192.0.2.135

我在 enp2@H2 的出口上没有看到这些数据包。

知道为什么会发生这种情况以及如何解决问题才能找到原因吗?

谢谢。

已解决。 OVS 上也需要重写 dst MAC 地址,所以规则必须是:

ovs-ofctl add-flow i-br dl_type=0x0800,in_port=1,nw_proto=6,tp_dst=80,actions=mod_dl_dst:xx:xx:xx:xx:xx:xx,output:4

其中 xx:xx:xx:xx:xx:xx 是 H2 的 mac 地址。这是因为H1在形成输出数据包的以太网头时,设置了R1的dstmac(根据H1的路由table)。在 OVS 上重定向后,此数据包到达 H2,后者将忽略它,因为它的目的地是另一台主机。