完成本课题需要做的工作包括
- 理解软件定义网络(Software-Defined Networking,SDN)的基本概念和原理。
- 设计并搭建一个SDN网络实验环境,包括控制器、交换机和主机等设备。
- 了解SDN网络中存在的攻击类型,例如DDOS攻击;学习并掌握DDOS攻击原理。
- 理解sFlow-rt的基本配置与操作;
- 掌握通过floodlight进行DDoS防御的原理;
- 掌握mininet中sFlow agent的配置过程;
实验环境
一台Ubuntu22.04虚拟机,配置有mininet、ryu控制器、Apifox、sFlow-rt 3.0等工具。
实验过程
1.启动mininet端,首先构造一个拓扑,拓扑的python代码如下
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController
class MyTopo(Topo):
def build(self):
s1 = self.addSwitch('s1')
h1 = self.addHost('h1', ip='10.0.0.1/24')
h2 = self.addHost('h2', ip='10.0.0.2/24')
h3 = self.addHost('h3', ip='10.0.0.3/24')
self.addLink(h1, s1)
self.addLink(h2, s1)
self.addLink(h3, s1)
if __name__ == '__main__':
topo = MyTopo()
net = Mininet(topo=topo, controller=RemoteController)
net.start()
net.pingAll()
net.interact()
net.stop()
该代码构成的拓扑图如下
2.以指定命令启动mininet并运行该拓扑
sudo mn --controller=remote,ip=127.0.0.1,port=6653 --switch=ovsk --topo=single,3 --mac --custom my_topo.py
这里需要注意应该指定mininet启动的端口,如果mininet启用默认端口,后续则会和Ryu控制器默认端口冲突导致Ryu控制器启动失败。
3.启动Ryu控制器接管该拓扑中的控制器
ryu-manager --observe-links ryu/ryu/app/gui_topology/gui_topology.py ryu/ryu/app/simple_switch_13.py
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
./start.sh
5.在浏览器中输入网址localhost:8008/html/index.html,我们可以通过其WebUI进行查看Agent 是否配置成功,配置成功的话可以看见各项监控状态。
6.我们现在切换到mininet终端
使用如下指令:xterm h1 h2
,打开 Host1,和Host2的终端;
然后在 Host1 上启动一个 http 服务:python3 -m http.server 80&
此时让h2正常的 ping h1,观察此时的情况,未发现异常。
7.现在开始模拟DDoS攻击
在h2终端上使用命令 h2 ping -f 10.0.0.1
再观察此时的情况
8.现在进行DDOS防御
我们在监测到流量异常之后,需要利用RYU控制器向OpenFlow交换机下发流表,抑制攻击流量。由于前面的DDoS采用的ping洪范攻击,因此我们需要下发流表,将攻击流down掉,因此利用Apifox添加流表。具体操作:首先进入Apifox,利用get操作可以获得已有的流表,所以url填http://localhost:8080/stats/flow/1
为了抑制攻击流,我们需要添加流表。
我们下发流表控制从交换机的端口1经过的流量,url填写为 http://localhost:8080/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进行流表下发,如果发送成功会返回200 OK。
{
"dpid": 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": []
}
参考文献:
Ubuntu22.04安装mininet和ryu:
https://blog.csdn.net/2301_76203161/article/details/135979942
SDN实验:使用mininet和RYU实现DDoS攻击与防御模拟:
https://blog.csdn.net/weixin_45236003/article/details/132622991
sFlow-rt 3.0流量监控工具安装部署及简单实验:
https://blog.csdn.net/Call_Me_JHZ/article/details/105465768
Mininet+Ryu安装教程_ubuntu安装mininet和ryu最新csdn
https://blog.csdn.net/2401_84010784/article/details/137664161