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

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