引言
積跬步以至千里,積怠情以至深淵。
Mininet是一個輕量級軟件定義網絡研發和測試平臺,主要特性包括支持 Openflow、OpenvSwitch 等軟定義網絡部件;方便多人協同開發;支持系統級的還原測試;支持複雜拓撲、自定義拓撲;提供 Python API很好的硬件移植性(Linux 兼容),結果有更好的說服力;高擴展性,支持超過 4096 臺主機的網絡結構。
Mininet可以模擬真實網絡, 主要是用到了Linux 內核的namespace機制,通俗來說,namespace機制就是可以給模擬網絡中的每一個虛擬設備分一個空間,各個虛擬設備之間彼此沒有關係(看不到對方,但是可以連接起來)。namespace機制按照datapath的運行權限不通,分爲kernel datapath和userspace datapath兩種。
作爲Mininet入門選手,特此分享心得筆記。不對之處, 還望批評指正!
創建網絡
啓動Mininet,創建默認的網絡拓撲圖命令爲sudo mn,該默認拓撲圖結構如下圖所示,擁有一臺控制節點(controller)、一臺交換機(Switch)、兩臺主機(host)的網絡,可以通過wireshark進行觀測。
查看網絡基本信息
CLI的交互式操作
# 查看全部節點
mininet> nodes
# 查看鏈路信息
mininet> net
# 輸出各節點信息
mininet> dump
對節點進行單獨操作
如果想要對某個節點的虛擬機單獨進行命令操作,也十分簡單,命令格式爲 node cmd。
例如查看交換機 s1 上的網絡信息,我們只需要在執行的 ifconfig 命令前加上 s1 主機標誌即可,即 s1 ifconfig,同樣,如果我們想用 ping 3 個包的方法來測試 h2 跟 h3 之間連通情況,只需要執行 h2 ping -c 3 h3 即可。
全網絡互ping命令是 pingall
常規操作
快捷測試
除了 CLI 的交互方式之外,Mininet 還提供了更方便的自動執行的快捷測試方式,其格式爲 sudo mn --test cmd,即可自動啓動並執行 cmd 操作,完成後自動退出。
sudo mn --test pingpair,可以直接對主機連通性進行測試,
sudo mn --test iperf,啓動後直接進行性能測試。用這種方式很方便直接得到實驗結果。
自定義拓撲
Mininet 提供了 Python API,可以用來方便的自定義拓撲結構。
在 mininet/custom 目錄下給出了幾個例子。例如在文件中定義了一個 mytopo,則可以通過 --topo 選項來指定使用這一拓撲,命令爲
sudo mn --custom ~/mininet/custom/topo-2sw-2host.py --topo mytopo --test pingall
使用Xterm
sudo mn -x
或者再進入mn CLI之後,用如下命令啓動
xterm s1
鏈路操作
在 Mininet CLI 中,使用 link 命令,禁用或啓用某條鏈路,格式爲
link node1 node2 up/down
指定交換機跟控制器的類型
通過 --switch 選項跟 --controller 選項可以分別指定採用哪種類型的交換機跟控制器。下面,以更換使用pox控制器爲例進行介紹:
POX是由NOX演變而來,其底層模塊由C++實現,上層應用可以用C++或Python編寫,它的核心作用是提供快速開發網絡控制軟件原型的平臺。POX和OpenFlow交換機進行交互,可以用於軟件定義網絡這個新興學科的基礎研究,比如探索和原型分佈、SDN調試、網絡虛擬化、控制器設計和編程模型。
1.POX系統配置並啓動POX
修改監聽端口
POX的監聽端口默認是6633,修改監聽端口的方式有以下兩種:
(1)每次啓動POX時指定監聽端口,如指定的端口爲6636,則在命令行後添加:
openflow.of_01 --port=6636
(2)修改控制器的默認端口方法
修改/pox/openflow/of_01.py文件,如指定的端口爲6636,則將文件中所有的port=6633改爲port=6636。
配置Web界面端口
POX支持GUI,通過POXDesk等工具實現,本小節介紹如何配置POX的GUI。具體操作如下:
(1)獲取POXDesk
進入POX主目錄下面的ext目錄
cd ./pox/ext
git clone https://github.com/MurphyMc/poxdesk
(2)獲取qooxdoo
下載qooxdoo代碼壓縮包,然後把解壓後文件夾名字改成qx
cd poxdesk
wget http://downloads.sourceforge.net/qooxdoo/qooxdoo-2.0.2-sdk.zip
unzip qooxdoo-2.0.2-sdk.zip
mv qooxdoo-2.0.2-sdk qx
(3)初始化poxdesk
進入poxdesk目錄,執行命令./generate.py,然後再進入POX主目錄
cd poxdesk
./generate.py
cd ../../..
(4)啓動POX
若在啓動POX報錯地址已被佔用,則使用ps -fA | grep python來查看當前正在調用POX的Python進程,找到進程編號,殺死即可。
./pox.py samples.pretty_log web messenger messenger.log_service messenger.ajax_transport openflow.of_service poxdesk openflow.discovery poxdesk.tinytopo py
(5)訪問Web
用瀏覽器訪問http://pox-ip:8000/poxdesk,默認端口8000。
2.啓動mininet
在啓動POX後,打開另一個cmd,並啓動mininet,並且連接到遠程ip = 127.0.0.1, port = 6633的pox控制器。
sudo mn --controller=remote,ip=127.0.0.1,port=6633
常用命令總結
其他命令
執行 sudo mn -c 會進行清理配置操作,適合故障後恢復。
執行 exit 會退出 Mininet 的 CLI,同時給出運行時間統計。
Mininet的高級功能使用
下面,將通過一個具體管理 Openflow switch 的例子來介紹一些比較高級的命令。
首先,啓動 Mininet,執行
sudo mn --topo single,3 --mac --switch ovsk --controller remote
生成一個小的網絡,三臺主機連到一臺交換機上,交換機爲 OpenvSwitch 交換機,指定 remote 類型控制器(默認爲本地)。
dpctl
dpctl 程序是一個命令行工具用來檢測和管理 OpenFlow 數據通路,它能夠顯示當前的狀態數據通路,包括功能配置和表中的條目,以及合適使用 OpenFlow 的內核模塊,可以用來添加,刪除,修改和監視 datapaths。
1.查看到交換機的端口等基本情況,其中 tcp 端口 6634 是默認的交換機監聽端口
s1 dpctl show tcp:127.0.0.1:6634
2.查看流表信息:
dpctl dump-flows tcp:127.0.0.1:6634
此時,流表爲空,執行 h1 ping h2 無法得到響應。因此我們需要通過 dpctl 手動添加流表項,實現轉發。
3.手動添加流表項:
dpctl add-flow tcp:127.0.0.1:6634 in_port=1,actions=output:2
dpctl add-flow tcp:127.0.0.1:6634 in_port=2,actions=output:1
dpctl dump-flows tcp:127.0.0.1:6634
此時查看流表可以看到新的轉發信息,同時可以在 h1 和 h2 之間可以相互連通。
4.dpctl 其他常用操作
創建 datapath 編號爲 0
dpctl adddp n1:0
增加兩個網絡設備到新的 datapath
dpctl adddp n1:0 eth0
dpctl adddp n1:0 eth1
檢測數據通路接收的流量
dpctl monitor n1:0
在數據通路中刪除網絡設備
dpctl delif nl:0 eth0
Mininet代碼結構
- bin/mn:主運行文件,安裝後執行 mn 即調用的本程序,是 Python 程序。
- mnexec.c :執行一些快速命令,比如關閉文件描述符等,是 C 程序,編譯後生成二進制文件 mnexec 被 Python 庫調用。
- 核心代碼基本都在 mininet/ 子目錄下。
- CONTRIBUTORS:作者信息;README.md:主說明文件;doc/doxygen.cfg:執行doxygen生成文檔時的配置文件。
- custom/ :目錄下可以放一些用戶自定義的 Python 文件,比如自定義的拓撲類等。
- mininet/test/ :目錄下是一些測試的例子。
- util/:目錄下是一些輔助文件,包括安裝腳本、文檔輔助生成文件等。
整體邏輯功能
Mininet 作爲一個基於 Python 的網絡模擬工具,可以分爲兩大部分:Python庫和運行文件。前者提供對網絡中元素進行抽象和實現,例如定義主機類來表示網絡中的一臺主機。後者則基於這些庫來完成各種自定義的模擬過程。一個典型的場景如下圖所示。
總結
Mininet是一個網絡仿真器,或者更確切地說是一個 網絡仿真編排系統。它在單個Linux內核上運行一組終端主機,交換機,路由器和鏈接。 它使用輕量級虛擬化使單個系統看起來像一個完整的網絡,運行相同的內核,系統和用戶代碼。Mininet主機的行爲就像真機一樣; 你可以ssh進去(如果你開始 sshd並將網絡橋接到您的主機上)並運行任意程序(包括安裝在底層Linux系統上的任何程序。)您運行的程序可以通過看似真正的以太網接口發送數據包,具有給定的鏈接速度和延遲。數據包通過具有給定數量的排隊的真實以太網交換機,路由器或中間件進行處理。當兩個程序(如 iperf客戶端和服務器)通過Mininet進行通信時,測量的性能應該與兩個(較慢的)本機的性能相匹配。
簡而言之,Mininet的虛擬主機,交換機,鏈接和控制器是真實的 - 它們只是使用軟件而不是硬件創建的 - 並且大多數情況下它們的行爲類似於分立的硬件元素。通常可以創建類似於硬件網絡的Mininet網絡,或類似於Mininet網絡的硬件網絡,並在任一平臺上運行相同的二進制代碼和應用程序。