Mininet实验 脚本实现控制交换机行为

实验原理

在SDN环境中,控制器可以通过对交换机下发流表操作来控制交换机的转发行为。在本实验中,使用Mininet基于python的脚本,调用“ovs-vsctl”命令直接控制Open vSwitch。


实验内容

一台交换机两台主机,实现从1端口进入的数据流转发到2端口,从2端口进入的数据流转发到1端口

mininet脚本代码如下:

 1 from mininet.net import Mininet
 2 from mininet.node import Node
 3 from mininet.link import Link
 4 from mininet.log import setLogLevel, info
 5 from mininet.util import quietRun
 6
 7 from time import sleep
 8
 9 def scratchNet( cname=‘controller‘, cargs=‘-v ptcp:‘ ):
10     "Create network from scratch using Open vSwitch."
11
12     info( "*** Creating nodes\n" )
13     controller = Node( ‘c0‘, inNamespace=False )
14     switch0 = Node( ‘s0‘, inNamespace=False )
15     h0 = Node( ‘h0‘ )
16     h1 = Node( ‘h1‘ )
17
18     info( "*** Creating links\n" )
19     Link( h0, switch0 )
20     Link( h1, switch0 )
21
22     info( "*** Configuring hosts\n" )
23     h0.setIP( ‘192.168.123.1/24‘ )
24     h1.setIP( ‘192.168.123.2/24‘ )
25     info( str( h0 ) + ‘\n‘ )
26     info( str( h1 ) + ‘\n‘ )
27
28     info( "*** Starting network using Open vSwitch\n" )
29     controller.cmd( cname + ‘ ‘ + cargs + ‘&‘ )
30     switch0.cmd( ‘ovs-vsctl del-br dp0‘ )
31     switch0.cmd( ‘ovs-vsctl add-br dp0‘ )
32
33     for intf in switch0.intfs.values():
34         print (intf)
35         print (switch0.cmd( ‘ovs-vsctl add-port dp0 %s‘ % intf ))
36     switch0.cmd( ‘ovs-vsctl set-controller dp0 tcp:127.0.0.1:6633‘ )
37     switch0.cmd( ‘ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"‘ )
38     switch0.cmd( ‘ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"‘ )
39
40     info( ‘*** Waiting for switch to connect to controller‘ )
41     while ‘is_connected‘ not in quietRun( ‘ovs-vsctl show‘ ):
42         sleep( 1 )
43         info( ‘.‘ )
44     info( ‘\n‘ )
45
46     info( "*** Running test\n" )
47     h0.cmdPrint( ‘ping -c6 ‘ + h1.IP() )
48     h1.cmdPrint( ‘ping -c6 ‘ + h0.IP() )
49
50     info( "*** Stopping network\n" )
51     controller.cmd( ‘kill %‘ + cname )
52     switch0.cmd( ‘ovs-vsctl del-br dp0‘ )
53     switch0.deleteIntfs()
54     info( ‘\n‘ )
55
56 if __name__ == ‘__main__‘:
57     setLogLevel( ‘info‘ )
58     info( ‘*** Scratch network demo (kernel datapath)\n‘ )
59     Mininet.init()
60     scratchNet()

其实,源码中的也可以不用连接controller,直接就可以使用“ovs-vsctl”命令控制控制器。也就是代码中的 switch0.cmd( ‘ovs-vsctl set-controller dp0 tcp:127.0.0.1:6633‘ )其实不是那么必要。

两台交换机两台主机,主机0连接交换机0,主机1连接交换机1,交换机0连接交换机1,数据转发端口要求同脚本1

mininet代码如下:

 1 from mininet.net import Mininet
 2 from mininet.node import Node
 3 from mininet.link import Link
 4 from mininet.log import setLogLevel, info
 5 from mininet.util import quietRun
 6
 7 from time import sleep
 8
 9 def scratchNet( cname=‘controller‘, cargs=‘-v ptcp:‘ ):
10     "Create network from scratch using Open vSwitch."
11
12     info( "*** Creating nodes\n" )
13     controller = Node( ‘c0‘, inNamespace=False )
14     switch0 = Node( ‘s0‘, inNamespace=False )
15     switch1 = Node( ‘s1‘, inNamespace=False )
16     h0 = Node( ‘h0‘ )
17     h1 = Node( ‘h1‘ )
18
19     info( "*** Creating links\n" )
20     Link( h0, switch0 )
21     Link( h1, switch1 )
22     Link( switch0, switch1 )
23
24     info( "*** Configuring hosts\n" )
25     h0.setIP( ‘192.168.123.1/24‘ )
26     h1.setIP( ‘192.168.123.2/24‘ )
27     info( str( h0 ) + ‘\n‘ )
28     info( str( h1 ) + ‘\n‘ )
29
30     info( "*** Starting network using Open vSwitch\n" )
31     controller.cmd( cname + ‘ ‘ + cargs + ‘&‘ )
32     switch0.cmd( ‘ovs-vsctl del-br dp0‘ )
33     switch0.cmd( ‘ovs-vsctl add-br dp0‘ )
34     switch1.cmd( ‘ovs-vsctl del-br dp1‘ )
35     switch1.cmd( ‘ovs-vsctl add-br dp1‘ )
36
37
38     for intf in switch0.intfs.values():
39         print (intf)
40         print (switch0.cmd( ‘ovs-vsctl add-port dp0 %s‘ % intf ))
41
42     for intf in switch1.intfs.values():
43         print (intf)
44         print (switch1.cmd( ‘ovs-vsctl add-port dp1 %s‘ % intf ))
45
46     switch0.cmd( ‘ovs-vsctl set-controller dp0 tcp:127.0.0.1:6633‘ )
47     switch1.cmd( ‘ovs-vsctl set-controller dp1 tcp:127.0.0.1:6633‘ )
48     switch0.cmd( ‘ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"‘ )
49     switch0.cmd( ‘ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"‘ )
50     switch1.cmd( ‘ovs-ofctl add-flow dp1 \"in_port=1 actions=output:2\"‘ )
51     switch1.cmd( ‘ovs-ofctl add-flow dp1 \"in_port=2 actions=output:1\"‘ )
52
53
54     info( ‘*** Waiting for switch to connect to controller‘ )
55     while ‘is_connected‘ not in quietRun( ‘ovs-vsctl show‘ ):
56         sleep( 1 )
57         info( ‘.‘ )
58     info( ‘\n‘ )
59     print (switch0.cmd( ‘ovs-ofctl show dp0‘ ))
60     print (switch1.cmd( ‘ovs-ofctl show dp1‘ ))
61
62
63     info( "*** Running test\n" )
64     h0.cmdPrint( ‘ping -c3 ‘ + h1.IP() )
65     h1.cmdPrint( ‘ping -c3 ‘ + h0.IP() )
66
67     info( "*** Stopping network\n" )
68     controller.cmd( ‘kill %‘ + cname )
69     switch0.cmd( ‘ovs-vsctl del-br dp0‘ )
70     switch0.deleteIntfs()
71     switch1.cmd( ‘ovs-vsctl del-br dp1‘ )
72     switch1.deleteIntfs()
73     info( ‘\n‘ )
74
75 if __name__ == ‘__main__‘:
76     setLogLevel( ‘info‘ )
77     info( ‘*** Scratch network demo (kernel datapath)\n‘ )
78     Mininet.init()
79     scratchNet()

在脚本2的基础上设置带宽、延迟以及丢包率

mininet代码如下:

 1 from mininet.net import Mininet
 2 from mininet.node import Node
 3 from mininet.link import TCLink
 4 from mininet.log import setLogLevel, info
 5 from mininet.util import quietRun
 6
 7 from time import sleep
 8
 9 def scratchNet( cname=‘controller‘, cargs=‘-v ptcp:‘ ):
10     "Create network from scratch using Open vSwitch."
11
12     info( "*** Creating nodes\n" )
13     controller = Node( ‘c0‘, inNamespace=False )
14     switch0 = Node( ‘s0‘, inNamespace=False )
15     switch1 = Node( ‘s1‘, inNamespace=False )
16     h0 = Node( ‘h0‘ )
17     h1 = Node( ‘h1‘ )
18
19     info( "*** Creating links\n" )
20
21     linkopts0=dict(bw=10)
22     linkopts1=dict(bw=10, delay=‘5ms‘, loss=10)
23     TCLink( h0, switch0,**linkopts0)
24     TCLink( h1, switch1,**linkopts0)
25     TCLink( switch0, switch1,**linkopts1)
26
27
28     info( "*** Configuring hosts\n" )
29     h0.setIP( ‘192.168.123.1/24‘ )
30     h1.setIP( ‘192.168.123.2/24‘ )
31     info( str( h0 ) + ‘\n‘ )
32     info( str( h1 ) + ‘\n‘ )
33
34     info( "*** Starting network using Open vSwitch\n" )
35     controller.cmd( cname + ‘ ‘ + cargs + ‘&‘ )
36     switch0.cmd( ‘ovs-vsctl del-br dp0‘ )
37     switch0.cmd( ‘ovs-vsctl add-br dp0‘ )
38     switch1.cmd( ‘ovs-vsctl del-br dp1‘ )
39     switch1.cmd( ‘ovs-vsctl add-br dp1‘ )
40
41
42     for intf in switch0.intfs.values():
43         print (intf)
44         print (switch0.cmd( ‘ovs-vsctl add-port dp0 %s‘ % intf ))
45
46     for intf in switch1.intfs.values():
47         print (intf)
48         print (switch1.cmd( ‘ovs-vsctl add-port dp1 %s‘ % intf ))
49
50     switch0.cmd( ‘ovs-vsctl set-controller dp0 tcp:127.0.0.1:6633‘ )
51     switch1.cmd( ‘ovs-vsctl set-controller dp1 tcp:127.0.0.1:6633‘ )
52     switch0.cmd( ‘ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"‘ )
53     switch0.cmd( ‘ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"‘ )
54     switch1.cmd( ‘ovs-ofctl add-flow dp1 \"in_port=1 actions=output:2\"‘ )
55     switch1.cmd( ‘ovs-ofctl add-flow dp1 \"in_port=2 actions=output:1\"‘ )
56
57
58     info( ‘*** Waiting for switch to connect to controller‘ )
59     while ‘is_connected‘ not in quietRun( ‘ovs-vsctl show‘ ):
60         sleep( 1 )
61         info( ‘.‘ )
62     info( ‘\n‘ )
63     print (switch0.cmd( ‘ovs-ofctl show dp0‘ ))
64     print (switch1.cmd( ‘ovs-ofctl show dp1‘ ))
65
66
67     info( "*** Running test\n" )
68     h0.cmdPrint( ‘ping -c3 ‘ + h1.IP() )
69     h1.cmdPrint( ‘ping -c3 ‘ + h0.IP() )
70
71     info( "*** Stopping network\n" )
72     controller.cmd( ‘kill %‘ + cname )
73     switch0.cmd( ‘ovs-vsctl del-br dp0‘ )
74     switch0.deleteIntfs()
75     switch1.cmd( ‘ovs-vsctl del-br dp1‘ )
76     switch1.deleteIntfs()
77     info( ‘\n‘ )
78
79 if __name__ == ‘__main__‘:
80     setLogLevel( ‘info‘ )
81     info( ‘*** Scratch network demo (kernel datapath)\n‘ )
82     Mininet.init()
83     scratchNet()

原文地址:https://www.cnblogs.com/pullself/p/10225343.html

时间: 2024-08-09 20:43:25

Mininet实验 脚本实现控制交换机行为的相关文章

mininet实验三

mininet实验三-连接floodlight控制器 参考博客一 参考博客二 事先准备-floodlight安装 执行ifconfig命令获取floodlight所在服务器的IP地址. 1.启动floodlight java -jar target/floodlight.jar 浏览器中,输入floodlight ui界面地址:http://localhost:8080/ui/index.html 2.用python脚本通过mininet创建拓扑 切换到/home/mininet目录,请检查是否

Linux shell脚本流程控制

博主搬家至51CTO,初来乍到,请多指教. 此次我们来通过实例解析Linux shell脚本流程控制 Linux shell脚本流程控制可分为三类:顺序执行,条件选择执行,循环执行 顺序执行:简单理解就是逐行执行脚本内容,逐行解读,逐行执行.(此处不做实例解析) 条件选择执行:可以理解为先进行某一条件的判断选择,再决定执行怎样的脚本内容.常见语句if case 条件选择语句:if if语句用法: 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件

使用Js脚本 修改控制IE的注册表相关设置(activex等)

使用Js脚本 修改控制IE的注册表相关设置(activex等) 分类: PHP2012-12-05 18:51 2035人阅读 评论(2) 收藏 举报 脚本写法: <SCRIPT LANGUAGE="JavaScript"><!--var WshShell=new ActiveXObject("WScript.Shell"); //添加信任站点ipWshShell.RegWrite("HKCU\\Software\\Microsoft\\

使用paramiko控制交换机

简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持.因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一. 此外,由于常见的交换机都支持ssh,那么使用paramiko控制交换机变成现实

mininet实验 动态改变转发规则实验

写在前面 本实验参考 POX脚本设置好控制器的转发策略,所以只要理解脚本. mininet脚本设置好拓扑和相关信息,所以也只要理解脚本. POX脚本目前基本看不懂. 本实验我学会了:POX控制器Web界面,第一次真正的看到了流表项. 实验拓扑 在该环境下,假设H1 ping H4,初始的路由规则是S1-S2-S5,一秒后,路由转发规则变为S1-S3-S5,再过一秒,规则变为S1-S4-S5,然后再回到最初的转发规则S1-S2-S5.通过这个循环调度的例子动态地改变交换机的转发规则. 实验步骤 1

Mininet实验 命令延伸实验扩展

本次实验尝试使用命令行.Python脚本编写.交互式界面创建自定义拓扑. 命令行创建拓扑 1.最小的网络拓扑,一个交换机下挂两个主机 1 sudo mn --topo minimal 2.每个交换机连接一个主机,交换机间相连接.本例:4个主机,4个交换机. 1 sudo mn --topo linear,4 3.每个主机都连接到同一个交换机上.本例:三个主机,一个交换机.  1 sudo mn --topo single,3 4.定义深度和扇形形成基于数的拓扑.本例:深度2,扇出2. 1 sud

Mininet实验 动态改变转发规则

介绍 拓扑如下: 在该环境下,假设H1 ping H4,初始的路由规则是S1-S2-S5,一秒后,路由转发规则变为S1-S3-S5,再过一秒,规则变为S1-S4-S5,然后再回到最初的转发规则S1-S2-S5.通过这个循环调度的例子动态地改变交换机的转发规则. pox脚本 pox脚本lab_controller.py 不得不说这脚本问题是真的多. 1 from pox.core import core 2 3 import pox.openflow.libopenflow_01 as of 4

[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

1.CC2530的IO口概述 CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC.定时器或USART外设.这些I/O 口的用途可以通过一系列寄存器配置,由用户软件加以实现. I/O 端口具备如下重要特性:    ?? 21 个数字I/O 引脚 ?? 可以配置为通用I/O 或外部设备I/O ?? 输入口具备上拉或下拉能力 ?? 具有外部中断能力. 21 个I/O 引脚都可以用作于外部中断源输入口.因此如果需要外部设备可以产生中断.外部中断

实验十八: 交换机的端口安全

交换机的端口安全 一.实验目的 掌握交换机的端口安全功能,控制用户的安全接入. 二.背景描述 假设你是某公司的网络管理员,公司要求队网络进行严格控制.为了防止公司的内部用户的IP地址冲突,防止公司内部的网络攻击和破坏行为.为每一位员工分配了固定的IP地址,并且只允许公司员工的主机使用网络,不得随意连接其他主机.例如,某员工分配的ip地址为172.16.1.55/24,主机mac地址是00-06-1B-DE-13-B4,该主机连接在1台2126G上. 三.需求分析 针对交换机的所有端口,配置最连接