SDN學習+Mininet+OpenDaylight


SDN

SDN介紹

SDN字面意思是軟件定義網絡,SDN將在整個網絡(不僅僅是網元)的垂直方向變得開放、標准化、可編程,從而讓人們更容易、更有效地使用網絡資源。

在傳統的架構中,交換機和路由器不得不在操作6000種分布式協議的控制下實施整個網絡的智能。這就意味着,即使只有一個網元增加了一種新的協議,也需要所有其他網元做出相應的結構變更。事實上,在網絡中增加一種新的協議往往需要數年時間,才能最終完成標准化到實際部署的過程。

Mininet

Mininet是什么

Mininet是由一些虛擬的終端節點(end-hosts)、交換機、路由器連接而成的一個網絡仿真器,它采用輕量級的虛擬化技術使得系統可以和真實網絡相媲美。

Mininet可以很方便地創建一個支持SDN的網絡:host就像真實的電腦一樣工作,可以使用ssh登錄,啟動應用程序,程序可以向以太網端口發送數 據包,數據包會被交換機、路由器接收並處理。有了這個網絡,就可以靈活地為網絡添加新的功能並進行相關測試,然后輕松部署到真實的硬件環境中。

Mininet安裝與部署

Mininet虛擬機安裝

  1. 下載Mininet鏡像:https://github.com/mininet/mininet/releases
  2. 下載虛擬機軟件. VirtualBox , VMware Workstation
  3. 安裝鏡像

本地安裝(推薦)

通過Git拉取源代碼

git clone git://github.com/mininet/mininet

安裝Mininet,根據mininet/util/install.sh -h 查看命令選擇

mininet/util/install.sh -n3V 2.5.0

安裝完成后,使用命令測試Mininet安裝是否成功

sudo mn --test pingall

SDN_Command

安裝Mininet文件包(最省事)

在Ubuntu安裝Mininet文件包

sudo apt install mininet/precise-backports

安裝時遇到的問題

Mininet_Q1.png

提示6653端口被占用

sudo service openvswitch-testcontroller stop

內部交互命令

使用sudo mn 進入交互后創建默認拓撲

help #查看幫助命令
net #查看鏈路信息
nodes #查看網絡里面有多少節點以及有什么節點
links #查看鏈路健壯性,看看某條鏈路是不是在正常工作
pingall #測試所有主機間通信
pingpair #只驗證前兩個主機連通性-
dump #節點信息
intfs #網絡接口信息
iperf h1 h2 #測試H1 H2的帶寬
link s1 s2 up#禁用或開始節點間的鏈路
iperfudp bw h1 h2 #測試H1 H2 的UDP帶寬
xterm h1 #節點開啟可視化操作
py net.addSwtich("s1") #執行python 表達式

py實驗

添加一個h3 並連接至 s1

py net.addHost('h3') #添加一個主機h3
py net.addLink(s1,net.get('h3')) #將s1 和 h3連接起來
py s1.attach('s1-eth3') #添加接口s1-eth3
py net.get('h3').cmd('ifconfig h3-eth0 10.3') #給h3設置ip
py dump #查看設備的信息
#發現我們的h3並沒有顯示我們設置的IP 依然為none
#我們需要h1 ping h3命令,讓設備發現他的ip。在dump即可查看正確的設備信息。

OpenDaylight

1.安裝ODL依賴包

  sudo apt-get update
  sudo apt-get install openjdk-8-jdk

2.下載OpenDaylight控制器:http://www.opendaylight.org/software/downloads

 tar zxvf distribution-karaf-0.3.0-Lithium.tar.gz

3.配置Java環境

打開 vi /etc/profile

添加以下代碼

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64

JRE_HOME=$JAVA_HOME/jre

CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

export JAVA_HOME JRE_HOME CLASS_PATH PATH

source 文件

source /etc/profile

4.測試是否安裝成功

cd distribution-karaf-0.3.0-Lithium

執行./bin/karaf

執行成功后

odl.png

流表

當前拓撲圖為

實驗目標為:

h1 無法ping h2

dpctl del-flows
#清除所有流表,也可以使用sh ovs-ofctl s1  del-flows 針對S1刪除流表
dpctl add-flow in_port=1,actions=output:2 
#讓1端口添加output 2端口
dpctl add-flow in_port=2,actions=output:3,output:1 
#讓2端口添加output 3,1端口
dpctl add-flow in_port=3,actions=output:2
#讓3端口添加output 2端口

輸入pingall 結果為

1   ->  h2 X 
h2  ->  h1 h3 
h3  ->  X  h2 

再來一個實驗

任務目標是使得h1 與 h2 通, h3 與 h4通, h1 與 h3 不通。

根據這個任務目標,也就是只有相同交換機下的主機才可以互通。

h1 連接了 s2 的 2 端口

h2 連接了 s2 的 3端口

h3 連接了 s3 的 2端口

h4 連接了 s3的 3端口

只要交換機之間不互通即可。交換機是1,3端口。先刪除所有流表,在添加 2 ,3的互通。

dpctl del-flows 
dpctl add-flow in_port=2,actions=output:3
dpctl add-flow in_port=3,actions=output:2

pingall結果:

h1 -> h2 X X 
h2 -> h1 X X 
h3 -> X X h4 
h4 -> X X h3

用另外一種思路

將s1路由器來自1端口的全部丟棄,也可以實現。

 sh ovs-ofctl add-flow s1 priority=50,in_port=1,action=drop


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM