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。
1 2 |
cd ./home/sflow-rt ./start.sh |
打开firefox浏览器,在浏览器地址栏中输入http://localhost:8008。sFlow-rt的web页面如下所示。
4.3 创建控制器测试脚本
登录选择虚拟机floodlight,切换到floodlight/example目录,执行以下命令查询虚拟机交换机dpid。
1 2 |
cd floodlight/example ./cli.py switch |
通过shift+pageup键可以向上翻阅命令行:
在输出结果中寻找dpid号如下:
切换到floodight安装目录下。
1 |
cd .. |
执行以下命令创建文件,并使用vim命令编辑该文件。
1 2 |
touch dropkt.json vim dropkt.json |
在dropkt.json文件中添加如下内容,switch对应的编号则为之前获取的虚拟机交换机dpid,请根据实际情况进行修改,编辑完成后保存退出。
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。
1 |
java -jar target/floodlight.jar |
4.4 创建拓扑
登录虚拟机mininet,在虚拟机/home/mininet目录下创建文件topo-1sw_3host.py,并添加内容。
1 2 |
touch topo-1sw_3host.py vim topo-1sw_3host.py |
本实验拓扑结构的由Python脚本生成,请在topo-2sw_2host.py脚本中添加如下内容。
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,生成测试拓扑结构。
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命令查看当前网卡状态。
1 |
ifconfig |
网桥s1无IP,通过eth0端口是无法监控到Mininet内部两个主机的ping测试。
步骤2.执行以下命令把eth0端口IP复制给s1,由s1端口作为sFlow Agent来监听。
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
1 |
ifconfig |more |
步骤4.输入screen –r命令切换到mininet命令行窗口,执行ping测试,检查端口是否配置正确。
1 2 |
screen –r h1 ping h2 |
如果ping通则ctrl+c终止测试,如果不通则仔细检查配置。
步骤5.执行crtl+a+d命令切换到虚拟机窗口。
步骤6.执行以下命令开启OvS的sFlow功能,并配置sFlow Agent。
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信息。
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窗口。
1 |
screen –r |
步骤2.执行以下命令通过host1向host2泛洪的方式进行dos攻击。
1 |
h1 ping –f h2 |
步骤3.在floodlight安装目录中执行以下操作。
1.查询下发的交换机流表
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数据包。
1 |
curl -X POST -d @dropkt.json http://localhost:8080/wm/staticflowentrypusher/json |
slow-rt中的流量情况如下所示,从图中可以看出,h1向h2泛洪的包迅速的被完全的丢弃了。
3.执行命令删除交换机下发的所有流表
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与控制器的交互,完善流量监控的功能,可以为以后的各种服务提供帮助。