Mininet+OVS:如何更改SDN交换机的流表条目上限
前言
流表是SDN交换机转发的重要环节。当一个不匹配的流量进入交换机时,交换机通过packet-in上报控制器,控制器以flow-mod应答,并在交换机中安装对应规则。
OVS中提供了对于流表的支持,通常流表条目(flow entry)被存储在TCAM中。本文介绍如何设置OVS中的flow entry数目上限,该操作对于研究流表溢出攻击一类攻击有重要意义。
OVS环境
ovs-vsctl aaa@qq.com create Flow_Table flow_limit=100 overflow_policy=refuse -- set Bridge br0 aaa@qq.com
其中,flow_limit改为你需要限制的条目上限,br0可以改为你创建的网桥。
Mininet环境
sh ovs-vsctl aaa@qq.com create Flow_Table flow_limit=100 overflow_policy=refuse -- set Bridge s1 aaa@qq.com
由于mininet自带命令行,因此命令前需要加上sh。
flow_limit改为你需要限制的条目上限;
s1为需要更改上限的交换机(与mininet中指定名称需要一致)
实验测试
实验拓扑如下。
其中有4台主机,其中,h1以iperf发送TCP流量,h4为iperf的接收端。
1、开启ryu控制器,并使用REST API。可以看到,s1有一条默认的,与控制链路通信的链路,默认的输出为Controller。
2、限制s1的流表条目上限为1。
如果操作成功,会出现如下一段数字代码。
此时,由于已经有一条流表条目在交换机中,流表已经占满。
sh ovs-vsctl aaa@qq.com create Flow_Table flow_limit=1 overflow_policy=refuse -- set Bridge s1 aaa@qq.com
3、开启h4的iperf服务端,开启h1,发送iperf TCP流量,并启动ryu的流量监控程序。(基于流表,统计流量)
此时发现TCP流量没有任何的记录,说明流表已满,TCP流量未被记录。
4、将s1的流表上限设置为3(往返h1,h4的TCP流量),此时,我们看到出现TCP的流量记录。
同时另起终端,使用命令查看s1的流表,发现已经正常安装规则,此时s1*有三条规则。
sudo ovs-ofctl -O OpenFlow13 dump-flows s1
这里不能在mininet里面直接dpctl dump-flows,否则报错不支持OF1.3协议。
更多
本文使用的overflow_policy=refuse,即流表溢出时拒绝新来的规则。然而,溢出还有另一种处理方式:
# 拒绝新流量
Make flow table 0 on bridge br0 refuse to accept more than 100 flows:
ovs-vsctl -- aaa@qq.com create Flow_Table flow_limit=100 overflow_policy=refuse -- set Bridge br0 aaa@qq.com
# 接受新流量,替换旧流量
Make flow table 0 on bridge br0 evict flows, with fairness based on the
matched ingress port, when there are more than 100:
ovs-vsctl -- aaa@qq.com create Flow_Table flow_limit=100 overflow_policy=evict groups='"NXM_OF_IN_PORT[]"' -- set Bridge br0 flow_tables:aaa@qq.com
如上代码第二段设置overflow_policy字段时,流表溢出时默认接受新到的规则,并将老规则替换。
但是,考虑到流表溢出等攻击,我们不应当一直接受新规则(此类攻击发生时,接受新规则可能导致流表*为攻击者服务,导致正常流量DoS)。因此默认refuse是更好的选择。
参考资料
*:https://*.com/questions/54114151/change-flow-table-size
OVS official:http://www.openvswitch.org/support/dist-docs/ovs-vsctl.8.txt(拖到最下面就是)
Mininet 应用与源码剖析:https://www.bookstack.cn/books/mininet_book
上一篇: 第一天