一、实验环境简介:
Ubuntu 20.0.4
Ryu/Opendaylight+mininet+sflow(网络监视技术)+Apifox/postman(REST API流表控制工具)
二、软件定义网络知识图谱
三、SDN知识概述
1.SDN的三个主要特征:
网络开放可编程;
控制平面与数据平面分离;
逻辑上的集中控制;
2.SDN的架构:
应用程序通过北向接口,再到南向接口,对数据平面/转发层的控制;
东西接口,主要用于控制器集群之间的通信,用于增强整个控制平面的可靠性和可拓展性;
SDN控制平面通过下发指令到SDN数据平面,SDN数据平面反馈信息到控制平面;
SDN控制平面只关心如何编程去控制网络,不关心底层协议,而SDN数据平面将不同协议整合到匹配表,由SDN控制器负责调用。
3.SDN南向编程接口–OpenFlow
Openflow有多个版本,现在比较稳定的版本是1.3和1.0,此次实验用的是1.3。
Controller通过下发Openflow协议通道下发策略给Openflow交换机,openflow交换机就成了策略的执行者,例如controller下发流表项给openflow交换机,当数据包从端口进入到交换机且匹配流表项失时,就将数据包放到packet-in中并上报给controller,controller再下发流表项和packet-out(对数据的具体处理)来告诉交换机如何处理这个报文。在1.0的基础上,新增了组表和meter表,支持table-miss动作。
4.Openflow流表组成
Openflow流表组成,流表中含有若干流表项,每个流表项包括:
匹配域、优先级、计数器、指令、计时器、Cookie
5.组表的组成
组成号、类型、计数器、动作桶
6.Meter表的组成
主要用来计量和限速。
结构组成: 计量表号、计数带、计数器
从而实现QoS功能。
7.Openfow通道
即控制器和交换机交流信息的通道。它由三种类型的报文,如下:
控制器给交换机发送信息的报文
Features:有Request和Reply两种,Request用来请求交换机的特征信息和端口的特征信息,即属性。
Configuration:包括请求、回复、设置交换机的配置信息。
Modify-State:用于修改交换机的流表、组表、Meter表、端口的状态。
Read-State:用于获取交换机的流表、组表、Meter表、端口的状态。
Packet-out:用于响应Packet-in报文,经常跟随在Flow-Mod报文后,用来指挥匹配失败的报文,这个报文可以由控制器接收然后回馈给交换机,也可以是交换机匹配失败放到缓存中。
Barrier:分为Request和Reply两种,用于确保操作的执行顺序。
Role-Request:多控制器下,控制器用来请求角色。
Asynchronous-Configuration:异步配置。Asynchronous报文
packet-in:当数据报匹配流表项失败的时候,上交给Controller处理,或者存到交换机的缓存中。通过Packet-in报文通知交换机处理。
Flow-Removed:当一个流表项失效的时候, 每个流表项都有一个计时器,用来计算当前流表运行的时间,当然也有失效时间。
Port-Status:当端口状态发生变化的时候,通过该报文告知控制器。
Role-Status:告知控制器角色发生了变化。
Controller-Status:告知控制器Openflow的连接的变化。
Flow-Monitor:告知控制器流表的改变。Symmetric报文
控制器或者交换机任意一方发送的报文,无需得到对方的邀请和许可。
Hello:通道建立初期,用来协商版本。
Echo:用于测试时延和带宽。
Error:一般交换机告知控制器请求发生错误。
Experimenter:用于实验场景的报文。
交换机向控制器发起TCP连接建立请求之后,执行如下过程。
四、DDoS攻击原理
当数据包到交换机后根据OpenFlow协议的转发机制,和流表匹配的数据包按规则转发,无法和流表项匹配的数据包就会以Packet_ in消息通过南向接口,上交至控制器处理,计算路由策略,并下发流表项规则至交换机。当攻击者向SDN网络中的受害主机发动DDoS攻击时,一般使用大量的经过伪造IP地址和端口的攻击数据包发送到网络中,这时将产生大量Packet_in消息,快速的消耗控制器和交换机之间安全信道的带宽以及控制器系.统资源。影响正常数据包的发送。
主动防御技术
通过Floodlight控制器向OpenFlow交换机下发流表,抑制攻击流量。流表是交换机进行转发策略控制的核心数据结构。交换机芯片通过查找流表项来决策进入交换机网络的数据包执行适当的处理动作。可以理解为交换机收到数据包之后该做什么的一系列规则。下发一条流表好比一条指令,告诉交换机收到数据包之后该做什么。
OpenFlow每个流表项由三个部分组成:用于数据包匹配的包头域(Header Fields),用于统计匹配数据包个数的计数器(Counters),用于对匹配的数据包如何处理的动作(Actions)包头域:OpenFlow流表的包头域(OpenFlow v1.1之后被称作匹配域),用于对交换机接收到的数据包的包头内容进行匹配。在OpenFlow v1.0中,流表的包头域中包括了12个元组。
五、实验过程
///
终端1:
安装curl:sudo apt install curl
安装sflow:
下载安装包:wget http://www.inmon.com/products/sFlow-RT/sflow-rt.tar.gz,
解压安装包:tar -zxvf sflow-rt.tar.gz
查看安装包:ls
查看路径:pwd
输入命令cd sflow-rt,
然后启动:./start.sh,
看到下列信息证明启动成功。其中 6343 是sFlow Collector 的默认端口,
8008 则是 sFlow 的WebUI端口。
(注意:执行sflow-rt需要先配置好jdk,否则会报Java不存在的错误,具体配置过程见opendaylight实验手册)
///
终端2:
(1)RYU:ryu-manager命令启动ryu控制器,并且打开ofctl_rest.py和simple_switch.py,作为交换机的转发规则
启动命令:ryu-manager ofctl_rest.py simple_switch.py
(2)ODL直接启动
///
终端3:
在miniedit中构建网络拓扑,并设置控制器为远程控制器,s1-s2交换机的地址为10.0.0.001-10.0.0.002,h1-h4主机的IP地址分别为10.0.0.1-10.0.0.4
可保存脚本运行、可直接图形化界面运行,但是要确保链路能正常通信;
下发流表划分vlan:vlan0:h1,h3,其余划分vlan1
/
终端4:
配置sFlow Agent,虚拟交换机配置sFlow Agent,sFlow Collector 才能收集到流量信息进行分析和呈现。键入以下指令部署sFlow Agent:
sudo ovs-vsctl -- --id=@sflow create sflow agent=s1-eth0 target=\"127.0.0.1:6343\" sampling=10 polling=20 -- -- set bridge s1 sflow=@sflow上述命令的主要意思如下:1)agent:监控s1-eth0 网卡产生的流量;s1-eth0是为s1创建的端口;2)target:sFlow-RT的IP,默认端口6343;3)bridge:需要开启sFlow的网桥;4)sampling:采样率,表示每隔N个Packet就取样一次5)polling:轮询时间,每隔N秒polling一次(提示:如果有N个网桥,就需要执行N次部署 sFlowAgent 的指令,我们本次实验中只有一个网桥,所以执行一次就可以了。)
查看已经配置的 sFlow Agent信息,通过命令:sudo ovs-vsctl list sflow
使用命令ip link,可以查看虚拟交换机端口与端口编号的映射
Agent 是否配置成功,我们可以通过其WebUI进行查看,在浏览器中输入网址http://127.0.0.1:8008/html/index.html,可以看见各项监控状态。
///
终端5:运行 sflow-rt/get-app.sh sflow-rt flow-trend然后将之前的sFlow重新启动,点击sFlow中Apps或者:
浏览器访问:http://localhost:8008/app/flow-trend/html/index.html
然后分别在Keys,Value列输入:ipsource,ipdestination,stack、bytes ,然后点击右面的 Submit提交,然后将自动转到图形化流量监控页面。
///
终端3:
在mininet窗口下:
使用如下指令,打开 Host1,和Host3的终端:xterm h1 h3
然后在 Host1 上启动一个 http 服务python3 -m http.server 80&在h3的窗口ping h1的地址,在sflow的页面中观察流量走向;
///
终端6:
运行抓包工具,抓取对应网卡的包查看报文信息
/
模拟Ddos攻击
///
终端3:
DDoS模拟攻击,在 mininet 终端中执行,h3 ping -f h1 ,
-f 参数的意思就是 Ping Flood ,模拟 Flood Attack。h3 ping –f h1
观察交换机的流量走向
//
终端6:
运行抓包工具,抓取对应网卡的包查看报文信息
/
查看表盘CPU的占用率
Ddos防御
监测到流量异常之后,需要利用控制器向OpenFlow交换机下发流表,抑制攻击流量。
由于前面的DDoS采用的ping洪范攻击,因此我们需要下发流表,将攻击流down掉,因此利用postman添加流表
///
终端7:
拷贝安装包至终端
安装包:sudo dpkg -i 这是要安装的软件包名称
如果遇到依赖不全的问题,再输入sudo apt install -f
安装完成后直接双击打开
首先进入Apifox,利用get操作可以获得已有的流表,所以url填http://ryu或者ODL/stats/flow/1
(2)添加流表操作,为了抑制攻击流,我们下发流表控制从交换机的端口1经过的流量,url为http://ryu/odl/stats/flowentry/add,功能选择post方式,在Body中选择JSON进行流表的编写。dpid代表交换机的号;priority表示优先级,优先级数字越大表示越优先处理;在match写入的in_port代表交换机输入端口为1的端口;dl_type字段代表ip协议,其中2048的16进制0x0800代表ipv4协议;nw_proto代表:ip协议上搭载的协议类型,其中1代表icmp协议;在本实验中也就是h1连接交换机的端口,actions中为空,表示交换机对于h1的流量不作任何处理。编写完成后,点击send进行流表下发,如果发送成功会返回200OK。
'''
POST http://localhost:8080/stats/flowentry/add
{"dpid": 1,"cookie_mask":1,"table_id":0,"idle_timeout":30,"hard_timeout":30,"priority":65535,"flags":1,"match":{"in_port":1,"dl_type":2048,"nw_proto":1},"actions":[]
}
'''
下图分别是"idle_timeout","hard_timeout"为10,20,30抑制的情况。