軟件定義網絡(英語:software-defined networking,縮寫做 SDN)是一種新型網絡架構。它利用OpenFlow協議將路由器的控制平面(control plane)從數據平面(data plane)中分離,改以軟件方式實現。該架構可以使網絡管理員在不更動硬件設備的前提下,以中央控制方式用程序從新規劃網絡,爲控制網絡流量提供了新方案,也爲核心網絡和應用創新提供了良好平臺。Facebook與Google都在他們的數據中心中使用OpenFlow協議,併成立了開放網絡基金會來推進這個技術。(來源:Wikipedia)php
Mininet是一個強大的網絡仿真平臺,經過這個平臺,咱們能夠很方便的模擬真實環境中的網絡操做與架構。特別是SDN,在真實網絡中進行相關的網絡實驗有必定難度,天然須要一個仿真平臺能夠學習這種新型的網絡架構,而Mininet就應運而生,承擔了這個光榮而艱鉅的使命。
Mininet自帶交換機(switchs)、主機(hosts)、控制器(controllers),同時,在mininet上能夠安裝OpenvSwitch、多種控制器(NOXPOXRYUFloodlightOpenDaylight等),同時,Mininet能夠運行在多種操做系統上(windowslinuxMac OS),具備很強的系統兼容性。最使人興奮的一點是:在Mininet上進行的實驗,能夠無縫的移到真實的環境中去(官方是這麼說的)【來源:CSDN】
Mininet官網:http://mininet.org/node
Floodlight是Apache受權並基於JAVA開發的企業級OpenFlow控制器,當前最新版本是1.2。linux
Floodlight OpenFlow Controller -ProjectFloodlight:http://www.projectfloodlight....web
sFlow是一款適用於高速交換網絡中的監控軟件,能夠實時監測網絡流量,sFlow須要交換機支持才能使用,而OpenvSwitch支持這個功能。sFlow監控工具由sFlow Agent和sFlow Collector兩部分組成。Agent做爲客戶端,通常內嵌於網絡轉發設備(如交換機、路由器),經過獲取本設備上的接口統計信息和數據信息,將信息封裝成sFlow報文發送到指定的Collector。Collector做爲遠端服務器,負責對sFlow報文分析、彙總、生成流量報告。
sFlow-RT:https://inmon.com/products/sFlow-RT.phpjson
1)啓動Floodlight控制器
Floodlight 的WebUI端口是8080,咱們能夠用瀏覽器訪問它segmentfault
2)構建拓撲
保持 Floodlight 運行的終端,再新開一個終端窗口,輸入以下指令,構建咱們所需的拓撲結構。windows
命令解釋:瀏覽器
sudo:以管理員權限運行,由於mininet要調用內核的東西 mn:就是mininet的命令簡寫 --controller=remote:使用遠程的控制器 ip,port:控制器的ip和端口 --topo:指定拓撲類型,single 就是單一拓撲,就是最簡單的交換機下面接主機,後面的3 表示,三臺主機。
建立過程很是快,相似這樣:安全
當你看到 mininet>
標識符,表示拓撲建立完成,咱們能夠輸入一些指令查看網絡拓撲。服務器
nodes
指令顯示節點信息:
links
指令顯示鏈路信息:
還有檢測網絡鏈路連通性狀況的pingall
指令:
想使用更多指令,能夠鍵入 help
進行查看:
在Floodlight 的WebUI中查看拓撲結構
1) 啓動sFlow-RT
保持Mininet 運行的終端,再新開一個終端窗口,輸入以下指令,啓動sFlow-RT。
能夠看到以下信息:
其中 6343 是sFlow Collector 的默認端口,8008 則是 sFlow 的WebUI端口。
2) 配置sFlow Agent
咱們須要在虛擬交換機配置sFlow Agent,這樣sFlow Collector 才能收集到流量信息進行分析和呈現。
鍵入如下指令部署sFlow Agent :
指令說明:
1)agent:監控 eth0 網卡產生的流量;
2)target:sFlow-RT的IP,默認端口6343;
3)bridge:須要開啓sFlow的網橋;
4)sampling:採樣率,表示每隔N個Packet就取樣一次
5)polling:輪詢時間,每隔N秒polling一次
提示:若是有N個網橋,就須要執行N次部署 sFlowAgent 的指令,咱們本次實驗中只有一個網橋,因此執行一次就能夠了。
經過以下指令能夠查看已經配置的 sFlow Agent
信息:
輸入ip link
指令能夠查看,虛擬交換機端口與端口編號的映射
能夠看到s1 交換機對應的編號是4,交換機鏈接host1的端口對應的編號是5,依次類推。
查看sFlow Agent 是否配置成功,咱們能夠經過其WebUI進行查看:
能夠看到已經添加到了監控對象,點擊查看詳情:
看到各個端口的各類信息,可是好像沒有咱們須要的流量信息,咱們先添加一個,點擊頁面上的 Flows 選項
而後分別在Name ,Keys,Value,Filter
列填入:flows;ipsource,ipdestination,stack;bytes;留空
,而後點擊下面的 Submit
提交
而後再回到 Agent
選項,查看監控的詳情,就能看到 Flows
信息了(提示:如仍是看不到 flows
,可在 mininet 控制檯中執行 pingall
產生流量 。)
點擊 5.flows
進去便可查看交換機1號端口的流量詳情
而後切換到mininet
控制檯窗口,使用以下指令,打開 Host1,和Host2的終端:
而後在 Host1 上啓動一個 http
服務
在 Host2 上 ping
Host1
而後去觀察流量
能夠看到,流量很正常,在 Host2 終端中能夠按 Ctrl+c
,中止ping。能夠試試訪問一下 Host1的HTTP服務。
2)DDoS攻擊檢測
接下來,咱們進行DDoS 模擬攻擊,在 mininet
終端中執行,h2 ping -f h1
,-f
參數的意思就是 Ping Flood ,模擬 Flood Attack。
再去觀察交換機流量
流量隨之飆升,咱們能夠在系統終端中執行,top
命令,查看 cpu佔用
回到 mininet 終端,按 Ctrl+C
終止Ping Flood
,而後再觀察流量
發現流量立刻就降低了。
咱們首先在mininet 終端執行h2 ping -f h1
模擬 Ping Flood Attack。會發現流量立刻又上來了。
接下來,咱們經過Floodlight控制器向OpenFlow交換機下發流表,抑制攻擊流量。在此以前,咱們先了解一些概念。
1)什麼是流表:
流表是交換機進行轉發策略控制的核心數據結構。交換機芯片經過查找流表項來決策進入交換機網絡的數據包執行適當的處理動做。能夠理解爲交換機收到數據包以後該作什麼的一系列規則。
2)下發流表:
下發一條流表比如一條指令,告訴交換機收到數據包以後該作什麼。
3)OpenFlow流表項結構簡介
OpenFlow每一個流表項由三個部分組成:用於數據包匹配的包頭域(Header Fields),用於統計匹配數據包個數的計數器(Counters),用於對匹配的數據包如何處理的動做(Actions)
包頭域:OpenFlow流表的包頭域(OpenFlow v1.1以後被稱做匹配域),用於對交換機接收到的數據包的包頭內容進行匹配。在OpenFlow v1.0中,流表的包頭域中包括了12個元組(Tuple):
對應的中文解釋:
關於OpenFLow 流表的詳細狀況,你們能夠自行查找相關資料。
打開一個系統終端,輸入以下指令,調用Floodlight 的API 查詢現有流表
返回爲空:
提示:API文檔請參考:Static Flow Pusher API pre-v1.0 -Floodlight Controller - Project Floodlight https://floodlight.atlassian.net/wiki/spaces/floodlightcontroller/pages/1343498/Static+Flow+Pusher+API+pre-v1.0?showComments=true&showCommentArea=true
Static Entry Pusher API - FloodlightController - Project Floodlight https://floodlight.atlassian.net/wiki/spaces/floodlightcontroller/pages/1343518/Static+Entry+Pusher+API
1)添加流表操做
而後咱們添加一條靜態流表,爲了方便操做和查看,新建一個 ddos.json
的文件,將流表內容寫入到這個文件,而後經過 API 進行提交,文件內容以下:
ddos.json字段解釋:
switch:交換機dpid(若是你不知道,能夠在控制器的WebUI界面查看)
name:隨意取一個名字便可 cookie:流表規則標識 in_port:入端口 priority:優先級 active:是否激活 actions:動做
注意:不一樣版本的Floodlight API 在字段上可能不一樣。如下是 1.0 版本的API
執行下列指令,下發流表Drop數據包:
返回「Entry pushed」,表示流表下發成功,再次查詢流表:
2)觀察流量
切換到 sFlow 這邊查看流量:
發現流表下發以後,流量迅速降低,h1
向h2
泛洪的數據包迅速的被徹底Drop掉了。
切換到 h2
的終端,訪問 h1
的web
服務
一樣沒法訪問了。這是由於咱們下發的流表是把全部的數據包都Drop掉了。這並非咱們想要的效果,等下咱們再來解決這個問題。
3)刪除流表
執行如下指令刪除剛剛下發的流表:
再次觀察流量:
攻擊的數據包流表又恢復了。
4)DROP指定流量
改造須要下發的流表,讓OpenFlowSwitch 只Drop掉 ICMP
的流量,不影響正常的HTTP服務
。修改內容以下:
添加了兩個字段,eth_type
: 指定以太網類型爲ipv4
,ip_proto
:指定協議類型爲ICMP
。
再次下發流表:
此時再觀察流量和訪問 h1
的HTTP
服務
能夠發現,流量降低到正常,但HTTP
服務依然能夠訪問,沒有受到影響。
經過SDN技術,咱們能夠對網絡流量進行實時監控,提取,分析,並可以及時的對流量進行調整好比QoS,負載均衡,DDoS流量過濾等。
<<<<<<👇👇點擊下方連接便可👇👇>>>>>>
本文由合天網安實驗室原創,轉載請註明來源。
關於合天網安實驗室
合天網安實驗室(www.hetianlab.com)-國內領先的實操型網絡安全在線教育平臺真實環境,在線實操學網絡安全 ;實驗內容涵蓋:系統安全,軟件安全,網絡安全,Web安全,移動安全,CTF,取證分析,滲透測試,網安意識教育等。