作者簡介:劉宏巖,福州大學數計學院2016級計算機科學與技術(實驗班)本科生,主要研究方向爲軟件定義網絡SDN、網絡功能虛擬化NFV。
陳翔,福州大學數計學院2015級計算機科學與技術(實驗班)本科生 ,對軟件定義網絡SDN,特別是對P4語言感興趣。
OpenNF簡介
網絡功能 (Network Function,NF) 通過一系列方式對數據報進行檢測和修改。例如IDS (intrusion detection system)、負載均衡器等。NF在網絡安全、網絡測量等領域扮演着至關重要的角色。近年來,網絡功能虛擬化 (NFV) 通過在通用服務器上運行基於軟件的NF取代基於專用硬件的NF,顯著降低成本;同時,軟件定義網絡 (SDN) 可以引導流量通過NF以執行策略和管理網絡。通過SDN與NFV的結合,可以實現通過動態調度流量均衡NF負載的應用,如NF負載均衡 (load balancing) 和NF遷入遷出 (scale-in/out)。OpenNF正是Aaron Gember-Jacobson等人在SIGCOMM 2014會議上提出用於協調控制NF狀態和路由策略的全新架構。
本文通過介紹OpenNF的設計思想和實驗流程,希望更好的能夠實戰化SDN與NFV結合的實現設計與實驗方案。
SDN和NFV的結合可以實現以下三個目標:
1.在NF性能或時效性方面滿足嚴格的服務水平協議 (SLA);
2.準確監控和調度全網流量;
3.最小化NF操作開銷;
然而,同時實現這三個目標非常困難。如圖1所示,考慮如下場景:一個IDS實例過載,必須向外遷出一些流量以滿足SLA對吞吐量的要求。基於NFV我們可以輕鬆啓動一個新的IDS實例,基於SDN我們可以把原本發往過載IDS實例的流量重新路由到新的IDS實例。但是,由於在新的IDS實例中沒有用於處理先前流量的狀態信息,很可能會導致錯誤的數據報處理。爲解決這個問題,SDN控制程序可以等待某些經過過載IDS的流量終止後,再重新路由流量到新的IDS實例,但這會造成低效的遷移並增加了違反SLA的風險。同時,由於某些NF狀態信息沒有被複制到新的NF實例或者在不同NF實例之間共享,NF處理流量的準確性也會受到影響。
在本例中,同時保證NF準確性、性能和流量遷移一致性的唯一方法是允許控制程序快速安全地將一些流的狀態信息從原始實例移動到新實例,並同時更新路由策略。在SIGCOMM 2014會議上Aaron Gember-Jacobson等人提出了OpenNF,OpenNF提供了對NF狀態和路由策略的高效、協調控制,從而允許在不同NF實例之間快速、安全、細粒度地重新分配流量,避免進行不必要的開銷。
圖1:一個需要通過NF遷出來滿足SLA對吞吐量要求的場景。IDS 處理網絡流量的拷貝,以檢測HTTP流量中的端口掃描攻擊和惡意流量。此時第一個IDS實例 (IDS1) 已經過載,如果將紅色流量分配給第二個 IDS 實例來保證SLA,則必須更新SDN交換機的流表並遷移這條流所對應的狀態信息來保證NF狀態遷移的一致性。
實驗內容
本實驗展示瞭如何使用OpenNF迅速且安全地把一條TCP流量從一個NF實例遷移到另一個NF實例。
實驗環境
Ubuntu 16.04,64位。
安裝依賴
1.安裝OpenNF控制器、NF共享庫和本次實驗所需的依賴軟件:
其中mininet推薦使用源碼安裝,參考:mininet安裝;oracle-java8-installer安裝,參考:oracle-java8-installer安裝。
2.爲了避免其他流量對本次實驗的干擾,執行以下兩條命令 (會造成斷網):
3.安裝json-c,參考:json-c安裝。
4.本次實驗我們用到了PRADS (一種被動監聽網絡流量,並獲取網絡上的主機和服務信息的網絡功能)。安裝PRADS的依賴軟件:
下載Floodlight控制器和PRADS
1.創建一個名爲tutorial的文件夾
2.下載floodlight-0.90的源代碼並解壓到tutorial目錄下:
3.下載PRADS的源代碼到tutorial/目錄下:
下載OpenNF控制器源代碼
必須在註冊之後才能下載OpenNF的相關軟件源碼(註冊鏈接)。註冊登錄後下載以下軟件,並解壓到tutorial/目錄下。
1.NF控制器:NF控制器代碼。
2.NF共享庫:用C語言寫的提供給NF的共享庫,用於控制NF和NF控制器之間的通信。
3.應用代碼:使用OpenNF控制器的程序代碼。
4.PRADS patch:PRADS補丁,用來修改PRADS以支持OpenNF。
5Mininet拓撲腳本:本次試驗用到的mininet 拓撲腳本。
編譯PRADS源碼
1.編譯網絡功能共享庫:
注:執行這一步時,遇見以下錯誤:
錯誤原因:在編譯網絡功能共享庫的過程中,gcc編譯器無法找到json-c頭文件。
解決方案:
編譯在Linux系統中,/usr/include/ 是C/C++等的頭文件放置處。因此將編譯安裝完成的json-c文件夾改名爲“json”放在/usr/include/目錄下,即可解決:
2.編譯PRADS:
編譯OpenNF控制器
1.爲了讓Floodlight控制器支持OpenNF控制器,向位於/tutorial/floodlight/src/main/resources/META-INF/services/目錄下Floodlight的model list文件(net.floodlightcontroller.core.module.IFloodlightModule)中添加如下幾行:
2.編譯Floodlight控制器:
3.鏈接庫:
4.下載GSON jar文件,並放入路徑tutorial/controller/lib/下。
5.編譯OpenNF控制器:
6.編譯應用:
實驗配置
1.修改OpenNF控制器配置文件 tutorial/apps/testTimedMoveAll.prop 中的一些參數:
2.由於本次實驗需要收集大量的TCP數據報,通過重放這些數據報到NF實例,來模擬NF過載的場景。我們通過tcpdump來抓包,建議在抓包時瀏覽網頁或觀看視頻,增加NIC收到的數據包,加速抓包的過程。
3.修改NF共享庫中的配置文件 /usr/local/etc/sdmbn.conf:
運行實驗
1.啓動OpenNF控制器,等待連接6633端口:
2.新建終端,運行實驗拓撲。連接成功時控制器端會有新交換機連接的提示:
3.開啓三個主機的xterm:
1) H1:等待控制器命令,重放TCP流量;
2) H2:運行PRADS實例
3) H3:運行PRADS實例
4.在h1的xtrem中執行:
5.在h2的xtrem中執行:
6.在h3的xtrem中執行:
7.這時,假設一切正常,將會看到如下事件發生:
1) 控制器終端感知到從主機h2、h3發來的PRADS連接請求;
2) 控制器向h1發出指令,重放TCP流量;
3) 在h1上,開始重放TCP數據報,而主機h2上的PRADS實例接收到了大量的數據報;
4) 幾秒鐘後,控制器啓動狀態遷移;
5) 停止向主機h2發送數據報,向主機h3遷移流量;
6) 在h2、h3上體現出狀態遷移:
8.實驗結束時,效果如圖所示:
總結
本文對在SIGCOMM 2014提出的OpenNF進行了簡單的介紹,並對OpenNF教程中的實驗進行了復現。我們首先詳細介紹了實驗環境的搭建過程,然後通過收集並重放TCP流,模擬了NF實例過載的場景,最後經過OpenNF控制器的調度,在保證狀態遷移一致性、準確性的前提下,實現了最小開銷的狀態遷移。