ovs-ofctl 添加流以仅允许 ARP 以太网帧

ovs-ofctl add a flow to allow only ARP ethernet frames

我开始使用 ovs-ofctl 和 mininet 学习 SDN,我正在按照一些教程配置交换机,但有些东西我没有听懂。

当我开始拓扑时:

sudo mn --topo single,2 --controller remote --switch ovsk

现在如果我想在 h1 和 h5 之间添加一个简单的流程,我会这样做:

sh ovs-ofctl add-flow s1 in_port=1,actions=output:2
sh ovs-ofctl add-flow s1 in_port=2,actions=output:1

如果我测试主机之间的连接一切正常。

但是现在,删除所有流,如果我尝试:

sh ovs-ofctl add-flow s1 in_port=1,dl_type=0x806,nw_dst=10.0.0.2,actions=output:2
sh ovs-ofctl add-flow s1 in_port=2,dl_type=0x806,nw_dst=10.0.0.1,actions=output:1

现在如果我尝试 ping,没有可达性,但是如果我执行:

sh ovs-ofctl add-flow s1 action=NORMAL

现在我可以在主机之间再次 ping。

我在这里错过了什么?在命令中指定 dl_type=0x806 是否不足以允许 以太网使用 ARP 流量?为什么 ping 在那里失败?

我认为主要原因是所有涉及的协议之间存在混淆。

(1) Ping 是使用 ICMP 完成的,特别是 ICMP 回显请求和 ICMP 回显回复消息。这些消息封装在 IP 数据包中,IP 数据包又封装在以太网数据包中。在这种情况下,Ethernet next header 字段(我认为它实际上通常被称为 ethertype 并且这里 dl_type )被设置为 IP,即 0x0800.

有关如何在 wireshark 中读取 ICMP 数据包的更多 in-depth 指南可以找到 here

(2) end-systems 需要 ARP 才能将 IP 地址与 MAC 地址相匹配。 ARP 被直接封装到以太网帧中,其中 ethernet next header 设置为值 0x806

因此

sh ovs-ofctl add-flow s1 in_port=1,dl_type=0x806,nw_dst=10.0.0.2,actions=output:2

将只允许 ARP 数据包通过,同时丢弃每个 non-ARP 以太网帧。因此 ping 数据包被丢弃。

(3) 最后一个问题是为什么会这样。

sh ovs-ofctl add-flow s1 action=NORMAL

我不熟悉OVS的细节。根据我从 here 了解到的情况,action=NORMAL 将使 OVS 充当普通的 linux 网桥,它执行正常的以太网网桥操作,包括根据正常的 MAC 学习规则转发所有帧.

另外,由于这条规则中没有匹配部分,所以它应该匹配每个数据包。我不知道这个怎么用。

sh ovs-ofctl add-flow s1 in_port=1,dl_type=0x806,nw_dst=10.0.0.2,actions=NORMAL

(4)这个reference底部有一个table,里面列出了openflow规则,匹配常见的网络协议。