【Ryu Controller Web GUI(使用SDNHUB) — on Ubuntu 16.04】

在持續研究SDN中,突然在Google中發現SDN HUB中有額外可以裝在Ryu Controller上的Web GUI,好奇就來玩玩看

GUI下載點:https://bitbucket.org/sdnhub/ryu-starter-kit

———————————–  安裝流程 ——————————–

我們所需要的環境有以下

  • Ubuntu Desktop 16.04
  • Mininet
  • Ryu Controller

在前面幾篇中已經介紹過Ryu和Mininet的安裝,這裡就不再贅述,如果您還不知道要怎麼安裝,請先參考【Mininet介紹與安裝 — on Ubuntu 16.04】【Ryu介紹與安裝(利用git安裝) — on Ubuntu 16.04】,繼續來看看安裝過程吧

# 利用git下載官方ryu套件和sdnhub 的 gui 套件
git clone https://github.com/osrg/ryu (建議放在/home/[用戶名稱] 目錄底下)
cd ryu/ryu/app
git clone https://bitbucket.org/sdnhub/ryu-starter-kit sdnhub_apps

Screenshot from 2017-12-03 21-34-59.png
官方的Ryu 套件
Screenshot from 2017-12-03 21-36-37
SDN HUB 的 Web GUI 套件

# 安裝python相關套件
apt-get install -y libxslt1-dev msgpack-python python-setuptools python-nose python-pip python-dev

Screenshot from 2017-12-03 21-44-03

# 安裝pip相關套件
pip install ipaddr networkx bitarray netaddr oslo.config routes webob paramiko mock eventlet xml_compare pyflakes pylint tinyrpc

Screenshot from 2017-12-03 21-46-48
Screenshot from 2017-12-03 21-47-14.png

# 安裝Ryu Controller
cd ryu
python ./setup.py install

Screenshot from 2017-12-03 22-01-00.png
Screenshot from 2017-12-03 22-01-16.png

# 執行SDN HUB 的shell
./ryu/app/sdnhub_apps/run_sdnhub_apps.sh

Screenshot from 2017-12-03 22-01-59.png

# 開啟瀏覽器
[本機端瀏覽器]請執行 http://127.0.0.1:8080
[外部瀏覽器]請執行http://[Ryu所在IP]:8080

Screenshot from 2017-12-03 22-02-26
成功看到Web介面了
Screenshot from 2017-12-03 22-02-33
因為還沒有建立switch,所以table是空的

 

 

# 利用Mininet建立拓墣
mn –topo=tree,depth=2,fanout=3 –controller=remote

Screenshot from 2017-12-03 22-06-01.png
左邊為Ryu Controller,右邊為Mininet,注意執行Mininet前必須先執行Ryu Controller喔

 

 

# 打開瀏覽器檢查
這次示範從外部瀏覽器觀察,由於我Ryu Controller安裝在192.168.1.4這台主機裡,所以網址為http://192.168.1.4:8080

螢幕快照 2017-12-03 下午10.21.48.png
出現拓墣介面了
螢幕快照 2017-12-03 下午10.21.57
出現switch的port清單了
螢幕快照 2017-12-03 下午10.22.01
剛開始還沒有進行封包傳送,所以Flow Table會是空的,稍後會示範Switch會學習並記錄規則流表
螢幕快照 2017-12-03 下午10.22.10
這裡可以提供人為手動建立Flow Table規則

 

 

# Switch的學習機制,在Mininet裡面執行pingall指令,讓封包流經所有host

Screenshot from 2017-12-03 22-07-39.png

螢幕快照 2017-12-03 下午10.22.42
由於封包流經host,故介面出現了host和switch
螢幕快照 2017-12-03 下午10.22.58
剛剛的ping封包被記錄在Flow Table裡面了

 

 

 

廣告

【Mininet 路由實驗 — 2 router with 2 host】

我們上次在Mininet所模擬出來的拓墣是一個Router連接兩個不同網段,且每個網段各有一台host,現在則是使用兩台Router分別連接一台host,和上次不一樣的地方是,這次實驗有三個不同網段,而且不僅是host要設定路由外,Router的部分也要進行設定

006

實驗環境

  • ubuntu desktop 16.04
  • mininet 2.3.0

#執行mininet的拓墣檔案(router_2.py)

python ./router_2.py

Screenshot from 2017-12-02 03-23-03.png
拓墣檔案內容

# xterm開啟r1 r2 h1 h2

Screenshot from 2017-12-02 03-25-41.png
進入xterm後,左上是router1,右上是router2,左下是host1,右下是host2,建議視窗安排位置可以參考圖上拓墣,比較不會搞混,如果沒有特定指定IP,mininet預設使用10.0.0.1/8網段

#進行設備上IP的設定(有以下設定語法)

ifconfig [設備介面] [IP位址]/[遮罩數]
ifconfig [設備介面] [IP位址] netmask [子網路遮罩IP]
ip addr add [IP位址]/[遮罩數] brd + dev [設備介面]

Screenshot from 2017-12-02 03-32-04.png
將h1的h1-eth0介面設為192.168.10.1/遮罩255.255.255.0,h2的h2-eth0介面設為192.168.30.1/遮罩255.255.255.0,r1的r1-eth0介面設為192.168.10.254/遮罩255.255.255.0,r1的r1-eth1介面設為192.168.20.1/遮罩255.255.255.0,r2的r2-eth0介面設為192.168.30.254/遮罩255.255.255.0,r2的r2-eth1介面設為192.168.20.2/遮罩255.255.255.0

# 進行主機Ping測試
我們發現r1/r2/h1/h2只能ping到直連網路的網域

006_1
不同顏色的部分代表每台設備可以連到的範圍

Screenshot from 2017-12-02 03-37-52.png

Screenshot from 2017-12-02 03-38-37
#在還沒設定路由前,r1只認得192.168.10.0/24和192.168.20.0/24網域,r2只認得192.168.20.0/24和192.168.30.0/24網域

# 開啟路由轉發功能
echo 1 > /proc/sys/net/ipv4/ip_forward

# 設定h1和h2的路由
[h1]> ip route add default -via 192.168.10.254 dev h1-eth0
[h2]> ip route add default -via 192.168.30.254 dev h2-eth0

Screenshot from 2017-12-02 03-43-01.png

# 觀察Ping結果
006_2.png
中間r1和r2間無法通訊,需要在r1和r2設定路由

Screenshot from 2017-12-02 03-48-30.png

# 進行路由設定
[r1]> ip route add 192.168.30.0/24 via 192.168.20.2 dev r1-eth1
[r2]> ip route add 192.168.10.0/24 via 192.168.20.1 dev r2-eth1

Screenshot from 2017-12-02 03-56-53.png

# 小觀察:我們停用r1的轉發功能,看看結果
006_3.png

Screenshot from 2017-12-02 03-59-02
停用r1封包轉發

Screenshot from 2017-12-02 03-59-02-2.png

如果不想經過這麼繁雜的設定,可以將上面的設定寫成python檔案,再做執行

Screenshot from 2017-12-02 04-08-42.png

 

 

 

 

 

 

【Mininet 路由實驗 — 1 router with 2 host】

我們在Mininet所模擬出來的網路拓墣來實驗一些網路原理,以下拓墣是一個Router連接兩個不同網段,且每個網段各有一台host,目的是讓兩台host彼此間可以進行通訊

005.png

實驗環境

  • ubuntu desktop 16.04
  • mininet 2.3.0

#執行mininet的拓墣檔案(router_1.py)

python ./router_1.py

Screenshot from 2017-12-01 22-15-44
拓墣檔案的內容
Screenshot from 2017-12-01 22-16-56
執行後會進入到mininet的提示字元

# xterm開啟r1 h1 h2

Screenshot from 2017-12-01 22-19-18.png
進入xterm後,上面是router1,左下是host1,右下是host2,建議視窗安排位置可以參考圖上拓墣,比較不會搞混,如果沒有特定指定IP,mininet預設使用10.0.0.1/8網段

#進行設備上IP的設定(有以下設定語法)

ifconfig [設備介面] [IP位址]/[遮罩數]
ifconfig [設備介面] [IP位址] netmask [子網路遮罩IP]

Screenshot from 2017-12-01 22-26-24.png
將h1的h1-eth0介面設為192.168.10.1/遮罩255.255.255.0,h2的h2-eth0介面設為192.168.20.1/遮罩255.255.255.0,r1的r1-eth0介面設為192.168.10.254/遮罩255.255.255.0,r1的r1-eth1介面設為192.168.20.254/遮罩255.255.255.0

# 進行主機Ping測試
我們發現r1可以ping通h1和h2,但h1和h2彼此間無法Ping通,我們接著來檢查路由表

Screenshot from 2017-12-01 22-30-57

#設定路由表,由於h1不認識192.168.20.0/24這個網段,因次要增加路由表告知h1將封包往指定地方轉送

ip route add [目的地IP網段]/[遮罩數] via [本地端IP閘道] dev [離開設備的介面]
[以host1為例]
ip route add 192.168.20.0/24 via 192.168.10.254 dev h1-eth0

Screenshot from 2017-12-01 22-38-26
可利用route -n指令檢查路由有沒有被新增進去,新增後h1可以ping到192.168.20.0/24的網段了

#增加h2到192.168.10.0/24網段的路由
ip route add 192.168.10.0/24 via 192.168.20.254 dev h2-eth0

Screenshot from 2017-12-01 22-45-38.png
h2可以ping到192.168.10.254網段了

h1可以ping到192.168.20.254,但無法ping到192.168.20.1
h2可以ping到192.168.10.254,但無法ping到192.168.10.1
原因是什麼呢?

Screenshot from 2017-12-01 22-48-22.png

推測結果是封包沒有被轉發出去,一直停留在r1裡面,所以我們要開啟路由轉發功能,請在r1執行以下指令來開啟路由轉發(0代表關閉,1代表開啟)
echo 1 > /proc/sys/net/ipv4/ip_forward

Screenshot from 2017-12-01 22-49-03.png

進行Ping測試

Screenshot from 2017-12-01 22-49-35.png
開啟轉發功能後,h1和h2彼此間可以進行通訊了
Screenshot from 2017-12-02 03-13-35
利用tracepath -n [IP位址] 來觀察封包流向

#其實實驗到此已經完成了,我們來進一步探討關於路由的問題
[以host1為例]
ip route add 192.168.20.0/24 via 192.168.10.254 dev h1-eth0——–(1)
ip route add default via 192.168.10.254 dev h1-eth0 ————–(2)

請比較不同和差異?
(1)和(2)的設定均可以讓h1和h2彼此通訊,但是未來如果新增一個192.168.30.0/24網域,使用(1)還要手動增加路由,而(2)卻不用
default代表目的地端的網段如果在路由表中找不到,最後就會依循default的設定往192.168.10.254送,此位址我們稱之為預設閘道

Screenshot from 2017-12-02 03-11-57.png

Screenshot from 2017-12-02 03-12-22
一樣h1和h2間可以互相通訊

如果不想經過這麼繁雜的設定,可以將上面的設定寫成python檔案,再做執行

Screenshot from 2017-12-02 02-48-00

 

【虛擬機主機的網路設定 — 以Parallel Desktop為例】

由於最近要做SDN相關的研究,因此要建立許多的虛擬機,現行虛擬機的軟體有很多種,諸如:Virtual Player/ Virtualbox/ Virtual Workstation / Parallel Desktop 等,有些可免費使用,有些則要付費,本篇以Parallel為例子,一方面是我的host(宿主機)是Mac,使用由Apple自家所開發的Parallel Desktop明顯效能與整合性比其他虛擬機好許多,其中在虛擬機中網卡設定的部分還值得花心思去做研究的。

虛擬機裡面的網卡設定通常會分為四種

  • 斷開
    具有網路卡,但是不進行任何設定
  • Host Only
    具有網路卡,使用隨機IP,不進行對外連線(即無法進行上網)
  • NAT(共用網路)
    藉由NAT(網路地址轉換)功能,通過宿主機所在的網路來存取外部網路。簡單來說就是宿主機器再建立一個區網,宿主機裡面的虛擬主機,就是宿主機裡區域網路裡的主機。
  • Bridge(橋接網路)
    在橋接模式中,虛擬出的網卡會和宿主機的網卡共用資源,也就是虛擬機的網卡會和宿主機的實體網卡綁定在一起,兩者皆位於同一個網域,故可以實現虛擬機和實體主機間的通訊,以及存取外部網路
螢幕快照 2017-12-01 上午12.07.38
Parallel Desktop 裡的網卡設定種類

以下就根據以下網路拓墣來做實驗
0012.png

 

  • 斷開
    螢幕快照 2017-12-02 下午5.30.36

    Screenshot from 2017-12-02 17-38-52
    進入系統後設定都要自己來
  • Host Only
    螢幕快照 2017-12-02 下午5.30.30.png

    Screenshot from 2017-12-02 17-34-32.png
    產生一個內網IP,和區域網路無建立連線
  • NAT
    螢幕快照 2017-12-02 下午5.42.45.png

    整個網路架構等同於以下

    0022.png

    Screenshot from 2017-12-02 17-45-12
    NAT 取得到的 address 為一個虛擬私有IP

    Screenshot from 2017-12-02 20-03-58.png

    螢幕快照 2017-12-02 下午8.00.20
    區網192.168.1.0/24的主機無法 ping 通虛擬機

    我們發現以下特性:
    虛擬主機(IP:10.211.55.5)可以ping到該區網(10.211.55.0/24)所有主機,和上層區網(192.168.1.0/24)的任何主機,但是區網(192.168.1.0/24)的任何主機卻不能ping到虛擬主機(IP:10.211.55.5)

    整理如下
    +———————+————————————–+—————————-+——————-+
    |        主機          |        主動發起ping方向      |        主機(網域)        |.    原因         |
    +———————-+————————————-+—————————+——————-+
        10.211.55.5         <——–>    雙向.                  10.211.55.0/24.        同一網段
        10.211.55.5           ——–>     單向                  192.168.1.0/24    找不到反向路由
        10.211.55.5           ———>    單向                  外部網路                   有NAT服務

    [PS] 若要由外網主動發起連線至10.211.55.5必須設置路由器的DMZ和轉發功能

002_1.png

002_2.png

  • Bridge
    螢幕快照 2017-12-02 下午5.46.21.png
    整個架構等同於以下
    004

    Screenshot from 2017-12-02 17-47-36
    橋接後虛擬機所取得的IP位於192.168.1.0/24這個網域,相當於上一個圖的架構
    螢幕快照 2017-12-02 下午8.31.22
    192.168.1.0/24網域的任一台主機均可以ping到虛擬機
    螢幕快照 2017-12-02 下午8.32.16
    可以在路由器中的ARP列表中發現虛擬機的IP位址被紀錄在裡面

    我們發現以下特性:
    虛擬主機(IP:192.168.1.3)可以ping到該區網(192.168.1.0/24)所有主機,以及存取外部網路,由於該虛擬機已經被紀錄在路由中,區網內的主機均可以ping通

    整理如下
    +———————+————————————–+—————————-+——————-+
    |        主機          |        主動發起ping方向      |        主機(網域)        |.    原因         |
    +———————-+————————————-+—————————+——————-+
        192.168.1.3           <——–>     雙向                  192.168.1.0/24       同一網域
        192.168.1.3            ———>    單向                  外部網路                   有NAT服務

    [PS] 若要由外網主動發起連線至192.168.1.3必須要在路由器設置DMZ功能

 

 

 

 

【MacBook Pro 2011 拆機記 — 清風扇】

對於第一次拆MacBook Pro的確蠻新鮮的,不過隨著Apple公司產品線的發展,新的機種趨向於採用訂製款,說好聽一點就是產品的一致化,其實是不要讓使用者可以輕易的來「改裝」硬體配備,以2011年版的MacBookPro是相對好拆裝的,而且還保有升級空間。

Apple產品令人驚艷於產品的工藝設計,由於做工小巧精緻,不管在拆還是裝的過程中都必須非常小心,尤其是螺絲的部分,真的都非常微小,一旦不小心掉落,可能就遺失了

首先我們先準備好要拆機的螺絲起子組吧,當然還包括MacBookPro的本體

20171125_013752.jpg

我們用「PH000」十字螺絲起子將機殼背板給拆下來

20171125_013043.jpg
小小提醒:建議拆下來的螺絲依照相對位置放置,這樣才能明確紀錄螺絲對應的螺絲孔,你會發現每個孔所對應的螺絲長度不一樣
20171125_010255
「PH000」十字螺絲

準備把皮扒下來囉

內部構造:

  • 左上角為光碟機位置
  • 左下角為硬碟機位置
  • 上方為風扇位置
  • 中間為記憶體位置
  • 右下方為電池位置
20171125_010213.jpg
原來內部長這個樣子啊

還沒有拆風扇前,就可以清楚看到主機板/電池及側邊上沾染了灰塵

20171125_010325.jpg

20171125_010227.jpg

接著來拆風扇,要注意排線,以免斷裂喔

20171125_010727.jpg
拆風扇所使用的「T4」六角星形螺絲
20171125_010906
拆下風扇後,將灰塵一掃而空吧

利用刷子清潔風扇完後的結果

20171125_011222.jpg

再來是拆電池,猛然一看原來電池也積了許多灰塵

20171125_011541.jpg
利用「Y2.0」的Y型螺絲起子來拆電池
20171125_011700.jpg
電池拆下來後,就看到下方的軌跡板囉,一樣拆電池請注意右上角的排線,不要把它扯斷了

清潔完後,就可以把背板蓋上囉

20171125_012404.jpg
清潔完後的樣子
20171125_012419.jpg
突然覺得細微的電晶體還蠻美的 ><
20171125_012611
準備蓋棺論定囉! 哈哈

將螺絲一一鎖上就完成囉

20171125_013740.jpg
小提醒:鎖螺絲時不要一次鎖到底,可以預留一些空間,待每個螺絲都就定位後,再一一鎖緊即可,這樣可以避免螺絲沒有對好孔而崩牙的狀況

 

 

【Mac OS 移除應用程式方法】

一開始小弟拿到蘋果的產品真的興奮了好久,由於對Windows失去信心,被Windows給陰了,於是只好痛定思痛的轉移到蘋果的陣營,疑?真的是很痛嗎,其實是感到既期待又怕受傷害呢,期待Mac能給我不一樣的體驗,諸如:號稱Retina視網膜等級的螢幕,絕佳的系統速度與管理,的確這些真的在小弟剛使用Mac的前期大為震驚,但是又怕從Windows轉移到Mac這段時間的適應期需要多久?

以下就舉一個例子來說,我們在Windows底下安裝應用程式後,哪天想移除這個應用程式,我想我們都會很一致的點選 「控制台」–> 「新增移除程式」,我們就可以開開心心的將它斬草除根了,對我沒有用錯,是「斬草除根」,因為在Mac中要完整的移除應用程式並不是那麼簡單

螢幕快照 2017-11-21 上午2.20.40

螢幕快照 2017-11-21 上午2.20.58

有使用過Mac的人應該不陌生吧,通常直觀的方式就是直接進入應用程式的資料夾,將它丟到垃圾桶中,然而其實這樣並不是完全移除掉,我們只是移除應用程式的捷徑而已,所殘存下來有關該應用程式的相關設定檔案,其實都還留在Mac中,若是要重新安裝該應用程式,上次未完全移除所留下來的檔案,可能會導致這次重新安裝錯誤,或是安裝完後仍是移除之前所設定的環境狀態,因此以下就來說明要如何完整移除應用程式,以下總共有兩種方法

[方法一] 終端機視窗
#此處以「Intellij IDEA」這個應用程式為例
! !!!! 重要提醒 ! !!!!
rm」就是叫電腦執行刪除的動作;「r」表示消除指定目標中的所有一切(一般指該資料夾底下所有檔案);「f」代表「強制(force)」,意思就是告訴電腦在執行檔案刪除時,可以忽略平常的提醒和警示,所以執行此指令要非常謹慎,否則你的資料會跟你Say Goodbye

—————————————————————————-

以下為刪除指令的部分(再次提醒請小心),應用程式名稱請自行替換

  • Configuration 移除應用程式設定檔案
    rm -rf    ~/Library/Preferences/ [應用程式名稱]
  • Caches 移除應用程式快取
    rm -rf    ~/Library/Caches/[應用程式名稱]
  • Plugins 移除應用程式附加套件
    rm -rf   ~/Library/Application Support/[應用程式名稱]
  • Logs 移除應用程式日誌檔案
    rm -rf   ~/Library/Logs/ [應用程式名稱]
螢幕快照 2017-11-21 上午2.27.21
可以在 rm -rf  ~/Library/Caches/ 之後連續按兩下tab鍵,系統會顯示底下可刪除的目錄,在尋找該應用程式所在的目錄即可
螢幕快照 2017-11-21 上午2.27.45
輸入例子中 Intellij IDEA 這個應用程式放置在 IntelliJIdea2017.2中,我們將它移除

其餘依此類推,有時某應用程式可能不會只有存放在一個目錄裡面,有相關的套件都需要移除乾淨,以Intellij IDEA 為例相關的目錄除了「IntelliJIdea2017.2」中外,還有 「Jetbrains」均要做移除

[方法二] Finder視窗

  • 開啟 Finder ,按住鍵盤上「Option」鍵不要放,滑鼠移到前往頁籤,下拉式選單就會出現「資源庫」選項,點選進入
  • 找到Preferences / Caches / Application Support / Logs 以下目錄將對應的應用程式檔案刪除乾淨

 

螢幕快照 2017-11-21 上午3.21.34
按住「Option」鍵才會有喔

 

螢幕快照 2017-11-21 上午3.21.59
進入「Library」

螢幕快照 2017-11-21 上午3.22.28

螢幕快照 2017-11-21 上午3.22.44

螢幕快照 2017-11-21 上午3.23.03

螢幕快照 2017-11-21 上午3.23.19

 

移除完畢後就可以重新進行全新乾淨的安裝囉

螢幕快照 2017-11-21 上午2.39.29
看到Complete Installation有種莫名的感動

 

 

 

【Mininet指令介紹】

現在我們就直接來看看要怎麼操作mininet,mininet下指令的介面分為兩種

  • Mininet CLI Mode (透過mn的指令進入mininet>的提示字元)
  • 直接下完整的mn [各種參數] 來完成指令

    首先我們介紹CLI Mode

    sudo mn
    進入到mininet> 提示字元

    Screenshot from 2017-11-09 02-26-08.png

    Screenshot from 2017-11-09 02-29-02.png
    預設產生出來的拓墣為1個controller/ 1個switch / 2個host
  • 顯示所有網路的連接情況

    mininet> net

    Screenshot from 2017-11-09 02-30-09.png

  • 列出所有節點的資訊

    mininet> nodes

    Screenshot from 2017-11-09 02-30-46.png

  • 列出所有節點的連接狀態

    mininet> links

    Screenshot from 2017-11-09 02-31-03.png

  • 查看交換機連接的port

    mininet> ports

    Screenshot from 2017-11-09 02-31-38.png

  • 顯示各節點資訊

    mininet> dump

    Screenshot from 2017-11-09 02-32-15.png

  • 顯示幫助(可以下的指令包含範例)

    mininet> help

    Screenshot from 2017-11-09 02-32-53.png

  • 列出所有的網路介面

    mininet> intfs

    Screenshot from 2017-11-09 02-34-51.png

  • 兩節點之間進行iperf TCP測試

    mininet> iperf

    Screenshot from 2017-11-09 02-36-31.png

  • 兩節點之間進行自訂頻寬的udp測試

    mininet> iperfudp

    Screenshot from 2017-11-09 02-36-55.png

  • 所有主機與其他所有主機進行ping測試

    mininet> pingall

    Screenshot from 2017-11-09 02-37-18.png

  • 所有主機與其他所有主機進行ping測試,並顯示詳細資訊

    mininet> pingallfull

    Screenshot from 2017-11-09 02-37-35.png

  • 對首兩台主機進行ping測試

    mininet> pingpair

    Screenshot from 2017-11-09 02-37-54.png

  • 對首兩台主機進行ping測試,並顯示詳細資訊

    mininet> pingpairfull

    Screenshot from 2017-11-09 02-38-05.png

  • 顯示設備的網路介面設定

    mininet> [設備名稱 host/switch] ifconfig

    Screenshot from 2017-11-09 02-38-58.png

  • 設備間相互ping

    mininet> [來源設備名稱 host/switch] ping [-c封包數] [目的設備名稱 host/switch]

    Screenshot from 2017-11-09 02-39-32.png

  • 開啟設備的終端機視窗

    mininet> xterm [設備名稱]

    Screenshot from 2017-11-09 02-40-43.png

    Screenshot from 2017-11-09 02-43-26.png
    我們也可以在各個終端機下指令,就好像操作每台設備一樣

     

  • 執行python指令

    mininet> py + 指令/[檔案名].py

    Screenshot from 2017-11-09 02-47-00.png

  • 執行shell指令

    mininet> sh + 指令/[檔案名].shell

    Screenshot from 2017-11-09 02-47-20.png

  • 離開mininet

    mininet> exit

    Screenshot from 2017-11-09 02-47-50.png

    Screenshot from 2017-11-09 02-47-55.png
    離開mininet後回到原系統目錄

    接著我們介紹mn [參數] 模式

    # mn [–topo] [–controller] [–link] [–switch] [–mac] [–nat] [–ipbase]

  • 清除mininet設定(通常上一個拓墣或指令下完,都會先執行清除,避免錯誤)

    mn -c

    Screenshot from 2017-11-09 02-48-19

  • mininet提供的GUI拓墣設定模式(除了在command line的模式下下拓墣指令,mininet更提供了一個人性化的拓墣設計介面)

    # 執行miniedit.py這個檔案
    # 該檔案預設放置於~/mininet/examples底下

    python miniedit.py

    Screenshot from 2017-11-09 03-03-22.png
    執行miniedit.py後的初始化介面

     

    Screenshot from 2017-11-09 03-05-17.png
    設計完拓墣後,按下"run"後發現左邊console也跟著執行拓墣
  • 設定MAC位址等於Deive ID

    # 比較有無–mac參數的差異
    mn [–mac]

    Screenshot from 2017-11-09 03-12-15.png
    一般我們在建立拓樸時,如沒有加入參數–mac,Mininet 將會以隨機產生的方式將產生出來的 MAC address 分配給各個節點,但如果加入了,則會變成有順序的方式產生 MAC address
  • 設定NAT到拓譜中

    # 比較有無–nat參數的差異
    mn [–nat]

    Screenshot from 2017-11-09 03-14-56

  • 設定拓譜內的IP位址

    # 比較有無–ipbase=ip_address參數的差異
    mn [–ipbase=ip_address]

    Screenshot from 2017-11-09 03-20-37.png

  • 在 Mininet 2.0 後允許使用者可以對連線條件進行設定,所以使用者可以進一步的設定頻寬、延遲時間等等

    mn [–link]

    Screenshot from 2017-11-09 03-24-14.png

  • 設定所使用的switch版本

    # Switch 的選擇,對整體的測試是佔有一定程度的影響的。以下就舉UserSwitch跟預設的OVSSwitch進行比較

    mn –switch user –test iperf
    mn –switch ovsk –test iperf

    Screenshot from 2017-11-09 03-26-55.png
    測試出來的數據,有很明顯的差異。UserSwitch因為還需要額外處理核心與使用者介面的溝通,大幅增加效率上的成本。UserSwitch也是會有需要它的時候,但應該不會使用在需要高即時性的狀況下
  • 將 Switch 與 Controller 規劃在同一個 Netwrok Namespace(user switch only)

    # 比較命名空間的不同

    sudo mn –switch user
    sudo mn –innamespace –switch user

    Screenshot from 2017-11-09 03-30-26
    現在我們可以觀察出差別了。加入選項–innamespace後,Switch 跟 Controller 被分開了,並分配在同一個網段中

     

    Screenshot from 2017-11-09 03-32-13.png
    由於controller和switch位於同一個命名空間,亦在同一個網段,故可以互ping
  • mininet與controller進行連接

    # remote表示外部controller
    mn –controller=remote,ip=[controller_ipaddress],port=[controller_listening_port]

    Screenshot from 2017-11-09 03-54-07.png
    mininet與ryu controller連接

     

    Screenshot from 2017-11-09 03-54-45.png
    我們發現h1和h2彼此間無法互相ping
    Screenshot from 2017-11-09 03-56-07.png
    我們在ryu controller執行simple_switch_13.py後,h1和h2間可以相互ping,因為simple_switch_13.py裡面有openvswitch13的相關協定與flow table

     

  • mininet的內建拓墣

    # mn [–topo = single/linear/tree]

    1)單一switch

    –topo single,n
    n表示switch個數

    2.線性拓墣

    –topo linear,n
    n表示n個switch線性連接

    3.樹狀拓墣

    –topo tree,depth=a,fanout=b
    depth表示樹的深度,fanout表示一個節點下面連接n個葉節點。所有葉子節點均為host,非葉子節點均為switch

    Screenshot from 2017-11-09 04-02-59

    Screenshot from 2017-11-09 04-03-26

    Screenshot from 2017-11-09 04-04-27

  • mininet的自定義拓墣

    # mn –custom 路徑/檔案名稱.py –topo=拓墣名稱

    建議直接copy位於~/mininet/custom/底下的topo-2sw-2host.py,來做修改比較不會有error

    /////////////////////////////////////////////////////////////////////////////////////////////
    //                                                controller                                                    //
    //                                               /             |       \                                               //
    //                                   switch          switch   switch                                  //
    //                                 /      |    \              |            |                                         //
    //                 switch   switch switch   host      host                                     //
    //                     |               |         |                                                                   //
    //                 host          host     host                                                               //
    /////////////////////////////////////////////////////////////////////////////////////////////

    Screenshot from 2017-11-09 04-18-25
    自己修改的新拓墣
    Screenshot from 2017-11-09 04-20-53
    執行結果

     

【OpenDayLight(Lithium版本)介紹與安裝 — on Ubuntu 16.04】

OpenDaylight (ODL) is a modular open platform for customizing and automating networks of any size and scale. The OpenDaylight Project arose out of the SDN movement, with a clear focus on network programmability. It was designed from the outset as a foundation for commercial solutions that address a variety of use cases in existing network environments.

ODL is driven by a global, collaborative community of vendor and user organizations that continuously adapts to support the industry’s broadest set of SDN and NFV use cases. With over 1000 developers, 50 member organizations and supporting approximately 1 billion subscribers around the world, OpenDaylight is quickly evolving integrated toolchains for leading use cases.

OpenDaylight code has been integrated or embedded in more than 50 vendor solutions and apps, and can be utilized within a range of services. It is also at the core of broader open source frameworks, including ONAPOpenStack, and OPNFV.

                       (節錄於 https://www.opendaylight.org/what-we-do/odl-platform-overview)

OpenDayLigh是一個開放原始碼軟體專案,由Linux基金會支持。 Linux基金會在2013年4月8日公布了這項專案,其目標在於開發支援軟體定義網路(SDN)的各種軟體工具,建立網路功能虛擬化的基礎。主要開發語言為Java

———————————–  安裝流程 ——————————–

現在我們就直接來看看要怎麼安裝吧,首先我們先安裝好Ubuntu 16.04(在這裡示範的是16.04的版本,其他版本沒有測試過)和mininet(還沒安裝mininet的可先到  【Mininet介紹與安裝 — on Ubuntu 16.04】 看看怎麼安裝吧)

  • 安裝java的jdk版本(建議安裝jdk版本比較完整)

    sudo cd /home/[帳戶名稱]
    sudo apt-get install openjdk-8-jdk

    Screenshot from 2017-11-08 17-02-06.png
    安裝java 8 的jdk版本
  • 檢查java是否有成功安裝,以及版本是否正確

    sudo javac
    sudo java -version

    Screenshot from 2017-11-08 03-30-09.png
    輸入javac指令後,系統會提示後面的參數訊息,確認無誤後按下鍵盤 “Ctrl + C”鍵來停止,確認java的版本號為1.8.X開頭

     

  • 設定java的系統變數

    sudo export JAVA_HOME=/usr/lib/jvm/[java版本號資料夾]
    # 預設java安裝路徑在/usr/lib/jvm/底下

    sudo vi /etc/profile
    # 我們將“JAVA_HOME=/usr/lib/jvm/[java版本號資料夾]” 指令加在/etc/profile 檔案裡面的最後一行,作為系統的全域變數

    sudo source /etc/profile
    # 利用source引入進系統變數內

    Screenshot from 2017-11-08 17-05-15.png
    範例中引入的java安裝位置在/usr/lib/jvm/java-1.8.0-openjdk-amd64,請依照實際狀況做替換
    Screenshot from 2017-11-08 17-05-28.png
    將“JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64”加在/etc/profile檔案中的最後一行並儲存

    Screenshot from 2017-11-08 17-05-46.png

  • 下載OpenDayLight套件

    # 下載方式
    1) 官網中直接透過瀏覽器下載(tar / zip 格式均可)
    2) 透過wget 指令下載

    sudo wget [OpenDayLight的網站位址]

    Screenshot from 2017-11-08 17-08-17.png
    OpenDayLight官網的下載位置,由於本範例採用Lithium的版本,所以要到先前的版本去尋找下載頁面

    Screenshot from 2017-11-08 17-14-09
    透過wget指令下載ODL套件
  • 解開壓縮檔

    # 副檔名為tar.gz適用
    sudo tar -zxvf [檔案名稱].tar.gz

    # 副檔名為zip適用
    sudo unzip  [檔案名稱].zip

    Screenshot from 2017-11-08 17-14-29.png
    此處下載下來的檔案名稱為“distribution-karaf-0.3.0-Lithium.tar.gz”
    Screenshot from 2017-11-08 17-15-07.png
    解壓縮後在該目錄底下多了“distribution-karaf-0.3.0-Lithium”資料夾

     

  • 啟動OpenDayLight

    sudo cd distribution-karaf-0.3.0-Lithium
    sudo cd bin
    sudo ./karaf

    Screenshot from 2017-11-08 17-15-30.png
    進入位於ODL所在資料夾底下的bin,並執行./karaf

     

    Screenshot from 2017-11-08 17-15-52.png
    ODL執行成功後,就會看到此畫面
  • 安裝ODL相關features

    # 啟動成功後,系統會有 opendaylight-user@root> 的提示字元,我們可以進行以下操作
    feature:list                                        查看所有features
    feature:list -i                                     查看所有已安裝的features
    feature:install [feature名稱]          安裝features

    # 我們進行以下套件安裝
    feature:install odl-restconf
    feature:install odl-l2switch-switch
    feature:install odl-l2switch-all
    feature:install odl-openflowplugin-all
    feature:install odl-mdsal-all
    feature:install odl-mdsal-apidocs
    feature:install odl-dlux-all
    feature:install odl-adsal-northbound
    feature:install odl-mdsal-clustering
    feature:install odl-dlux-core
    feature:install odl-dlux-node

    Screenshot from 2017-11-09 05-50-32
    安裝完後就把它放著,不要動它
  • 讓OpenDayLight 連上Mininet

    # 請開出兩個terminate,一個執行ODL,一個執行Mininet
    [ODL左]
    保持剛剛的terminate

    —————————————————-
    [Mininet右]
    mn –topo=tree,3 –controller=remote,ip=[本機端/Controller IP 位址]

    Screenshot from 2017-11-08 17-40-03
    此範例本機端位址為192.168.64.12,請視情況調整
  • 查看OpenDayLight GUI 拓墣

    # 請打開外部瀏覽器
    連結網址http://[Controller IP]:8181/index.html
    帳號以及密碼預設均為admin

    螢幕快照 2017-11-08 下午5.45.33.png
    此處範例是用Mac OS執行parallel desktop虛擬機的ubuntu,故以Mac系統來說算是外部瀏覽器
    螢幕快照 2017-11-08 下午5.37.27
    連結網址http://192.168.64.12:8181/index.html,即可看見ODL的登入介面,帳號密碼輸入admin進行登入,此處Controller IP為192.168.64.12請視情況替換
    螢幕快照 2017-11-08 下午5.41.09
    剛剛用mininet所建立的拓墣
    螢幕快照 2017-11-08 下午5.41.45
    flow table欄位

     

    螢幕快照 2017-11-08 下午5.43.07
    相對於Ryu GUI而言,ODL GUI提供較多的資訊,且介面比較華麗

     

  • 顯示OpenDayLight GUI 拓墣的host節點

    # mininet執行pingall
    mininet> pingall

    # 切換至瀏覽器重新載入即可看到host

    Screenshot from 2017-11-09 05-52-45
    右邊mininet環境中執行pingall指令
    螢幕快照 2017-11-09 上午5.53.00
    ODL拓墣顯示了host節點

     

【Ryu介紹與安裝(利用git安裝) — on Ubuntu 16.04】

Ryu is a component-based software defined networking framework.

Ryu provides software components with well defined API that make it easy for developers to create new network management and control applications. Ryu supports various protocols for managing network devices, such as OpenFlow, Netconf, OF-config, etc. About OpenFlow, Ryu supports fully 1.0, 1.2, 1.3, 1.4, 1.5 and Nicira Extensions.

                                   (節錄於 http://ryu.readthedocs.io/en/latest/getting_started.html)

根據ryu官方網站的說法,ryu提供了軟體定義網路(software defined networking)一個很好的開發框架,其支援許多的API和協定,如此一來不僅是在網路管理或應用開發層面,均方便許多

———————————–  安裝流程 ——————————–

現在我們就直接來看看要怎麼安裝吧,首先我們先安裝好Ubuntu 16.04(在這裡示範的是16.04的版本,其他版本沒有測試過)和mininet(還沒安裝mininet的可先到  【Mininet介紹與安裝 — on Ubuntu 16.04】 看看怎麼安裝吧)

  • 安裝python的套件管理工具

    sudo cd /home/[帳戶名稱]
    sudo apt-get install python-pip
    sudo apt-get install python-setuptools

    Screenshot from 2017-11-04 22-54-13.png

    Screenshot from 2017-11-04 22-55-29.png

  • 安裝python的相依套件

    sudo apt-get install python-eventlet
    sudo apt-get install python-routes
    sudo apt-get install python-webob
    sudo apt-get install python-paramiko
    sudo apt-get install python-gevent

    # 建議一個個套件慢慢安裝,比較能夠看出來是哪個套件安裝出現問題,當然偷懶的話可以下sudo apt-get install python-eventlet python-routes python-webob python-paramiko python-gevent 一次給他安裝完

    Screenshot from 2017-11-04 22-56-03.png

    Screenshot from 2017-11-04 22-56-30.png

    Screenshot from 2017-11-04 22-56-59.png

    Screenshot from 2017-11-04 22-57-19.png

    Screenshot from 2017-11-04 22-58-11.png

  • 安裝python的相依套件(剩下的)

    # 剩下有關的套件一次全部安裝完,以防止出錯

    sudo apt-get install python-dev
    sudo apt-get install autoconf
    sudo apt-get install binutils
    sudo apt-get install bison
    sudo apt-get install build-essential
    sudo apt-get install ccache
    sudo apt-get install flex
    sudo apt-get install gawk
    sudo apt-get install gettext
    sudo apt-get install git
    sudo apt-get install libncurses5-dev
    sudo apt-get install libssl-dev
    sudo apt-get install ncurses-term
    sudo apt-get install quilt
    sudo apt-get install sharutils
    sudo apt-get install subversion
    sudo apt-get install texinfo
    sudo apt-get install xsltproc
    sudo apt-get install zlib1g-dev
    sudo apt-get install libxml2-dev
    sudo apt-get install libxslt1-dev

  • 利用pip安裝執行ryu所需要的相依套件

    pip install lxml
    pip install paramiko
    pip install ovs
    pip install six
    pip install six –upgrade
    pip install flask
    pip install gevent-websocket
    pip install netaddr
    pip install eventlet
    pip install tinyrpc
    pip install msgpack-python
    pip install oslo.config

    Screenshot from 2017-11-04 23-01-16.png
    pip 安裝 lxml / paramiko / ovs 過程

    Screenshot from 2017-11-06 23-20-34.png

    Screenshot from 2017-11-06 23-29-52.png

    Screenshot from 2017-11-06 23-32-03

  • 利用git下載 ryu

    # 使用git前請先確認是否有安裝git (apt-get install git)

    sudo git clone git://github.com/osrg/ryu.git

    Screenshot from 2017-11-04 23-02-41.png
    下載完後在該目錄(/home/parallels)底下會有一個ryu的資料夾
  • 開始安裝ryu

    sudo cd ryu
    sudo python ./setup.py install

    Screenshot from 2017-11-04 23-03-14.png

    Screenshot from 2017-11-04 23-03-30.png
    安裝過程中沒有出現錯誤訊息就代表成功了
  • 修正錯誤(如果沒有發生錯誤的話,就不用修正可直接跳過此步驟)

    # 執行ryu-manager後會跳出DistributionNotFound:XXX的錯誤訊息,我們利用pip install XXX的指令來安裝遺漏的相依套件

    ryu-manager
    pip install tinyrpc
    ryu-manager
    pip install oslo.config>=1.15.0
    ryu-manager
    pip install msgpack-python>=0.3.0

    # 直到出現“loading app ryu.controller.ofp_handler
    instantiating app ryu.controller.ofp_handler of OFPHandler“為止

    Screenshot from 2017-11-04 23-05-46.png
    持續修正遺漏套件

    Screenshot from 2017-11-04 23-06-09.png
    修正完成
  • 讓Ryu連上Mininet

    # 請開出兩個terminate,一個執行Ryu,一個執行Mininet
    [Ryu左]
    ryu-manager –verbose –observe-links ryu/app/gui_topology/gui_topoplogy.py

    —————————————————-
    [Mininet右]
    mn –topo=tree,depth=3 –controller=remote

    Screenshot from 2017-11-04 23-11-58

    Screenshot from 2017-11-04 23-12-05.png

    Screenshot from 2017-11-04 23-12-19.png

  • 打開GUI

    # 打開瀏覽器在網址列輸入127.0.0.1:8080或localhost:8080

    Screenshot from 2017-11-04 23-12-44.png

【Ryu介紹與安裝(利用pip安裝) — on Ubuntu 16.04】

Ryu is a component-based software defined networking framework.

Ryu provides software components with well defined API that make it easy for developers to create new network management and control applications. Ryu supports various protocols for managing network devices, such as OpenFlow, Netconf, OF-config, etc. About OpenFlow, Ryu supports fully 1.0, 1.2, 1.3, 1.4, 1.5 and Nicira Extensions.

                                   (節錄於 http://ryu.readthedocs.io/en/latest/getting_started.html)

根據ryu官方網站的說法,ryu提供了軟體定義網路(software defined networking)一個很好的開發框架,其支援許多的API和協定,如此一來不僅是在網路管理或應用開發層面,均方便許多

———————————–  安裝流程 ——————————–

現在我們就直接來看看要怎麼安裝吧,首先我們先安裝好Ubuntu 16.04(在這裡示範的是16.04的版本,其他版本沒有測試過)和mininet(還沒安裝mininet的可先到  【Mininet介紹與安裝 — on Ubuntu 16.04】 看看怎麼安裝吧)

  • 安裝python的套件管理工具

    sudo apt-get install python-pip
    sudo apt-get install python-setuptools

    Screenshot from 2017-11-04 21-23-21
    pip是Python的套件管理工具,它集合下載、安裝、升級、管理、移除套件等功能,藉由統一的管理,可以使我們事半功倍,更重要的是,也避免了手動執行上述任務會發生的種種錯誤

    Screenshot from 2017-11-04 21-25-21.png

  • 利用pip自帶的ryu套件安裝

    pip install ryu

    Screenshot from 2017-11-04 21-25-44.png

    Screenshot from 2017-11-04 21-26-31.png
    pip 安裝過程會自動下載相關的套件,安裝訊息若沒有跳出錯誤訊息的話,就代表安裝成功
  • 執行Ryu

    ryu-manager [–verbose] [–observe-links]
    # []部分為選用參數
    # verbose 顯示更多訊息,有利於debug
    # observe-link 顯示鏈結間的訊息

    Screenshot from 2017-11-04 21-26-57
    執行ryu-manager後出現“loading app ryu.controller.ofp_handler
    instantiating app ryu.controller.ofp_handler of OFPHandler“就代表正確無誤

     

  • 讓Ryu連上Mininet

    # 請開出兩個terminate,一個執行Ryu,一個執行Mininet
    [Ryu左]             ryu-manager –verbose –observe-links
    [Mininet右]      mn –topo=linear,2 –controller=remote

    Screenshot from 2017-11-04 21-43-53.png
    Ryu執行後會等待mininet的連接
    Screenshot from 2017-11-04 21-45-10
    執行Mininet後,已成功連上Ryu了

     

  • 顯示Ryu的圖形化介面

    # 請開出兩個terminate,一個執行Ryu,一個執行Mininet

    [Ryu左]

    pip show –files ryu      # 尋找ryu的安裝路徑

    cd /usr/local/lib/python2.7/dist-packages

    ryu-manager –verbose –observe-links ryu/app/gui_topology/gui_topoplogy.py

    ——————————————————————
    [Mininet右]

    mn –topo=tree,depth=3 –controller=remote

    Screenshot from 2017-11-04 22-29-40.png

    Screenshot from 2017-11-04 22-30-58.png
    此處的例子ryu是安裝在/usr/local/lib/python2.7/dist-packages 路徑中,請依照現實狀況做更動
    Screenshot from 2017-11-04 22-31-05.png
    執行Ryu後提示訊息綁定在http://0.0.0.0:8080這個位址
    Screenshot from 2017-11-04 22-31-53
    執行Mininet後連接上Ryu

     

  • 打開GUI

    # 打開瀏覽器在網址列輸入127.0.0.1:8080或localhost:8080

    Screenshot from 2017-11-04 22-32-27