實驗環境:VMware Workstation Pro14.一、ubuntu-16.04html
a.先下載OpenDayLight、Postman的安裝包,因爲OpenDayLight是java實現的,須要配置java環境,所以要去下載jdk軟件開發工具包,相應的下載連接以下:java
OpenDayLightBeryllium版本下載連接:https://nexus.opendaylight.org/content/repositories/public/org/opendaylight/integration/distribution-karaf/node
Postman下載連接:https://www.getpostman.com/
python
b.下載好安裝包並解壓後,要先配置Java環境,具體步驟以下:web
sudo gedit ~/.bashrc
export JAVA_HOME=/home/cyk/jdk1.8.0_211 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
a.進入OpenDayLigh的文件夾,運行./karaf (注意不能用sudo運行):
json
b.安裝feature( odl-l2switch-switch-ui安裝時間較長,需耐心等待一段時間):ubuntu
feature:install odl-restconf odl-l2switch-switch-ui odl-openflowplugin-all odl-mdsal-apidocs odl-dlux-core odl-dlux-node odl-dlux-yangui
給定的拓撲結構以下所示:
api
a.建立Python腳本a.py,代碼以下所示:瀏覽器
from mininet.topo import Topo class Mytopo(Topo): def __init__(self): Topo.__init__(self) sw=self.addSwitch('s1') count=1 for i in range(3): host = self.addHost('h{}'.format(count)) self.addLink(host,sw,1,count) count = count + 1 topos = {'mytopo': (lambda:Mytopo())}
b.打開OpenDayLigh,並運行:bash
sudo mn --custom /home/cyk/a.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow13
c.利用pingall來測試主機之間的連通性,結果以下所示:
d.打開火狐瀏覽器訪問http://127.0.0.1:8181/index.html,進入ODL圖形化界面,以後點擊reload,能夠獲得以下圖所示的結果:
a.依次點擊Yang UI>Opendaylight-inventory>config>nodes>table>flow:
b.分別設置nod、table、flow的值,以下圖所示(其中node/openflow:1 交換機編號;table/0 流表編號;flow/不超過1024,不衝突便可流表項編號;GET爲查詢流表,下發流表要修改成PUT;點擊加號添加流表項):
c.使h2在20s內ping不通h3首先要知道h2和h3分別鏈接ovs的哪一個端口,在mininet中用links查詢鏈路鏈接狀況:
從鏈路鏈接狀況能夠看出,h2鏈接s1的2號端口,h3鏈接s1的3號端口
d.在Opendaylight下設置相關值,以下圖所示:
id:流表項id,爲任意值,不衝突便可
in-port:流表項匹配的進入端口,這裏需填h2對應的port號
ethernet-type:以太網類型0x0800
layer-3-match:ipv4-match 三層匹配爲ipv4匹配
ipv4-source:數據包源ip匹配項(這裏因爲port1進入的數據包只多是h2發送的因此能夠不填)
ipv4-destination:數據包目的ip匹配項
新增instruction list這是流表項匹配到數據報後要執行的指令
instruction:apply-actions-case 執行動做
action drop-action-case 丟包動做(轉發動做爲output-action 並要在output-node-connector填寫轉發端口)
priority 流表項優先級,要大於odl下發的默認流表,這裏設置成最大65535
hard-timeout 硬超時,流表項下發後生效時長
table_id 流表id 默認爲0
e.在設置好以後,先在mininet中進行h2 ping h3,而後在WEB UI中選擇PUT,並點擊旁邊的send,結果以下圖所示,icmp_seq會延遲20:
a.經過preview查看剛剛下發的流表項的json格式:
http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/5 { "flow": [ { "id": "5", "match": { "in-port": "2", "ethernet-match": { "ethernet-type": { "type": "0x0800" } }, "ipv4-destination": "10.0.0.3/32" }, "instructions": { "instruction": [ { "order": "0", "apply-actions": { "action": [ { "order": "0", "drop-action": {} } ] } } ] }, "hard-timeout": "20", "table_id": "0" } ] }
b.把preview裏的url複製到地址欄,消息方式選擇PUT,type設置爲Basic Auth,並填寫帳戶和密碼:
c.把Body中將消息格式設置成json,上傳方式設置爲raw,並將preview的消息粘貼在文本框中,修改id和url裏的flow爲2,防止與以前的流表重合,點擊send後下發成功:
d.發送成功後改成GET並send查看剛剛下發的流表項:
在本次實驗中,我學到了不少新的東西,經過利用Python腳本搭建拓撲,鏈接到OpenDayLight控制器而且在控制器提供的WEB UI中下發流表實現具體功能,以及藉助Postman經過OpenDayLight的北向接口下發流表,再利用OpenDayLight北向接口查看已下發的流表,我掌握了OpenDayLight、Postman的基本使用方法與操做命令,在本次控制平面的學習實踐中,我對控制器在SDN的角色有了一個更深的理解和體會!