91网络-记录网络的点滴

当前位置:首页 - 网络知识 - Network Security - 正文

君子好学,自强不息!

sFlow流量监控实现DDoS防御

2020-03-16 | Network Security | 91ccie | 277°c
A+ A-

1 实验目的

  • 理解sFlow-rt的基本配置与操作;
  • 掌握通过floodlight进行DDoS防御的原理;
  • 掌握mininet中sFlow agent的配置过程;

2 实验原理

sFlow可以提供周期性的网络接口统计采样和数据包采样,能够提供各接口的流量信息,且几乎不会对被统计设备造成任何负担,管理成本极低。sFlow的部署分为两部分:sFlow agent和sFlow collector。sFlow agent内嵌入网络设备中获取设备的实时信息并封装成sFlow报文发送给sFlow collector。

此处的sFlow软件选择sFlow-rt,sFlow-rt可统计到每个接口的流量信息,我们通过sFlow-rt的rest api获取json数据并对json数据进行解析获得。对解析到的数据进行判断分析后即可实施策略。我们在DDoS攻击下可调用Floodlight的staticflowentrypusher丢弃DDoS攻击包进行防御。

3 实验任务

本次实验是在一台物理主机上完成实验拓扑,mininet部署,控制器部署和sFlow collector部署。通过mininet模拟一个switch和三台host,在mininet中配置sFlow agent,控制器选择Floodlight,sFlow collector选择sFlow-rt。

实验拓扑如下图:

4 实验步骤

4.1 搭建环境

创建mininet虚拟机、floodlight虚拟机和桌面版sFlow-rt虚拟机,并启动虚拟机。

4.2 启动验证sFlow-rt

登录虚拟机sFlow-rt并切换到sFlow-rt目录并启动sFlow-rt。

Shell cd ./home/sflow-rt ./start.sh
1 2 cd . / home / sflow - rt . / start .sh

打开firefox浏览器,在浏览器地址栏中输入http://localhost:8008。sFlow-rt的web页面如下所示。

4.3 创建控制器测试脚本

登录选择虚拟机floodlight,切换到floodlight/example目录,执行以下命令查询虚拟机交换机dpid。

Shell cd floodlight/example ./cli.py switch
1 2 cd floodlight / example . / cli .py switch

通过shift+pageup键可以向上翻阅命令行:

在输出结果中寻找dpid号如下:

切换到floodight安装目录下。

Shell cd ..
1 cd . .

执行以下命令创建文件,并使用vim命令编辑该文件。

Shell touch dropkt.json vim dropkt.json
1 2 touch dropkt .json vim dropkt .json

在dropkt.json文件中添加如下内容,switch对应的编号则为之前获取的虚拟机交换机dpid,请根据实际情况进行修改,编辑完成后保存退出。

Shell { “switch”:” 00:00:00:00:00:00:00:01”, “name”:”flow-mod-dropkt”, “cookie”:”0”, “priority”:”100”, “ingress-port”:”1”, “active”:”true”, “actions”:”drop”, }
1 2 3 4 5 6 7 8 9 {switch: 00 : 00 : 00 : 00 : 00 : 00 : 00 : 01,name:flow - mod - dropkt,cookie:0,priority:100,ingress - port:1,active:true,actions:drop, }

执行以下命令启动floodlight。

Shell java -jar target/floodlight.jar
1 java - jar target / floodlight .jar

4.4 创建拓扑

登录虚拟机mininet,在虚拟机/home/mininet目录下创建文件topo-1sw_3host.py,并添加内容。

Shell touch topo-1sw_3host.py vim topo-1sw_3host.py
1 2 touch topo - 1sw_3host.py vim topo - 1sw_3host.py

本实验拓扑结构的由Python脚本生成,请在topo-2sw_2host.py脚本中添加如下内容。

Shell """Custom topology example Two directly connected switches plus two hosts for each switch: host1 --- switch1 --- host3 | | host2 """ from mininet.topo import Topo class MyTopo( Topo ): "Simple topology example." def __init__( self ): "Create custom topo." # Initialize topology Topo.__init__( self ) # Add hosts and switches Host1 = self.addHost( 'h1' ) Host2 = self.addHost( 'h2' ) Host3 = self.addHost( 'h3' ) Switch1 = self.addSwitch( 's1' ) # Add links self.addLink( Host1, Switch1 ) self.addLink( Host2, Switch1 ) self.addLink( Host3, Switch1 ) topos = { 'mytopo': ( lambda: MyTopo() ) }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 """ Custom topology example Two directly connected switches plus two hosts for each switch :    host1 -- - switch1 -- - host3                |                |              host2 """ from mininet .topo import Topo   class MyTopo ( Topo ) :      "Simple topology example."        def __init__ ( self ) :          "Create custom topo."            # Initialize topology          Topo .__init__ ( self )                   # Add hosts and switches          Host1 = self .addHost ( 'h1' )          Host2 = self .addHost ( 'h2' )          Host3 = self .addHost ( 'h3' )          Switch1 = self .addSwitch ( 's1' )               # Add links          self .addLink ( Host1 , Switch1 )          self .addLink ( Host2 , Switch1 )          self .addLink ( Host3 , Switch1 )   topos = { 'mytopo' : ( lambda : MyTopo ( ) ) }

添加完成后保存退出。

执行以下命令启动Mininet,生成测试拓扑结构。

Shell screen mn --custom /home/mininet/topo-1sw_3host.py --topo mytopo --controller=remote,ip=10.0.0.37,port=6633 --switch ovsk,protocols=OpenFlow10
1 screen mn -- custom / home / mininet / topo - 1sw_3host.py -- topo mytopo -- controller = remote , ip = 10.0.0.37 , port = 6633 -- switch ovsk , protocols = OpenFlow10

说明
通过screen mn命令启动mininet,这样可以通过ctrl+a+d和screen –r命令进行系统命令行和mininet命令行之前的窗口切换。

请根据实际情况将ip为Floodlight的ip,添加protocols参数指定OpenFlow协议版本。
mn为mininet启动命令。

  • --mac指定虚拟主机的mac地址顺序编号,若不带此参数则随机编号
  • --controller指定of交换机的控制器
  • --switch指定虚拟交换机的类型,ovsk表示虚拟交换机为ovs Kernel mode
  • --custom指定自定义拓扑文件
  • --topo指定加载拓扑的名字

执行ctrl+a+d命令切换到系统命令行。

4.5 部署sFlow agent

网络拓扑创建完成后,需要在mininet中部署sFlow agent。

步骤1.在mininet环境中输入ifconfig命令查看当前网卡状态。

Shell ifconfig
1 ifconfig

网桥s1无IP,通过eth0端口是无法监控到Mininet内部两个主机的ping测试。

步骤2.执行以下命令把eth0端口IP复制给s1,由s1端口作为sFlow Agent来监听。

Shell ovs-vsctl add-port s1 eth0 ifconfig s1 10.0.0.36 netmask 255.255.255.248 ifcogfig eth0 0 up
1 2 3 ovs - vsctl add - port s1 eth0 ifconfig s1 10.0.0.36 netmask 255.255.255.248 ifcogfig eth0 0 up

步骤3.输入ifconfig |more命令查看配置后的各端口状态,如下图,s1已经得到eth0之前的IP和掩码,eth0无IP

Shell ifconfig |more
1 ifconfig | more

步骤4.输入screen –r命令切换到mininet命令行窗口,执行ping测试,检查端口是否配置正确。

Shell screen –r h1 ping h2
1 2 screen r h1 ping h2

如果ping通则ctrl+c终止测试,如果不通则仔细检查配置。

步骤5.执行crtl+a+d命令切换到虚拟机窗口。

步骤6.执行以下命令开启OvS的sFlow功能,并配置sFlow Agent。

Shell ovs-vsctl -- --id=@sflow create sflow agent=s1 target=\"10.0.0.35:6343\" header=128 sampling=10 polling=1 -- set bridge s1 sflow=@sflow
1 ovs - vsctl -- -- id = @ sflow create sflow agent = s1 target = \" 10.0.0.35 : 6343 \" header = 128 sampling = 10 polling = 1 -- set bridge s1 sflow = @ sflow

参数说明:

1)agent:虚拟机对应的某个监控流量的网卡,本实验用s1网卡产生和监控流量;
2)target:sFlow-rt的IP,默认端口6343;
3)bridge:需要开启sFlow的网桥;

注意:该命令执行的次数和需要开启sFlow的网桥的数目有关,有几个网桥,就需要执行几次此命令。

步骤7.输入如下命令查看已经配置的Agent信息。

Shell ovs-vsctl list sflow
1 ovs - vsctl list sflow

步骤8.在虚拟机窗口输入ip link命令,查看交换机端口名称与端口编号的映射关系。

如下图eth0对应的编号是2,s1对应的编号是19。

步骤9.查看sFlow agent是否配置成功。

1.登录sFlow-rt页面,查看Agents选项卡,如下图所示已将虚拟机mininet(10.0.0.36)加到监控对象。

2.单击“10.0.0.106”,进入该虚拟机所监控的端口列表页面,如下编号为19、2的端口都有监控,此处我们以“19.flows”为例,本实验主要的监控也是以“19.flows”为主。

3.单击“19.flows”进入端口监控页面。

4.6 ddos攻击和防御验证

步骤1.在mininet虚拟机中执行screen –r命令切换到mininet窗口。

Shell screen –r
1 screen r

步骤2.执行以下命令通过host1向host2泛洪的方式进行dos攻击。

Shell h1 ping –f h2
1 h1 ping f h2

步骤3.在floodlight安装目录中执行以下操作。
1.查询下发的交换机流表

Shell curl -X GET http://localhost:8080/wm/staticflowentrypusher/list/00:00:00:00:00:00:00:01/json
1 curl - X GET http : / / localhost : 8080 / wm / staticflowentrypusher / list / 00 : 00 : 00 : 00 : 00 : 00 : 00 : 01 / json

其中“00:00:00:00:00:00:00:01”为虚拟交换机的dpid。

sFlow-rt中的流量情况如下所示:

2 执行以下命令下流表Drop数据包。

Shell curl -X POST -d @dropkt.json http://localhost:8080/wm/staticflowentrypusher/json
1 curl - X POST - d @ dropkt .json http : / / localhost : 8080 / wm / staticflowentrypusher / json

slow-rt中的流量情况如下所示,从图中可以看出,h1向h2泛洪的包迅速的被完全的丢弃了。

3.执行命令删除交换机下发的所有流表

Shell curl -X GET http://localhost:8080/wm/staticflowentrypusher/clear/00:00:00:00:00:00:00:01/json
1 curl - X GET http : / / localhost : 8080 / wm / staticflowentrypusher / clear / 00 : 00 : 00 : 00 : 00 : 00 : 00 : 01 / json

其中“00:00:00:00:00:00:00:01”为虚拟交换机的dpid。

sFlow-rt中的流量情况如下所示,图中可以看出删除下发的drop流表后,泛洪的数据包流表又恢复了。

5 实验结论

流量监控是sdn中很重要的一个环节,我们在获取各个接口的实时信息后,可以实现很多的服务,比如负载均衡,QOS,流量工程等,做好sFlow与控制器的交互,完善流量监控的功能,可以为以后的各种服务提供帮助。

本文来源:91网络

本文地址:http://91ccie.com/?id=2004