环境准备

环境

  • ubuntu16.04
  • mininet
  • pox
  • scapy

安装mininet

  • sudo apt-get update
  • sudo apt-get upgrade
  • git clone git://github.com/mininet/mininet
  • mininet/util/install.sh -a
    • 进入路径mininet/util
    • -a:安装mininet所有功能
  • 输入以下命令进行测试sudo mn --test pingall

安装pox

由于使用了mininet安装时添加了参数-a,所以在安装了mininet的同时,也安装了许多其他的软件,其中就包括了pox

使用pox

启动pox控制器

  • python pox.py -address=127.0.0.1 -port=6633 samples.pretty_log forwarding.l2_learning py

    • -address:设置控制器ip地址
    • -port:设置控制器端口
    • samples.pretty_log:pox的组件,美化控制台字体
    • forwarding.l2_learning:pox的组件,负责二层转发,可以让openflow交换机变成一个具有二层转发学习的交换机
    • py:进入python的交互式界面,可以继续对pox控制器进行控制器

使用mininet连接pox控制器

  • 新开一个命令行,输入sudo mn --custom topo.py --topo topo --controller=remote,ip=127.0.0.1,port=6633 --mac

    • 输入后,在启动pox的命令行,会看到提示有新的交换机connect

测试演示

0.topo

我们部署一台交换机s0,三台主机连接到该交换机

1.修改交换机的流表数量为100,来模拟模拟交换机内存不足的情况

  • sudo ovs-vsctl add bridge s0 flow_tables 1=@nam1 -- --id=@nam1 create flow_table flow_limit=100:该命令会给交换机s0设置流表0上限为100条(一台交换机有多个流表)
  • sudo ovs-vsctl list bridge:查看交换机的设置情况
  • sudo ovs-ofctl dump-flows s0:查看交换机的流表
  • sudo ovs-vsctl list flow_table:查看流表的设置

2.使用scapy发送大量的流量(二层),促使控制器不断的install新的流表

  • 我们发送udp的数据包,只需要修改源端口,就会触发pox给交换机下方新的流表

  • 将h2作为接收端,运行接收脚本,统计实际接收的数据包数量,和发送的数据包数量对比
    import socket

    address = ('10.0.0.2', 8080)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(address) i = 1
while True:
data, addr = s.recvfrom(2048)
print "i:", i, "received:", data, "from", addr
i = i + 1 s.close()
  • 将h1作为发送端,不断发送只有源端口修改的数据包
    from scapy.all import *

    for i in range(100, 1100):
print('now:', i)
pkt = Ether(src='00:00:00:00:00:01', dst='00:00:00:00:00:02')/IP(src='10.0.0.1', dst='10.0.0.2')/UDP(sport=i, dport=8080)/str(i)
sendp(pkt, iface='h1-eth0')

3.运行结果

我们在设置流表上限最多为100条的情况下,可以看到在发送数据包个数大于100时,出现了数据包的丢包,同时在pox控制器端也出现了下发流表的报错

由于pox模块forwarding.l2_learning下发的流表带有hard_time字段,当数据包超过100后,新的数据包到来后,被交换机上报到控制器,但是在控制器下发流表回交换机的环节,因为流表达到上限,而旧的流表还没有过期,导致了无法install新的流表,数据包没有办法被处理,进而出现了丢包

4.结论

在实际场景,交换机的流表数量远远大于100,出现流表溢出的情况的可能性较低,但是可以看出,如果能有办法达到这个临界值的话,是可以造成交换机正常工作的。

其实只是要说明这个以上结论,只要将流表上限设为1,那么pingall命令都将会无法ping通,就已经足够说明危害了,但是该思路存在进一步改进的地方,毕竟去发送这么大的流量去溢出流表,似乎有点大材小用了,应该尝试去试着用小流量就可以造成流表操作的异常,当然,这也就和题目的dos不相干了。并且该危害也只影响到了交换机,对控制器没有影响,也不够威力

改进的方向

  • 继续朝着dos的方向,利用交换机的reactive模式下,会将数据包完整的上发给控制器,而不仅仅只是header,通常控制链路(交换机与控制器之间的链路)会比数据链路的数据容量小,那么就存在了可能性去利用这一点来影响控制器,又或者控制器连接处理的能力有限,使一台交换机不断的进行请求访问,让控制器没有剩余的能力去处理其他正常交换机的请求,来影响控制器服务
  • 针对交换机对flow_table的操作,不同的交换机实现不同,有的模块可能使用硬件,有的使用软件,有的交换机匹配流表的操作是使用软件,并且基于hash表的方式实现,来达到O(1)的性能,但是hash表是存在hash碰撞的可能性,如果人为的去制造这个碰撞,使得所有流表都是一样的hash值,那么查找和添加流表的性能就会远远低于O(1),进而影响处理交换机处理数据包的性能

测试dos攻击对openflow中flow_table溢出的影响的更多相关文章

  1. 安全测试===dos攻击和ddos攻击

    Dos攻击: dos攻击是Denial of Service的简称,即拒绝服务,造成DoS的攻击行为被称为DoS攻击,其目的是使计算机或网络无法提供正常的服务 DoS攻击是指故意的攻击网络协议实现的缺 ...

  2. 转帖:对linux中半增加半连接数量和防止服务器被dos攻击

    .增大队列SYN最大半连接数 在Linux中执行命令"sysctl -a|grep net.ipv4.tcp_max_syn_backlog",在返回的"net.ipv4 ...

  3. dos攻击

    概念理解 DoS到底是什么?接触PC机较早的同志会直接想到微软磁盘操作系统的DOS--DiskOperationSystem?不,此DoS非彼DOS也,DoS即DenialOfService,拒绝服务 ...

  4. DOS攻击之详解--转载

    源地址没有找到,间接引用地址:http://wushank.blog.51cto.com/3489095/1156004 DoS到底是什么?接触PC机较早的同志会直接想到微软磁盘操作系统的DOS--D ...

  5. Linux下的DOS攻击

    Linux下的DOS攻击 DOS是Denial of service的简称,即拒绝服务,造成Dos攻击行为被称为Dos攻击,其目的是使计算机或网络无法提供正常的服务.最常见的Dos攻击有计算机带宽攻击 ...

  6. XSS的DOS攻击之 server limit dos

    墨西哥同学周末很郁闷的在宾馆上网,发现youtube被ban了,于是写个了tool解决这个问题.顺带想到了一种利用 google 统计的漏洞,写在这里了 http://sirdarckcat.blog ...

  7. HashMap出现Hash DOS攻击的问题

    随着RESTful风格的接口普及,程序员默认都会使用json作为数据传递的方式.json格式的数据冗余少,兼容性高,从提出到现在已被广泛的使用,可以说成为了Web的一种标准.无论我们服务端使用什么语言 ...

  8. [典型漏洞分享]上传导致的应用层DOS攻击

    YS 视频封面设置功能可上传大量图片,可进行资源消耗型DOS攻击[中] 问题描述:          YS允许用户为设备设置封面,后台在处理时允许用户间接可控上传图片的二级路径以及直接可控保存图片的文 ...

  9. SlowHTTPTest-慢速DoS攻击

    Slowhttptest是一个依赖于实际HTTP协议的Slow HTTP DoS攻击工具,它的设计原理是要求服务器所有请求被完全接收后再进行处理. SlowHTTPTest是一款对服务器进行慢攻击的测 ...

随机推荐

  1. .3-浅析express源码之applicaiton模块(2)-app.render

    这个模块还漏了一个稍微复杂点的API,就是app.render,首先看官网的定义: app.render(view, [locals], callback) view为对应的文件名,locals为一个 ...

  2. 记一次Java AES 加解密 对应C# AES加解密 的一波三折

    最近在跟三方对接 对方采用AES加解密 作为一个资深neter Ctrl CV 是我最大的优点 所以我义正言辞的问他们要了demo java demo代码: public class EncryptD ...

  3. leetcode916

    单词子集 我们给出两个单词数组 A 和 B.每个单词都是一串小写字母. 现在,如果 b 中的每个字母都出现在 a 中,包括重复出现的字母,那么称单词 b是单词 a 的子集. 例如,“wrr” 是 “w ...

  4. Magic Number (zoj3622)

    Magic Number (zoj3622) Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Oth ...

  5. deferred对象详解

    什么是Deferred对象  defer,推迟:延期.含义就是”延迟”到未来某个点再执行. 在开发中,我们经常遇到某些耗时很长的javascript操作.其中,既有异步的操作(比如ajax读取服务器数 ...

  6. mysql数据库操作指令

    数据库相关 查询所有数据库 show databases; 创建数据库 create database 数据库名: 创建数据库指定字符集 create database 数据库名 character ...

  7. ActiveReports 报表应用教程 (11)---交互式报表之文档目录

    通过文档目录,用户可以非常清晰的查看报表数据结构,并能方便地跳转到指定的章节,最终还可以将报表导出为PDF等格式的文件.本文以2012年各月产品销售分类汇总报表为例,演示如何在葡萄城ActiveRep ...

  8. PDO添加数据的预处理语句

    1.添加页面<h1>添加数据</h1><form action="chuli.php" method="post"> < ...

  9. C#和C++互相操作 结构体数组的传递

    C++中结构体定义: typedef struct // 平面 { double time;  float normal[3]; float center[3];  } plane; C++中方法声明 ...

  10. Java语法基础(四)----循环结构语句

    一.循环结构: 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则 ...