陳 鐳,楊章靜,黃 璞
(1. 南京審計大學(xué) 信息工程學(xué)院,江蘇 南京 211815;2. 南京大學(xué) 計算機(jī)軟件新技術(shù)國家重點(diǎn)實(shí)驗(yàn)室,江蘇 南京 210232)
軟件定義網(wǎng)絡(luò)(software defined networking,SDN)作為一種新型的網(wǎng)絡(luò)架構(gòu)[1-2],把網(wǎng)絡(luò)控制平面與數(shù)據(jù)平面進(jìn)行分離。其中控制平面擁有網(wǎng)絡(luò)全局視圖,集中管控網(wǎng)絡(luò)資源,數(shù)據(jù)平面只轉(zhuǎn)發(fā)數(shù)據(jù),大大簡化了網(wǎng)絡(luò)的配置和管理。SDN 這一顛覆性的理念被認(rèn)為將對未來網(wǎng)絡(luò)產(chǎn)生革命性的影響,在很大程度上代表了未來網(wǎng)絡(luò)的發(fā)展方向,因此將SDN 引入計算機(jī)網(wǎng)絡(luò)教學(xué)是必然趨勢。計算機(jī)網(wǎng)絡(luò)課程教學(xué),十分注重實(shí)踐教學(xué),通過各種不同的組網(wǎng)實(shí)驗(yàn),讓學(xué)生理解和掌握計算機(jī)網(wǎng)絡(luò)的基本原理。
目前大多高校SDN 教學(xué)實(shí)驗(yàn)中普遍存在實(shí)體硬件設(shè)備不足及實(shí)驗(yàn)場地的限制,很難大規(guī)模開展SDN實(shí)體設(shè)備教學(xué)實(shí)驗(yàn)。學(xué)生在SDN 的學(xué)習(xí)上操作受限,難以深入理解SDN 實(shí)驗(yàn)教學(xué)的原理和內(nèi)涵。虛擬仿真實(shí)驗(yàn)具有成本低、效率高、功能全、靈活等優(yōu)點(diǎn),是高等教育信息化建設(shè)和實(shí)驗(yàn)教學(xué)的重要手段,在SDN教學(xué)實(shí)驗(yàn)中可以發(fā)揮重要的作用[3-6]。
本文詳細(xì)介紹了SDN 的背景知識;對比展示了SDN環(huán)境下幾種不同的DoS攻擊場景[7],包括控制平面、數(shù)據(jù)平面及網(wǎng)絡(luò)主機(jī)遭受洪范式或隱藏式拒絕服務(wù)(denial of service,DoS)攻擊的不同特點(diǎn);采用輕量級網(wǎng)絡(luò)仿真平臺Mininet 搭建SDN 網(wǎng)絡(luò),使用Floodlight控制器軟件和sFlow 流量監(jiān)控軟件,設(shè)計并實(shí)現(xiàn)了SDN環(huán)境下的洪范式和隱藏式DoS 攻擊和防御仿真實(shí)驗(yàn)[8]。
開放式網(wǎng)絡(luò)基金會(ONF)提出的OpenFlow 協(xié)議,初步實(shí)現(xiàn)了SDN 的核心思想,如圖1 所示,SDN架構(gòu)從底向上分別是基礎(chǔ)設(shè)施層、控制層和應(yīng)用層。
基礎(chǔ)設(shè)施層由支持OpenFlow 協(xié)議的交換機(jī)組成,負(fù)責(zé)數(shù)據(jù)包的匹配和轉(zhuǎn)發(fā)??刂茖荧@取底層交換機(jī)的信息,實(shí)時維護(hù)網(wǎng)絡(luò)拓?fù)浜蜖顟B(tài),并為應(yīng)用層提供服務(wù)接口。應(yīng)用層包含各種業(yè)務(wù)和應(yīng)用,通過控制層提供的接口調(diào)用、編排網(wǎng)絡(luò)資源。底層網(wǎng)絡(luò)設(shè)備只負(fù)責(zé)數(shù)據(jù)轉(zhuǎn)發(fā),控制層集中掌控網(wǎng)絡(luò)資源,通過應(yīng)用程序就可以完成SDN 全局網(wǎng)絡(luò)的管理。這種架構(gòu)大大降低了網(wǎng)絡(luò)的復(fù)雜度和搭建成本,加速了網(wǎng)絡(luò)部署周期,提高了網(wǎng)絡(luò)管理的靈活性。

圖1 SDN 三層架構(gòu)圖
流表是交換機(jī)數(shù)據(jù)轉(zhuǎn)發(fā)功能的核心。OpenFlow1.0協(xié)議中規(guī)定每個流表項由3 部分組成:包頭域、計數(shù)器和動作。
包頭域用于數(shù)據(jù)包的包頭內(nèi)容進(jìn)行匹配,共有12個匹配項,如表1 所示。包含了傳統(tǒng)網(wǎng)絡(luò)2 層到4 層的尋址信息(Mac、IP、端口)。OpenFlow 交換機(jī)可以看成是一種廣義的轉(zhuǎn)發(fā)設(shè)備,同時具備了傳統(tǒng)網(wǎng)絡(luò)交換機(jī)、路由器、防火墻的功能。
計數(shù)器用于統(tǒng)計匹配到的數(shù)據(jù)包信息,可以對交換機(jī)中的每個數(shù)據(jù)流、端口、隊列、流表分別統(tǒng)計。
動作是指對匹配到的數(shù)據(jù)包的后續(xù)處理方式。OpenFlow 交換機(jī)如果沒有定義動作,默認(rèn)情況下數(shù)據(jù)包被丟棄。常見的動作有:轉(zhuǎn)發(fā)、丟棄、排隊等。

表1 流表包頭域
當(dāng)主機(jī)h1 與主機(jī)h2 進(jìn)行通信時,如圖2 所示,大致包含以下步驟[9]:
步驟1 主機(jī)h1 向交換機(jī)s1 發(fā)送到主機(jī)h2 的數(shù)據(jù)包;交換機(jī)s1 查詢流表,若s1 的流表中有匹配項,則轉(zhuǎn)到步驟4。
步驟2 s1 流表中無匹配項,則s1 通過Packet-In消息將數(shù)據(jù)包轉(zhuǎn)發(fā)給控制器。
步驟3 控制器收到s1 的請求信息后,生成相應(yīng)的應(yīng)答策略,并通過Packet-Out 消息下發(fā)至s1。
步驟4 s1 執(zhí)行流表中的應(yīng)答策略,將數(shù)據(jù)包轉(zhuǎn)發(fā)至交換機(jī)s2。當(dāng)交換機(jī)s2 收到數(shù)據(jù)包以后,若s2 的流表中有匹配項,則轉(zhuǎn)到步驟7;若s2 的流表中無匹配項,則轉(zhuǎn)到步驟5。
步驟5 與步驟2 相似,s2 流表中無匹配項,則s2 通過Packet-In 消息將數(shù)據(jù)包轉(zhuǎn)發(fā)給控制器。
步驟6 與步驟3 相似,控制器收到s2 的請求信息后,生成相應(yīng)的應(yīng)答策略,并通過Packet-Out 消息下發(fā)至s2。
步驟7 s2 執(zhí)行流表中的應(yīng)答策略,將數(shù)據(jù)包轉(zhuǎn)發(fā)至主機(jī)h2。

圖2 基于OpenFlow 的SDN 工作流程
DoS 攻擊通過在短時間內(nèi)向目標(biāo)網(wǎng)絡(luò)或主機(jī)發(fā)送大量的數(shù)據(jù)包,占滿帶寬和服務(wù)資源。當(dāng)正常用戶進(jìn)行網(wǎng)絡(luò)通信時,就會出現(xiàn)請求異常或服務(wù)出錯。DoS攻擊簡單有效,對正常的網(wǎng)絡(luò)通信造成嚴(yán)重影響,是網(wǎng)絡(luò)安全領(lǐng)域關(guān)注的重點(diǎn)。
(1)控制器洪范式攻擊[10]。當(dāng)一個數(shù)據(jù)包沒有匹配到任何流表項時,若交換機(jī)緩存未滿,交換機(jī)將緩存報文內(nèi)容,并將報文頭封裝在Packet-In 消息中轉(zhuǎn)發(fā)給控制器;一旦交換機(jī)緩存滿了,交換機(jī)會直接將整個報文都封裝在Packet-In 消息中轉(zhuǎn)發(fā)給控制器,這種方式會大大加重控制器的負(fù)擔(dān)。此外,控制器有一個路徑計算模塊,當(dāng)大量偽造的數(shù)據(jù)包到來時,控制器無法計算出完整的路徑信息,會占用控制器大量計算資源,導(dǎo)致控制器無法提供正常服務(wù)。
(2)控制器隱藏式攻擊[11]。控制器的拓?fù)浒l(fā)現(xiàn)機(jī)制會受到一種隱藏式DoS 攻擊影響。控制器周期性地向所有交換機(jī)下發(fā)封裝有LLDP(鏈路層發(fā)現(xiàn)協(xié)議)幀的Packet-Out 消息。攻擊者在探測LLDP 幀周期的基礎(chǔ)上,對交換機(jī)之間鏈路發(fā)起DoS 攻擊,造成LLDP幀連續(xù)丟失,使得控制器誤以為該鏈路斷開,無法準(zhǔn)確獲取網(wǎng)絡(luò)拓?fù)湫畔ⅰ?/p>
(1)交換機(jī)洪范式攻擊[12]。OpenFlow 交換機(jī)流表的存儲能力通常有限,攻擊者針對交換機(jī)發(fā)起洪范式DoS 攻擊,短時間內(nèi)產(chǎn)生大量的虛假流請求,出現(xiàn)大量的無用流表項,這些規(guī)則將填滿交換機(jī)流表,從而導(dǎo)致合法流量被丟棄。
(2)交換機(jī)隱藏式攻擊[13]。SDN 將數(shù)據(jù)層的控制能力完全抽離,數(shù)據(jù)層完全失去了主動監(jiān)管網(wǎng)絡(luò)流量的可能性,因此,數(shù)據(jù)層隱藏式DoS 攻擊變得可行。數(shù)據(jù)層隱藏式DoS 攻擊通過在流表中產(chǎn)生長期存在的流表規(guī)則,從而達(dá)到占用流表的攻擊目的。
當(dāng)攻擊者的目標(biāo)是網(wǎng)絡(luò)主機(jī)時,會操縱僵尸網(wǎng)絡(luò)向目標(biāo)主機(jī)發(fā)送大量并發(fā)攻擊流,從控制器和交換機(jī)的角度看,這些流量是正常流量,因?yàn)槎际呛戏ㄖ鳈C(jī)發(fā)送的合法數(shù)據(jù)流,但這些流量最終在目標(biāo)主機(jī)處聚合,形成總量很大的異常流量[14],導(dǎo)致目標(biāo)主機(jī)工作癱瘓。
當(dāng)網(wǎng)絡(luò)流量壓力比較大,而又無法確認(rèn)當(dāng)前流量是否為攻擊流時,可以采用通過流表項將大量的流量轉(zhuǎn)發(fā)到網(wǎng)絡(luò)中的監(jiān)控設(shè)備(例如防火墻),以此轉(zhuǎn)移交換機(jī)的壓力,也可以設(shè)置IP 地址的黑白名單,實(shí)現(xiàn)對數(shù)據(jù)流的輔助處理(見表2)。

表2 SDN 環(huán)境下DoS 攻擊特點(diǎn)及應(yīng)對方法
硬件環(huán)境:Intel(R) Core(TM) i5-8500U CPU @3.00 GHz 處理器,8 GB DDR4 內(nèi)存,240 GB SSD 硬盤。
軟件環(huán)境:Ubuntu14.04 64 位操作系統(tǒng),JDK1.7,Mininet 2.2.1,Open vSwith2.0.2,OpenFlow1.0 協(xié)議,F(xiàn)loodlight 0.9 版本控制器,sFlow-rt 2.0。
Mininet 是一套擴(kuò)展性很強(qiáng)的網(wǎng)絡(luò)仿真實(shí)驗(yàn)平臺,除了可以用于SDN 網(wǎng)絡(luò)實(shí)驗(yàn),還可以用于傳統(tǒng)網(wǎng)絡(luò)實(shí)驗(yàn)。Mininet 能夠在一臺單獨(dú)的計算機(jī)上虛擬出網(wǎng)絡(luò)主機(jī)、網(wǎng)絡(luò)鏈路和交換設(shè)備等,組成一個完整的虛擬網(wǎng)絡(luò)。Floodlight 控制器是一個模塊化、高可用、支持OpenFlow 協(xié)議的控制器。sFlow 是一款實(shí)時監(jiān)測網(wǎng)絡(luò)流量的監(jiān)控軟件。sFlow 有Agent 和Collector 兩個模塊,Agent 內(nèi)嵌于網(wǎng)絡(luò)轉(zhuǎn)發(fā)設(shè)備(如交換機(jī)、路由器),獲取設(shè)備接口的統(tǒng)計信息,將信息封裝成報文發(fā)送給Collector,Collector 對報文分析、匯總、生成流量報告。
(1)啟動Floodligh 控制器。
進(jìn)入 floodlight 目錄,輸入命令 java -jar target/floodlight.jar
(2)創(chuàng)建網(wǎng)絡(luò)拓?fù)?,連接控制器。
mn --controller=remote,ip=192.168.1.1,port=6633 --topo single,3 --switch ovsk,protocols=OpenFlow10
(3)瀏覽器訪問Floodlight。
打開Floodlight 控制器的管理地址:http://localhost:8080/ui/index.html。從圖形界面可看到,Mininet 成功連接到Floodlight,并可以看到Mininet 生成的網(wǎng)絡(luò)拓?fù)洹?/p>
(4)配置sFlow Agent。
先要在虛擬交換機(jī)端口處配置 Agent,這樣Collector 才能對收集到的流量信息進(jìn)行分析和呈現(xiàn)。切換到交換機(jī)s1 窗口,開啟OvS 的sFlow 功能,配置Agent 的命令如下:
ovs-vsctl -- --id=@sflow create sflow agent=eth0 target="192.168.1.1:6343" header=128 sampling=10 polling=1 -- set bridge s1 sflow=@sflow
參數(shù)說明:agent,監(jiān)控 eth0 網(wǎng)卡產(chǎn)生的流量;target,sFlow-rt 的ip,默認(rèn)端口6343;bridge,需要開啟sFlow 的網(wǎng)橋;sampling,采樣率,表示每隔多少個Packet 取樣一次;polling,輪詢時間,每隔多少秒輪詢一次。
(5)配置sFlow-rt Collector。
保持Mininet 運(yùn)行的終端,再打開一個新的終端窗口,進(jìn)入sFlow-rt 安裝目錄,輸入./start.sh 命令,啟動 sFlow-rt。sFlow Collector 的默認(rèn)監(jiān)聽端口為6343,通過瀏覽器輸入http://localhost:8008 打開監(jiān)控頁面。Agent 配置成功后,可以通過對其WebUI 中的Agents選項卡中192.168.1.1條目的網(wǎng)絡(luò)流量進(jìn)行查看。
最終本文實(shí)驗(yàn)網(wǎng)絡(luò)拓?fù)淙鐖D3 所示。網(wǎng)絡(luò)中一共有1 臺虛擬交換機(jī)s1,s1 上連接3 臺客戶機(jī),分別為h1、h2、h3,為了方便測試網(wǎng)絡(luò)連通性,在Mininet平臺中對網(wǎng)絡(luò)執(zhí)行指令pingall,可測試出主機(jī)間能夠相互通信。同時,s1 的其他端口分別連接Floodlight控制器和sFlow Collector 端。

圖3 SDN 環(huán)境下DoS 攻防實(shí)驗(yàn)網(wǎng)絡(luò)拓?fù)鋱D
(1)模擬發(fā)起洪范式DoS 攻擊。
在Mininet 終端中執(zhí)行,h1 ping -f h2,-f 參數(shù)的意思是Ping Flood,模擬Flood Attack??梢钥吹剑O(jiān)測流量迅速飆升,如圖4 中第1 階段所示。在系統(tǒng)終端執(zhí)行top 命令,查看到CPU 占用率也會突然增高。

圖4 洪范式DoS 攻防實(shí)驗(yàn)效果圖
(2)控制器向SDN 交換機(jī)增加流表規(guī)則。
通過Floodlight 控制器提供的RESTful 接口向交換機(jī)s1 下發(fā)流表,丟棄攻擊流量。在Floodlight 控制器中增加流表的命令如下:
curl -d "{"switch": "00:00:00:00:00:00:00:01","name":"flow-drop","cookie":"0","priority":"32768",in_port":"1","active":"true","eth_type":"0x0800","ip_proto":"0x01","idle_timeout":"0","actions":"output=no-forwar d"}" http://192.168.1.1:8080/wm/staticflowpusher/json
參數(shù)說明:name,給流表命名;cookie,流表規(guī)則標(biāo)識;priority,優(yōu)先級;in_port,入端口;active,是否激活;eth_type,以太網(wǎng)類型;ip_proto,協(xié)議類型;idle_timeout,存活時間;actions,動作。
上述流表下發(fā)到s1 以后,監(jiān)測流量迅速下降,如圖4 中第2 階段所示。所有經(jīng)過交換機(jī)1 號端口的ICMP 流量都不會被轉(zhuǎn)發(fā)出去,其他類型的流量(如HTTP)則可以正常轉(zhuǎn)發(fā),即h1 向h2 發(fā)送的Flood Attack 數(shù)據(jù)包迅速地被完全Drop 掉了,成功實(shí)現(xiàn)了對洪范式DoS 攻擊的防御。
(3)刪除SDN 交換機(jī)中流表規(guī)則。
為證明確實(shí)是因?yàn)樘砑恿?flow-drop"流表項,阻斷了Dos 攻擊流量,最后通過Floodlight 控制器提供的RESTful 接口向交換機(jī)s1 下發(fā)刪除流表命令:
curl -X DELETE -d "{"name":"flow-drop"}"http://192.168.1.1:8080/wm/staticflowpusher/json
上述流表下發(fā)到s1 以后,監(jiān)測到流量又迅速飆升,如圖4 中第3 階段所示,從而可以證明SDN 交換機(jī)中的流表項擁有管控流量的能力。
默認(rèn)的流表規(guī)則采用空閑超時機(jī)制,即在規(guī)定時間內(nèi),如果沒有數(shù)據(jù)包匹配,則該流表規(guī)則超時被刪除;如果有數(shù)據(jù)包匹配,則重新更新存活時間,該機(jī)制使得一種數(shù)據(jù)層隱藏式DoS 攻擊變得可行,從而達(dá)到長期占用流表的目的。
一條流表規(guī)則的基本字段主要有:cookie,流表規(guī)則標(biāo)識;priority,優(yōu)先級,范圍為0-65535,值越大,優(yōu)先級越高;match,匹配規(guī)則;action,動作;packets,流表已匹配包數(shù);bytes,流表已匹配字節(jié)數(shù);age,流表已存在時間;timeout,存活時間,沒有數(shù)據(jù)包匹配,流表會在到達(dá)給定時間后被自動刪除。
(1)模擬隱藏式DoS 攻擊。
因timeout 時間默認(rèn)設(shè)置為5 s,所以在Mininet終端中執(zhí)行指令,h1 ping –i 4 h2,-i 參數(shù)模擬每隔4 s從h1 主機(jī)(1 號端口)向h2 主機(jī)(2 號端口)發(fā)送ping 指令數(shù)據(jù)包。
(2)周期性查詢流表規(guī)則。
周期性的通過Floodlight 控制器的UI 界面查詢交換機(jī)s1 中的流表規(guī)則如圖5 所示。從圖5 中可看出,在timeout 為5 s 的情況下,當(dāng)一條流表規(guī)則age 時間很長,而且匹配的packets 相對不多的情況下,很有可能是針對SDN 交換機(jī)的隱藏式DoS 攻擊造成的。

圖5 OpenFlow1.0 交換機(jī)中端口和流表項
(3)刪除長期存在的流表規(guī)則。
對被懷疑為隱藏式DoS 攻擊的流表規(guī)則,通過Floodlight 控制器提供的RESTful 接口向交換機(jī)s1 下發(fā)刪除流表命令進(jìn)行刪除:curl -X DELETE -d"{"cookie":"90071992524740992"}" http://192.168.1.1:8080/wm/staticflowpusher/json。
SDN 可以對網(wǎng)絡(luò)流量進(jìn)行實(shí)時監(jiān)控、提取、分析,及時調(diào)整流量。本文采用網(wǎng)絡(luò)仿真平臺Mininet 搭建SDN 網(wǎng)絡(luò),使學(xué)生在SDN 的學(xué)習(xí)中不受硬件條件的限制,降低了學(xué)習(xí)門檻,提高了學(xué)生實(shí)踐的靈活性。結(jié)合使用Floodlight 控制器軟件和sFlow 流量監(jiān)控軟件,展示了拓?fù)鋭?chuàng)建、主機(jī)間聯(lián)通測試、流表下發(fā)、流量監(jiān)測等過程,最后以SDN 環(huán)境下的洪范式和隱藏式DoS 攻防案例進(jìn)行實(shí)驗(yàn)教學(xué),使學(xué)生能夠深入理解SDN 網(wǎng)絡(luò)的機(jī)理和內(nèi)涵。