Mininet-WIFI(一) Mininet學習筆記之基本操作

引言

積跬步以至千里,積怠情以至深淵。

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網絡的硬件網絡,並在任一平臺上運行相同的二進制代碼和應用程​​序。

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