1

我开始使用 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。

我在这里想念什么?在命令中指定允许使用 ARP 流量的以太网dl_type=0x806是不够的?为什么 ping 在那里失败?

4

1 回答 1

1

我认为主要原因是所有相关协议之间的混淆。

(1) Ping 是使用 ICMP 完成的,特别是 ICMP echo request 和 ICMP echo reply 消息。这些消息被封装在 IP 数据包中,而 IP 数据包又被封装在以太网数据包中。在这种情况下,以太网下一个标头字段(我认为它实际上通常称为 ethertype,此处为 dl_type)设置为 IP,即 0x0800。

可以在此处找到有关如何在 wireshark 中读取 ICMP 数据包的更深入指南。

(2) ARP 是终端系统将 IP 地址与 MAC 地址匹配所必需的。ARP 直接封装到以太网帧中,其中 ethernet next 标头设置为值 0x806

因此

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

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

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

sh ovs-ofctl add-flow s1 action=NORMAL

我不熟悉OVS的细节。据我了解 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) 这个参考在底部有一个表格,列出了openflow规则来匹配常见的网络协议。

于 2021-12-13T13:57:52.930 回答