还是需要实现流量监控然后入侵检测或者恶意流量分析之类的,如果真的流量分析的话需要好多知识,什么配置策略,还能用神经网络之类的。这我就试着用现成的工具防一下DDOS吧,防一下ping举个例子。
还是离不开SDN,就floodlight+sflow,这个是我看了好多种得出来的,感觉比较好实现,这是最主要的啊。
准备
floodlight
由于floodlight是基于java的,而且要求1.8以上,因此需要先安装jdk和ant。ant是阿帕奇的java生成工具。
我用的是centos自带java,然后我又升级了,jdk给我升级到1.8了,我就不需要升级了。
安装eclipse
安装依赖
好像还可以直接把项目配置到eclipse里面,我没发现这步有什么用,为了二次开发吗?
要安装四个东西,我这里装了ant和maven和相关依赖,第一个和第四个没有,需要手动安装吧
yum install build-essential ant maven python-dev -y
安装build-essential,执行这个命令
yum groupinstall "Development Tools"
安装python-dev,找不到是因为名字改了,叫python-devel
yum install python-devel
安装floodlight
Floodlight是Apache授权并且基于JAVA开发的企业级OpenFlow控制器,它的稳定性、易用性已经得到SDN专业人士以及爱好者们的一致好评,并因其完全开源,这让SDN网络世界变得更加有活力。控制器作为SDN网络中的重要组成部分,能集中地灵活控制SDN网络,为核心网络及应用创新提供了良好的扩展平台。
这里需要从github下载源码自行编译
git clone git://github.com/floodlight/floodlight.git
但是很卡,我找到了一个百度网盘,不知道什么版本的floodlight,下载好以后,解压,进入目录执行ant
直接生成就行了。然后运行,通过输出信息可以看到是运行在8080端口的
java -jar target/floodlight.jar
可以登录localhost:8080/ui/index.html
进入页面,但是此时会报错
解决方案就是执行,但是必须需要一个仓库才行,就是说必须得使用git下载,或者就要使用旧版floodlight。
git submodule init
git submodule update
ant
可以在这里找到http://www.projectfloodlight.org/download/
历史版本下载,同样很慢,只能慢慢等了。好像稳定的是0.91版本,下载tar.gz格式,不知道为什么zip下载好慢。
在我试了好几个版本以后,这里面的1.2是可以用的,0.9x版本在运行的时候会越界,出现蜜汁问题。
下载1.2版本以后,执行ant
生成代码,执行java -jar target/floodlight.jar
,登录localhost:8080/ui/index.html
即可访问页面了。
SFlow
sFlow可以提供周期性的网络接口统计采样和数据包采样,能够提供各接口的流量信息,且几乎不会对被统计设备造成任何负担,管理成本极低。
sFlow的部署分为两部分:sflow agent和sflow collector。sflow agent内嵌入网络设备中获取设备的实时信息并封装成sFlow报文发送给sflow collector。sflow collector汇总后得出统计数据。
sFlow-rt
sFlow软件选择sFlow-rt,sFlow-rt可统计到每个接口的流量信息,我们通过sFlow-rt的rest api获取json数据并对json数据进行解析获得。对解析到的数据进行判断分析后即可实施策略。我们在DDoS攻击下可调用Floodlight的staticflowentrypusher丢弃DDoS攻击包进行防御。
下载sflow-rt源码,下载很慢,外网,但是还能忍,挺快的
wget http://www.inmon.com/products/sFlow-RT/sflow-rt.tar.gz
然后解压,进入目录sflow-rt
执行./start.sh
运行,输出信息不多,访问localhost:8008
就可以进入web界面了。
这里只有几个图的原因是这是sflow3.0,应该用历史版本,比如2.0才可以显示具体的信息
好像3.0不会可视化但是有很多API可以用。
地址组
定义地址组
curl -H "Content-Type:application/json" -X PUT --data "{external:['0.0.0.0/0'],internam:['10.0.0.0/24']}" http://localhost:8008/group/mygroup
这样查询
curl -X GET localhost:8008/group/json
流
定义流,这里我把frames改成bytes了。
curl -H "Content-Type:application/json" -X PUT --data "{keys:'ipsource,ipdestination', value:'frames', filter:'sourcegroup=external&destinationgroup=internal'}" http://localhost:8008/flow/incoming/json
可以通过如下命令查询
curl -X GET localhost:8008/flow/json
删除流
curl -H "Content-Type:application/json" -X DELETE http://localhost:8008/flow/incoming/json
阈值
定义阈值
curl -H "Content-Type:application/json" -X PUT --data "{metric:'ddos',value:5000}" http://localhost:8008/threshold/incoming/json
查询
curl -X GET localhost:8008/threshold/json
sFlowTrend
下载地址https://inmon.com/products/sFlowTrend.php#download
,外网。
下载好rpm包以后,直接安装
rpm -i sFlowTrand-7.0.1
安装以后的软件名字叫sFlowTend-7.0.1-1.i386。
可以通过rpm -q sFlowTend-7.0.1-1.i386
查询有没有安装,卸载的话是rpm -e xxx
。
但是我不知道怎么启动。。。
安装目录好像是在/var/local/sflowtrend-pro
。
然后直接访问localhost:8087
好像就可以进入web页面了。
配置
sFlow-rt
刚才装的其实是sFlow Collector,sFlow Agent需要在交换机配置一下。
开启ovs的sflow功能,配置sflow。
- agent:虚拟机对应的某个监控流量的网卡,用br-ex网卡产生和监控流量
- target:sFlow Collector的IP,默认端口6343,本机就是192.168.1.106
- bridge:需要开启sflow的网桥,我就用的br-ex桥接外部网络
执行如下命令
ovs-vsctl -- --id=@sflow create sFlow agent=br-ex target=\"192.168.1.106:6343\" header=128 sampling=64 polling=1 -- set bridge br-ex sflow=@sflow
会生成一个UUID,可以查看一下当前sflow配置。
这时候登录sflow的web页面其实就可以看到了,但是因为是新版本,所以只有一些没有用的东西。
sFlowTrend
执行如下命令,添加sflow,并且生成一个UUID。
本来昨天我有一个的,不知道为什么今天打开发现没了,难道是一次性的?
这里的sampling和polling好像是采样速率什么玩意。两种配置,一个是512和10,另一个是64和1.没发现什么区别,除了纵座标变大了
ovs-vsctl -- --id=@sflow create sflow agent=br-ex target=\"192.168.1.106:6343\" header=128 sampling=512 polling=10 -- set bridge br-ex sflow=@sflow
执行ovs-vsctl list sflow
可以查看sflow的配置
访问网址localhost:8087
,可以看到已经绑定了一个switch,而且有两个接口,这两个接口其实就是br-ex上面的两个端口。
如果想删除的话,执行下面命令就好,但是我好像删了以后他还是在监听。
ovs-vsctl remove bridge br-ex sflow [UUID]
ovs控制器
OpenStack使用的是OpenvSwitch虚拟交换机,这个东西不仅支持openflow协议,比如可以配置sflow、netflow之类的,而且它自带一个控制器,有自己的流表。
执行ovs-ofctl --help
可以查看帮助。
已经知道了交换机的网桥是br-int,执行ovs-vsctl show br-int
查看一下接口
查看流表ovs-ofctl dump-flows br-int
。
可以看到有我的实例的IP,应该就差不多是这个桥了。
控制器监听的6633端口,而floodlight是6653。
这里流表中的resubmit()的action表示的是流表的跳转。
floodlight【错误】
执行如下命令给网桥添加一个接口,本来好像就有controller,是tcp:127.0.0.1:6633
,现在改成ip地址了。
ovs-vsctl set-controller br-ex tcp:192.168.1.106:6633
但是很奇怪,当是tcp:127.0.0.1:6633
的时候显示isconnected,改成192.168.1.106的时候就不显示了。
而且监控不上了,不知道如果默认127.0.0.1:6633会怎么样。
将网桥br-ex连接到指定控制器
ovs-vsctl set-controller br-ex tcp:192.168.1.106:6633
执行ovs-vsctl show
查看一下br-ex,可以看到br-ex的控制器已经改了,但是没有isconnected了,这时候进入floodlight也没显示。
这时候有一个被动控制器,可以通过ovs-vsctl get-manager
查看,是ptcp:6640:127.0.0.1
,也就是这里奇怪的那个Manager。我试试修改这个。
ovs-vsctl set-manager tcp:192.168.1.106:6633
随后再次执行<voc-vsctl show,可以看到Manager已经变了,但是isconnected又没了。然而还是没有反应。
是不是我的网桥有问题呢
floodlight【正确】
找到问题了,端口号有问题。
在floodlight文件夹的src/main/resources
路径下,找到floodlightdefault.properties和learningswitch.properties这两个配置文件,在后面的文件里面可以找到监听的端口,我这里是6653端口,而我一直以为是6633.
重新来
ovs-vsctl set-controller br-ex tcp:192.168.1.106:6653
这时候查看一下ovs-vsctl show
,可以看到修改好了
但是此时还没有connected,因为没有开floodlight,启动floodlight,再查看一下就连接了
登录localhost:8080/ui/index.html
,就可以看到switch了。
有个不大不小的问题,更换了控制器以后,原先的流表都会清空,这应该就是为什么连接floodlight以后ping不通的原因了吧
有了有了,添加下面的流表项,可以实现实例之间的通信,但是实例和虚拟机还是不太行。我也不知道为什么这么配置就好了。
curl -d '{"switch": "00:00:0a:43:ff:3d:03:43", "name":"my-flow1", "cookie":"0","priority":"32768","ingress-port":"100","active":"true", "actions":"output=flood"}' http://192.168.1.106:8080/wm/staticflowpusher/json
curl -d '{"switch": "00:00:0a:43:ff:3d:03:43", "name":"my-flow2", "cookie":"0","priority":"32768","ingress-port":"101","active":"true", "actions":"output=flood"}' http://192.168.1.106:8080/wm/staticflowpusher/json
执行curl -X GET http://192.168.1.106:8080/wm/staticflowpusher/list/00:00:0a:43:ff:3d:03:43/json
查看流表。
OVS命令
应用
一
大致就是,使用sflow监控流量,如果有什么异常,就调用floodlight的api进行处理。
打开horizon,把两个实例启动了。好像我又快没内存了。
但是这时候实例没有IP地址了,Network is unreachable。
重启了一下就好了。
这时候呢,实例ping的话检测不到好像,查了一下OpenStack实例连接的网桥好像是br-int,不是我自己修改连接网卡的br-ex,把上面配置中的br-ex都换成br-int,差不多就行了。
虽然这时候访问sFlowTrend还是不显示Hosts主机,但是在实例中ping的时候可以看到有流量经过的,我这里是br-int网桥的20接口。
下面应该模拟一下ping flood攻击看看流量能有多大。
但是又有问题了,启动floodlight以后流量都被截断了,我也不知道是因为什么
我知道原因了,在更换控制器为floodlight以后,流表都会清空,但是不知道为什么forwarding转发模块没有用,要是想更换一下的话需要自己把流表重新添加了。
二
用虚拟机ping实例发现好多接口都有收到好像,多到少是15、17、14、24,我也不知道这个接口是什么。
暂时也没有了
三
直接使用ovs自带的流表,命令是ovs-ofctl
。
查看流表ovs-ofctl dump-flows br-int
。
添加流表,这样就可以屏蔽源主机了,可以换成nw_dst
,就是目标主机,还可以添加优先级priority
,数字越高越优先还是越低,应该是越高。
ovs-ofctl add-flow br0 idle_timeout=0,dl_type=0x0800,nw_src=xx.xx.xx.xx,actions=drop
可以这么设置然后禁止访问,允许访问的话还没看出来。
然后试试使用脚本使用api获取数据然后执行。
参考链接
解决Floodlight1.2+Mininet问题及使用安装 - yuxinliu
实验一:控制器软件源码获取、安装、编译和运行
sFlow的安装和使用 - AsNeverBefore
openvswitch配置sflow进行网络监控 - wsjhk
sflowtrend配置 - juewuer
SDN平台搭建,ovs+floodlight 亲测有效 - c2501902968
openstack新建虚机、网络、路由时候对应的ovs网桥的变化 - juandx
【openstack/neutron】OVS_Neutron_Plugin网络隔离的实现及与控制器的兼容问题 - AzYet