SDN
SDN介紹
SDN字面意思是軟件定義網絡,SDN將在整個網絡(不僅僅是網元)的垂直方向變得開放、標准化、可編程,從而讓人們更容易、更有效地使用網絡資源。
在傳統的架構中,交換機和路由器不得不在操作6000種分布式協議的控制下實施整個網絡的智能。這就意味着,即使只有一個網元增加了一種新的協議,也需要所有其他網元做出相應的結構變更。事實上,在網絡中增加一種新的協議往往需要數年時間,才能最終完成標准化到實際部署的過程。
Mininet
Mininet是什么
Mininet是由一些虛擬的終端節點(end-hosts)、交換機、路由器連接而成的一個網絡仿真器,它采用輕量級的虛擬化技術使得系統可以和真實網絡相媲美。
Mininet可以很方便地創建一個支持SDN的網絡:host就像真實的電腦一樣工作,可以使用ssh登錄,啟動應用程序,程序可以向以太網端口發送數 據包,數據包會被交換機、路由器接收並處理。有了這個網絡,就可以靈活地為網絡添加新的功能並進行相關測試,然后輕松部署到真實的硬件環境中。
Mininet安裝與部署
Mininet虛擬機安裝
- 下載Mininet鏡像:https://github.com/mininet/mininet/releases
- 下載虛擬機軟件. VirtualBox , VMware Workstation
- 安裝鏡像
本地安裝(推薦)
通過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

安裝Mininet文件包(最省事)
在Ubuntu安裝Mininet文件包
sudo apt install mininet/precise-backports
安裝時遇到的問題

提示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
執行成功后

流表
當前拓撲圖為

實驗目標為:
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
