OpenStack(Rocky)配置sFlow+floodlight实现简单SDN

还是需要实现流量监控然后入侵检测或者恶意流量分析之类的,如果真的流量分析的话需要好多知识,什么配置策略,还能用神经网络之类的。这我就试着用现成的工具防一下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进入页面,但是此时会报错
image-1
解决方案就是执行,但是必须需要一个仓库才行,就是说必须得使用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即可访问页面了。
image-2

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界面了。
image-3
这里只有几个图的原因是这是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配置。
iamge-4
这时候登录sflow的web页面其实就可以看到了,但是因为是新版本,所以只有一些没有用的东西。
image-5

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的配置
image-6
访问网址localhost:8087,可以看到已经绑定了一个switch,而且有两个接口,这两个接口其实就是br-ex上面的两个端口。
image-7
如果想删除的话,执行下面命令就好,但是我好像删了以后他还是在监听。
ovs-vsctl remove bridge br-ex sflow [UUID]

ovs控制器

OpenStack使用的是OpenvSwitch虚拟交换机,这个东西不仅支持openflow协议,比如可以配置sflow、netflow之类的,而且它自带一个控制器,有自己的流表。
执行ovs-ofctl --help可以查看帮助。
已经知道了交换机的网桥是br-int,执行ovs-vsctl show br-int查看一下接口
image-13
查看流表ovs-ofctl dump-flows br-int
image-14
可以看到有我的实例的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,可以看到修改好了
image-8
但是此时还没有connected,因为没有开floodlight,启动floodlight,再查看一下就连接了
image-9
登录localhost:8080/ui/index.html,就可以看到switch了。
image-10
有个不大不小的问题,更换了控制器以后,原先的流表都会清空,这应该就是为什么连接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命令

这应该是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接口。
image-11
下面应该模拟一下ping flood攻击看看流量能有多大。
但是又有问题了,启动floodlight以后流量都被截断了,我也不知道是因为什么
我知道原因了,在更换控制器为floodlight以后,流表都会清空,但是不知道为什么forwarding转发模块没有用,要是想更换一下的话需要自己把流表重新添加了。

用虚拟机ping实例发现好多接口都有收到好像,多到少是15、17、14、24,我也不知道这个接口是什么。
image-12
暂时也没有了

直接使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章