1 实验目的
- 熟悉Mininet自定义拓扑脚本的编写;
- 掌握使用“ovs-vsctl”命令直接控制Open vSwitch。
2 实验原理
在SDN环境中,控制器可以通过对交换机下发流表操作来控制交换机的转发行为。在本实验中,使用Mininet基于python的脚本,调用“ovs-vsctl”命令直接控制Open vSwitch。
3 实验任务
本实验在基于Mininet脚本的不同拓扑环境下使用OpenDaylight控制交换机行为。任务一:一台交换机两台主机,从1端口进入的数据流转发到2端口,从2端口进入的数据流转发到1端口;任务二:两台交换机两台主机,主机0连接交换机0,主机1连接交换机1,交换机0连接交换机1,数据转发端口同任务一;任务三:与任务二类似,但是在创建link的时候,设置带宽、延迟以及丢包率。
4 实验步骤
4.1 搭建环境
步骤1:创建虚网
1 在首页单击“创建虚网”,本次实验虚网名为“Slice5”,虚网名只能包括数字、字母和下划线。
2 单击“下一步”,选择网络拓扑,再单击“下一步”,确认虚网清单。
3 单击“创建”,成功创建虚网。
步骤2:添加控制器
1 单击虚网名(这里是“Slice5”),进入“虚网详情”页。
2 单击“控制器”部分的“”按钮,请根据实际情况选择控制器。由于启动虚网必须要创建一个控制器,此处的控制器选择不影响实验结果(这里选择的是Floodlight控制器),接着按照提示直到创建成功。
步骤3:添加网关
单击“网关”部分的“”按钮,添加网关。
步骤4:创建虚拟机
本实验需要两个虚拟机,这里分别取名为odl和mininet。虚拟机odl选择OpenDaylight镜像作为控制器,2核,6G;虚拟机mininet在这里选择了mininet-OF13镜像,在该虚拟机中编写Mininet脚本完成实验任务。
本次实验的镜像选择如下:
odl:
mininet:
创建成功后的虚网详情:
步骤5:启动虚网、网关和虚拟机
1 单击页面右上角的“”按钮,启动虚网,虚网启动成功后,控制器也会启动成功。
2 单击“网关”部分的“”按钮,启动网关。
3 选择“虚拟机”部分创建好的两个虚拟机,单击“”按钮启动。
4.2 实验操作
任务一:一台交换机两台主机,实现从1端口进入的数据流转发到2端口,从2端口进入的数据流转发到1端口。
1 在虚拟机mininet里新建文件mymininet1.py
1 |
#touch mymininet1.py |
2 查看OpenDaylight所在虚拟机odl的IP为20.0.0.84
3 编辑文件mymininet1.py,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#!/usr/bin/python from mininet.net import Mininet from mininet.node import Node from mininet.link import Link from mininet.log import setLogLevel, info from mininet.util import quietRun from time import sleep def scratchNet( cname='controller', cargs='-v ptcp:' ): "Create network from scratch using Open vSwitch." info( "*** Creating nodes\n" ) controller = Node( 'c0', inNamespace=False ) switch0 = Node( 's0', inNamespace=False ) h0 = Node( 'h0' ) h1 = Node( 'h1' ) info( "*** Creating links\n" ) Link( h0, switch0 ) Link( h1, switch0 ) 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" ) controller.cmd( cname + ' ' + cargs + '&' ) 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 ) switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:20.0.0.84:6633' ) switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"' ) switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"' ) info( '*** Waiting for switch to connect to controller' ) while 'is_connected' not in quietRun( 'ovs-vsctl show' ): sleep( 1 ) info( '.' ) info( '\n' ) info( "*** Running test\n" ) h0.cmdPrint( 'ping -c6 ' + h1.IP() ) h1.cmdPrint( 'ping -c6 ' + h0.IP() ) info( "*** Stopping network\n" ) controller.cmd( 'kill %' + cname ) 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() scratchNet() |
4 将文件mymininet1.py设置成可执行文件
1 |
#chmod +x mymininet1.py |
5执行文件mymininet1.py
1 |
#./mymininet1.py |
任务二:两台交换机两台主机,主机0连接交换机0,主机1连接交换机1,交换机0连接交换机1,数据转发端口要求同任务一。
1 在虚拟机mininet里新建文件mymininet2.py
1 |
#touch mymininet2.py |
2 编辑文件mymininet2.py,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
#!/usr/bin/python from mininet.net import Mininet from mininet.node import Node from mininet.link import Link from mininet.log import setLogLevel, info from mininet.util import quietRun from time import sleep def scratchNet( cname='controller', cargs='-v ptcp:' ): "Create network from scratch using Open vSwitch." info( "*** Creating nodes\n" ) controller = Node( 'c0', inNamespace=False ) switch0 = Node( 's0', inNamespace=False ) switch1 = Node( 's1', inNamespace=False ) h0 = Node( 'h0' ) h1 = Node( 'h1' ) info( "*** Creating links\n" ) Link( h0, switch0 ) Link( h1, switch1 ) Link( switch0, switch1 ) 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" ) controller.cmd( cname + ' ' + cargs + '&' ) 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' ) 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 ) switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:20.0.0.84:6633' ) switch1.cmd( 'ovs-vsctl set-controller dp1 tcp: 20.0.0.84:6633' ) switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"' ) switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"' ) switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=1 actions=output:2\"' ) switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=2 actions=output:1\"' ) info( '*** Waiting for switch to connect to controller' ) while 'is_connected' not in quietRun( 'ovs-vsctl show' ): sleep( 1 ) info( '.' ) info( '\n' ) print switch0.cmd( 'ovs-ofctl show dp0' ) print switch1.cmd( 'ovs-ofctl show dp1' ) info( "*** Running test\n" ) h0.cmdPrint( 'ping -c3 ' + h1.IP() ) h1.cmdPrint( 'ping -c3 ' + h0.IP() ) info( "*** Stopping network\n" ) controller.cmd( 'kill %' + cname ) switch0.cmd( 'ovs-vsctl del-br dp0' ) switch0.deleteIntfs() switch1.cmd( 'ovs-vsctl del-br dp1' ) switch1.deleteIntfs() info( '\n' ) if __name__ == '__main__': setLogLevel( 'info' ) info( '*** Scratch network demo (kernel datapath)\n' ) Mininet.init() scratchNet() |
3 将文件mymininet2.py设置成可执行文件
1 |
#chmod +x mymininet2.py |
4 执行文件mymininet2.py
1 |
#./mymininet2.py |
任务三:与任务二类似,但是在创建link的时候,设置带宽、延迟以及丢包率。
1 在虚拟机mininet里新建文件mymininet3.py
1 |
#touch mymininet3.py |
2 编辑文件mymininet3.py,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
#!/usr/bin/python from mininet.net import Mininet from mininet.node import Node from mininet.link import TCLink from mininet.log import setLogLevel, info from mininet.util import quietRun from time import sleep def scratchNet( cname='controller', cargs='-v ptcp:' ): "Create network from scratch using Open vSwitch." info( "*** Creating nodes\n" ) controller = Node( 'c0', inNamespace=False ) switch0 = Node( 's0', inNamespace=False ) switch1 = Node( 's1', inNamespace=False ) h0 = Node( 'h0' ) h1 = Node( 'h1' ) info( "*** Creating links\n" ) linkopts0=dict(bw=10) linkopts1=dict(bw=10, delay='5ms', loss=10) TCLink( h0, switch0,**linkopts0) TCLink( h1, switch1,**linkopts0) TCLink( switch0, switch1,**linkopts1) 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" ) controller.cmd( cname + ' ' + cargs + '&' ) 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' ) 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 ) switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:20.0.0.84:6633' ) switch1.cmd( 'ovs-vsctl set-controller dp1 tcp: 20.0.0.84:6633' ) switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"' ) switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"' ) switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=1 actions=output:2\"' ) switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=2 actions=output:1\"' ) info( '*** Waiting for switch to connect to controller' ) while 'is_connected' not in quietRun( 'ovs-vsctl show' ): sleep( 1 ) info( '.' ) info( '\n' ) print switch0.cmd( 'ovs-ofctl show dp0' ) print switch1.cmd( 'ovs-ofctl show dp1' ) info( "*** Running test\n" ) h0.cmdPrint( 'ping -c3 ' + h1.IP() ) h1.cmdPrint( 'ping -c3 ' + h0.IP() ) info( "*** Stopping network\n" ) controller.cmd( 'kill %' + cname ) switch0.cmd( 'ovs-vsctl del-br dp0' ) switch0.deleteIntfs() switch1.cmd( 'ovs-vsctl del-br dp1' ) switch1.deleteIntfs() info( '\n' ) if __name__ == '__main__': setLogLevel( 'info' ) info( '*** Scratch network demo (kernel datapath)\n' ) Mininet.init() scratchNet() |
3 将文件mymininet3.py设置成可执行文件
1 |
#chmod +x mymininet3.py |
4执行文件mymininet3.py
1 |
#./mymininet3.py |
5 实验结论
在Mininet脚本中,可以通过使用“ovs-vsctl”命令直接控制Open vSwitch,实现通信。
请输入评论内容