實(shí)驗?zāi)康模?/h3>
- 通過python腳本調(diào)用OpenvSwitch命令靴庆;
- 學(xué)習(xí)Mininet基于python腳本創(chuàng)建拓?fù)涞膶?shí)現(xiàn)苟耻;
- 進(jìn)一步深度使用“ovs-vsctl”命令直接控制Open vSwitch。
實(shí)驗原理:
在SDN環(huán)境中破镰,控制器可以通過對交換機(jī)下發(fā)流表操作來控制交換機(jī)的轉(zhuǎn)發(fā)行為。在本實(shí)驗中,使用Mininet基于python的腳本妆丘,調(diào)用“ovs-vsctl”命令直接控制Open vSwitch。使用默認(rèn)的交換機(jī)泛洪規(guī)則局劲,設(shè)置更高的優(yōu)先級規(guī)則進(jìn)行預(yù)先定義IP報文的轉(zhuǎn)發(fā)勺拣。在多個交換機(jī)中通過設(shè)置不同TOS值的數(shù)據(jù)包將通過不同的方式到達(dá)目的地址,驗證主機(jī)間的連通性及到達(dá)目的的時間容握。
實(shí)驗任務(wù):
使用默認(rèn)的交換機(jī)泛洪規(guī)則宣脉,設(shè)置更高的優(yōu)先級規(guī)則進(jìn)行預(yù)先定義IP報文的轉(zhuǎn)發(fā),不同TOS值的數(shù)據(jù)包將通過不同的方式到達(dá)目的地址剔氏。
實(shí)驗步驟:
1塑猖、實(shí)驗環(huán)境
- 安裝了 Ubuntu 16.04 Desktop amd64 的虛擬機(jī)
- 該虛擬機(jī)上已成功安裝mininet
2、實(shí)驗內(nèi)容
實(shí)驗內(nèi)容1:
- 通過vi ovsSingleBr.py創(chuàng)建腳本并添加內(nèi)容谈跛。本實(shí)驗通過python腳本自定義拓?fù)洌?/li>
#!/usr/bin/python
from mininet.net import Mininet
from mininet.node import Node
from mininet.link import Link
from mininet.log import setLogLevel, info
def myNet():
"Create network from scratch using Open vSwitch."
info( "*** Creating nodes\n" )
switch0 = Node( 's0', inNamespace=False )
h0 = Node( 'h0' )
h1 = Node( 'h1' )
h2 = Node( 'h2' )
info( "*** Creating links\n" )
Link( h0, switch0)
Link( h1, switch0)
Link( h2, switch0)
info( "*** Configuring hosts\n" )
h0.setIP( '192.168.123.1/24' )
h1.setIP( '192.168.123.2/24' )
h2.setIP( '192.168.123.3/24' )
info( "*** Starting network using Open vSwitch\n" )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.cmd( 'ovs-vsctl add-br dp0' )
for intf in switch0.intfs.values():
print intf
print switch0.cmd( 'ovs-vsctl add-port dp0 %s' % intf )
# Note: controller and switch are in root namespace, and we
# can connect via loopback interface
#switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:127.0.0.1:6633' )
print switch0.cmd(r'ovs-vsctl show')
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=1,in_port=1,actions=flood' )
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=1,in_port=2,actions=flood' )
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=1,in_port=3,actions=flood' )
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.1,actions=output:1' )
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.2,actions=output:2' )
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.3,actions=output:3')
#switch0.cmd('tcpdump -i s0-eth0 -U -w aaa &')
#h0.cmd('tcpdump -i h0-eth0 -U -w aaa &')
info( "*** Running test\n" )
h0.cmdPrint( 'ping -c 3 ' + h1.IP() )
h0.cmdPrint( 'ping -c 3 ' + h2.IP() )
#print switch0.cmd( 'ovs-ofctl show dp0' )
#print switch0.cmd( 'ovs-ofctl dump-tables dp0' )
#print switch0.cmd( 'ovs-ofctl dump-ports dp0' )
#print switch0.cmd( 'ovs-ofctl dump-flows dp0' )
#print switch0.cmd( 'ovs-ofctl dump-aggregate dp0' )
#print switch0.cmd( 'ovs-ofctl queue-stats dp0' )
info( "*** Stopping network\n" )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.deleteIntfs()
info( '\n' )
if __name__ == '__main__':
setLogLevel( 'info' )
info( '*** Scratch network demo (kernel datapath)\n' )
Mininet.init()
myNet()
通過命令chmod u+x ovsSingleBr.py將ovsSingleBr.py文件賦權(quán)限羊苟。此腳本并未連接控制器,只通過腳本中手動給交換機(jī)下發(fā)流表實(shí)現(xiàn)主機(jī)間的通信感憾。
執(zhí)行腳本命令:
$ sudo su //進(jìn)入管理員權(quán)限
# python ovsSingleBr.py
在沒有控制器的情況下蜡励,在Mininet 腳本中通過調(diào)用 ovs 命令直接向 switch0 交換機(jī)下發(fā)流表,將入端口號為1/2/3 的數(shù)據(jù)包泛洪廣播,并對目的地址為 192.168.123.1/2/3 的數(shù)據(jù)包分別從1/2/3 端口轉(zhuǎn)發(fā)出去凉倚。之后測試 h0 ping h1兼都,h0 ping h2,網(wǎng)絡(luò)連通稽寒。
實(shí)驗內(nèi)容2:
- 通過vi ovsMultiBr.py創(chuàng)建腳本并添加內(nèi)容扮碧。本實(shí)驗通過python腳本自定義拓?fù)洌?/li>
#!/usr/bin/python
from mininet.net import Mininet
from mininet.node import Node
from mininet.link import TCLink
from mininet.log import setLogLevel, info
def myNet():
"Create network from scratch using Open vSwitch."
info( "*** Creating nodes\n" )
switch0 = Node( 's0', inNamespace=False )
switch1 = Node( 's1', inNamespace=False )
switch2 = Node( 's2', inNamespace=False )
switch3 = Node( 's3', inNamespace=False )
switch4 = Node( 's4', inNamespace=False )
h0 = Node( 'h0' )
h1 = Node( 'h1' )
info( "*** Creating links\n" )
linkopts0=dict(bw=100, delay='1ms', loss=0)
linkopts1=dict(bw=1, delay='100ms', loss=0)
linkopts2=dict(bw=10, delay='50ms', loss=0)
linkopts3=dict(bw=100, delay='1ms', loss=0)
TCLink( h0, switch0, **linkopts0)
TCLink( switch0, switch1, **linkopts0)
TCLink( switch0, switch2, **linkopts0)
TCLink( switch0, switch3, **linkopts0)
TCLink( switch1, switch4,**linkopts1)
TCLink( switch2, switch4,**linkopts2)
TCLink( switch3, switch4,**linkopts3)
TCLink( h1, switch4, **linkopts0)
info( "*** Configuring hosts\n" )
h0.setIP( '192.168.123.1/24' )
h1.setIP( '192.168.123.2/24' )
info( str( h0 ) + '\n' )
info( str( h1 ) + '\n' )
info( "*** Starting network using Open vSwitch\n" )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.cmd( 'ovs-vsctl add-br dp0' )
switch1.cmd( 'ovs-vsctl del-br dp1' )
switch1.cmd( 'ovs-vsctl add-br dp1' )
switch2.cmd( 'ovs-vsctl del-br dp2' )
switch2.cmd( 'ovs-vsctl add-br dp2' )
switch3.cmd( 'ovs-vsctl del-br dp3' )
switch3.cmd( 'ovs-vsctl add-br dp3' )
switch4.cmd( 'ovs-vsctl del-br dp4' )
switch4.cmd( 'ovs-vsctl add-br dp4' )
for intf in switch0.intfs.values():
print intf
print switch0.cmd( 'ovs-vsctl add-port dp0 %s' % intf )
for intf in switch1.intfs.values():
print intf
print switch1.cmd( 'ovs-vsctl add-port dp1 %s' % intf )
for intf in switch2.intfs.values():
print intf
print switch2.cmd( 'ovs-vsctl add-port dp2 %s' % intf )
for intf in switch3.intfs.values():
print intf
print switch3.cmd( 'ovs-vsctl add-port dp3 %s' % intf )
for intf in switch4.intfs.values():
print intf
print switch4.cmd( 'ovs-vsctl add-port dp4 %s' % intf )
print switch1.cmd(r'ovs-ofctl add-flow dp1 idle_timeout=0,priority=1,in_port=1,actions=flood' )
print switch1.cmd(r'ovs-ofctl add-flow dp1 idle_timeout=0,priority=1,in_port=1,actions=output:2' )
print switch1.cmd(r'ovs-ofctl add-flow dp1 idle_timeout=0,priority=1,in_port=2,actions=output:1' )
print switch2.cmd(r'ovs-ofctl add-flow dp2 idle_timeout=0,priority=1,in_port=1,actions=output:2' )
print switch2.cmd(r'ovs-ofctl add-flow dp2 idle_timeout=0,priority=1,in_port=2,actions=output:1' )
print switch3.cmd(r'ovs-ofctl add-flow dp3 idle_timeout=0,priority=1,in_port=1,actions=output:2' )
print switch3.cmd(r'ovs-ofctl add-flow dp3 idle_timeout=0,priority=1,in_port=2,actions=output:1' )
print switch4.cmd(r'ovs-ofctl add-flow dp4 idle_timeout=0,priority=1,in_port=1,actions=output:4' )
print switch4.cmd(r'ovs-ofctl add-flow dp4 idle_timeout=0,priority=1,in_port=2,actions=output:4' )
print switch4.cmd(r'ovs-ofctl add-flow dp4 idle_timeout=0,priority=1,in_port=3,actions=output:4' )
print switch4.cmd(r'ovs-ofctl add-flow dp4 idle_timeout=0,priority=1,in_port=4,actions=output:3' )
#print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.2,actions=output:4')
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.2,nw_tos=0x10,actions=output:2')
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.2,nw_tos=0x20,actions=output:3')
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.2,nw_tos=0x30,actions=output:4')
#print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.1,actions=output:1')
#switch0.cmd('tcpdump -i s0-eth0 -U -w aaa &')
#h0.cmd('tcpdump -i h0-eth0 -U -w aaa &')
info( "*** Running test\n" )
h0.cmdPrint( 'ping -Q 0x10 -c 3 ' + h1.IP() )
h0.cmdPrint( 'ping -Q 0x20 -c 3 ' + h1.IP() )
h0.cmdPrint( 'ping -Q 0x30 -c 3 ' + h1.IP() )
#h1.cmdPrint('iperf -s -p 12345 -u &')
#h0.cmdPrint('iperf -c ' + h1.IP() +' -u -b 10m -p 12345 -t 10 -i 1')
#print switch0.cmd( 'ovs-ofctl show dp0' )
#print switch1.cmd( 'ovs-ofctl show dp1' )
#print switch2.cmd( 'ovs-ofctl show dp2' )
#print switch3.cmd( 'ovs-ofctl show dp3' )
#print switch4.cmd( 'ovs-ofctl show dp4' )
#print switch0.cmd( 'ovs-ofctl dump-tables dp0' )
#print switch0.cmd( 'ovs-ofctl dump-ports dp0' )
#print switch0.cmd( 'ovs-ofctl dump-flows dp0' )
#print switch0.cmd( 'ovs-ofctl dump-aggregate dp0' )
#print switch0.cmd( 'ovs-ofctl queue-stats dp0' )
#print "Testing video transmission between h1 and h2"
#h1.cmd('./myrtg_svc -u > myrd &')
#h0.cmd('./mystg_svc -trace st 192.168.123.2')
info( "*** Stopping network\n" )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.deleteIntfs()
switch1.cmd( 'ovs-vsctl del-br dp1' )
switch1.deleteIntfs()
switch2.cmd( 'ovs-vsctl del-br dp2' )
switch2.deleteIntfs()
switch3.cmd( 'ovs-vsctl del-br dp3' )
switch3.deleteIntfs()
switch4.cmd( 'ovs-vsctl del-br dp4' )
switch4.deleteIntfs()
info( '\n' )
if __name__ == '__main__':
setLogLevel( 'info' )
info( '*** Scratch network demo (kernel datapath)\n' )
Mininet.init()
myNet()
通過命令chmod u+x ovsMultiBr.py將ovsMultiBr.py文件賦權(quán)限。此腳本并未連接控制器杏糙,只通過腳本中手動給交換機(jī)下發(fā)流表實(shí)現(xiàn)主機(jī)間的通信慎王。在此任務(wù)二中,給多個交換機(jī)下發(fā)流表宏侍,通過ping操作測試驗證主機(jī)間的連通性赖淤,并通過-Q參數(shù)設(shè)置不通的tos值查看主機(jī)間的連通性。
執(zhí)行腳本命令:
# python ovsMultiBr.py
在沒有控制器的情況下谅河,在mininet 腳本中通過調(diào)用 ovs 命令給多個交換機(jī)下發(fā)流表咱旱,通過 h0 ping h1 操作測試驗證主機(jī)間的連通性,并通過-Q 參數(shù)設(shè)置不通的 tos 值查看主機(jī)間的連通
性旧蛾。通過驗證發(fā)現(xiàn)莽龟,tos 值設(shè)置越大,時間使用越少锨天。
實(shí)驗結(jié)論:
此實(shí)驗并未連接控制器毯盈,只通過腳本在單個/多個交換機(jī)中下發(fā)靜態(tài)流表實(shí)現(xiàn)主機(jī)間的通信。在給多個交換機(jī)下發(fā)流表時病袄,通過ping操作測試驗證主機(jī)間的連通性搂赋,并通過-Q參數(shù)設(shè)置不同的tos值驗證主機(jī)間的連通性及到達(dá)目的地址的時間,通過驗證發(fā)現(xiàn)益缠,tos值設(shè)置越大脑奠,時間使用越少。