欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mininet+OVS:如何更改SDN交换机的流表条目上限

程序员文章站 2022-07-06 21:54:58
...

前言

 

流表是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的接收端。

Mininet+OVS:如何更改SDN交换机的流表条目上限

 

1、开启ryu控制器,并使用REST API。可以看到,s1有一条默认的,与控制链路通信的链路,默认的输出为Controller。

Mininet+OVS:如何更改SDN交换机的流表条目上限

2、限制s1的流表条目上限为1。

如果操作成功,会出现如下一段数字代码。

此时,由于已经有一条流表条目在交换机中,流表已经占满。

sh ovs-vsctl aaa@qq.com create Flow_Table flow_limit=1 overflow_policy=refuse -- set Bridge s1 aaa@qq.com

Mininet+OVS:如何更改SDN交换机的流表条目上限

3、开启h4的iperf服务端,开启h1,发送iperf TCP流量,并启动ryu的流量监控程序。(基于流表,统计流量)

此时发现TCP流量没有任何的记录,说明流表已满,TCP流量未被记录。

Mininet+OVS:如何更改SDN交换机的流表条目上限

4、将s1的流表上限设置为3(往返h1,h4的TCP流量),此时,我们看到出现TCP的流量记录。

Mininet+OVS:如何更改SDN交换机的流表条目上限

同时另起终端,使用命令查看s1的流表,发现已经正常安装规则,此时s1*有三条规则。

sudo ovs-ofctl -O OpenFlow13 dump-flows s1

这里不能在mininet里面直接dpctl dump-flows,否则报错不支持OF1.3协议。

Mininet+OVS:如何更改SDN交换机的流表条目上限

 

更多

 

本文使用的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