安装:
参考 : https://www.cnblogs.com/cotyb/p/5042072.html
https://blog.csdn.net/Mr_Wanderer/article/details/107028267
https://blog.csdn.net/qq_19696893/article/details/123747960
- 开启ovsdb-server配置数据库:有两种方式,如果要使用ssl连接,务必在编译前安装好libssl-dev以及openssl。之后可以在/usr/local/var/log/openvswitch中查看日志ovsdb-server.log
- no ssl
ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \ --remote=db:Open_vSwitch,Open_vSwitch,manager_options \ --pidfile --detach --log-file
- ssl1
ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \ --remote=db:Open_vSwitch,Open_vSwitch,manager_options \ --private-key=db:Open_vSwitch,SSL,private_key \ --certificate=db:Open_vSwitch,SSL,certificate \ --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \ --pidfile --detach --log-file
- no ssl
- 开启ovs-vsctl
ovs-vsctl --no-wait init
- 开启ovs-switchd功能,即主进程
ovs-vswitchd --pidfile --detach service openvswitch-switch start
命令:
1.1 mininet命令(mininet CLI环境)
在终端输入sudo mn
,打开mininet进入CLI交互窗口。
- 基本命令:
在CLI环境下输入help
便可以获取可执行命令的信息,在2.3版本中有以下28个命令:
输入:help command
便可以获取该命令的详细帮助信息。下面介绍几组常用命令:
mininet>nodes 查看全部节点信息
mininet>net 查看链路信息
mininet>dump 查看各节点详细信息
mininet>pingall 测试所有结点是否连通
mininet>pingpair 两个主机将互 pingmininet>link s1 h2 up/down 启用/禁用s1跟h2之间的链路
mininet>links 报告所有链路状态
mininet>iperf h1 h2 两个节点之间用指定简单的 TCP 测试
mininet>iperfudp 10M h1 h2 两个节点之间用指定简单 udp 进行测试,10M指自己设置的带宽
mininet>time [command] 测量命令所执行的时间mininet>xterm/gterm s1 打开某结点控制终端
mininet>sh [cmd args] 运行外部 shell 命令
mininet>px/py 执行 python 语句
mininet>source <file> 从输入文件读入命令mininet>exit/quit/EOF 退出 mininet 命令行
在节点执行系统命令:
前面提到mininet采用轻量级的虚拟化技术,使得其模拟的每台主机和交换机都是独立的,所以可以像在真实主机的终端中执行命令一样,在模拟的主机或交换机上执行任何系统命令。在CLI环境中执行的格式为:node command,command 格式和用法同Linux主机,如:
mininet>h1 ifconfig 查看h1节点网络信息
mininet>h1 ping -c 4 h2 实现两主机互连测试
mininet>h1 ifconfig h1-eth0 10.108.126.3 netmask 255.255.255.0 修改虚拟的主机的ip以及mask地址
1.2 mininet可视化界面
2.2.0以后版本的mininet支持可视化,在/home/mininet/mininet/examples目录下提供miniedit.py脚本,切换到相应目录下,在终端中执行:
sudo ./miniedit.py
1.3 mn启动参数,格式mn [options]
创建拓扑
(创建完一种类型后可exit退出,然后再尝试创建不同类型)**创建single拓扑:(单一(Single)**拓扑指整个网络拓扑中交换机有且只有一个,交换机可以下挂一个或多个主机)sudo mn --topo=single,3 :本例创建了一个交换机、3个主机,3个主机都下挂在一个交换机下**创建 linear(线性)拓扑:(线性(linear)**拓扑指交换机连接呈线形排列,且每个交换机所连接主机数目只有一个)sudo mn --topo=linear,3 :本例创建了3个交换机、3个主机,3个主机分别下挂在一个交换机下**创建树形(tree)拓扑:(树形(tree)**拓扑指交换机连接成树形排列,且每个交换机所连接主机一般有多个关联使用参数depth及fanout)sudo mn --topo=tree,depth=2,fanout=2 :本例创建了depth为2,fanout为2的拓扑,表示交换机深度即层数为2,每个交换机下挂2个设备创建自定义拓扑:(自定义(custom)拓扑指python编写文件file.py,执行此脚本即可创建定义的拓扑,—custom与—topo联用)# cd /home/openlab/openlab/mininet/custom# sudo mn --custom topo-2sw-2host.py --topo mytopo : 本例在custom目录下存在topo-2sw-2host.py文件,调用此文件构建拓扑
- 自动设置MAC地址和ARP条目
--mac 自动设置MAC地址,MAC地址与IP地址的最后一个字节相同
--arp 为每个主机设置静态ARP表,存储同一网段的主机的mac和IP
- 设置交换机
--switch default|ivs|lxbr|ovs|ovsbr|ovsk|user[,param=value...] 其中,ovs,defaul,ovsk都为OVS(openvswitch)交换机,lxbr=LinuxBridge user=UserSwitch ivs=IVSSwitch ovsbr=OVSBridge
- 设置控制器
--controller=default|none|nox|ovsc|ref|remote|ryu[,param=value...]其中, ovsc=OVSController none=NullControllerremote=RemoteController default=DefaultControllernox=NOX ryu=Ryu ref=Controller
--controller=remote,ip=[controller IP] ,port=[controller listening port] 设置远程控制器
比如:设定启动支持openflow1.3的交换机和IP为10.108.125.9的远程交换机:
sudo mn --controller=remote,ip=10.108.125.9,port=6653 --switch ovsk,protocols=OpenFlow13
- 定义网络拓扑
--topo single,n 单交换机,星型拓扑, n表示主机数--topo linear,n 线性拓仆,n表示n个交换机直线连接--topo tree,depth=a,fanout=b 树状拓仆,depth表示树深度,fanout表示每个结点有几个子结点。所有叶子结点都为主机,非叶子结点为交换机--topo minimal|reversed|torus[,param=value] MinimalTopo,SingleSwitchReversedTopo,TorusTopo
--custom ~/mininet/custom/mytopo.py --topo=mytopo 用户自定义拓扑(mytopo.py是自己定义拓扑的python文件)
注: 一般在实际应用的时候,我们并不会通过上述两种方式创建网络拓扑,而是直接创建python脚本,在脚本中导入相关的模块,调用mininet的功能,python解释器直接执行。这样方便结合其他项目进行开发。具体可以参考mininet搭建自定义网络拓扑。
- 为所有主机,包括交换机和主机、控制器,在运行时打开各自的xterm
mn –x //作用同在cli环境中运行xterm
- 退出并且清理
sudo mn –c
- 其他可用的mn命令
--host=HOST cfs|proc|rt[,param=value...]rt=CPULimitedHost{'sched': 'rt'} proc=Hostcfs=CPULimitedHost{'sched': 'cfs'}--link=LINK default|ovs|tc|tcu[,param=value...] default=Link ovs=OVSLink tcu=TCULink tc=TCLink--custom=CUSTOM read custom classes or params from .py file(s)--test=TEST none|build|all|iperf|pingpair|iperfudp|pingall-i IPBASE, --ipbase=IPBASEbase IP address for hosts-v VERBOSITY, --verbosity=VERBOSITYinfo|warning|critical|error|debug|output--innamespace sw and ctrl in namespace?--listenport=LISTENPORTbase port for passive switch listening--nolistenport don't use passive listening port--pre=PRE CLI script to run before tests--post=POST CLI script to run after tests--pin pin hosts to CPU cores (requires --host cfs or --host rt)--nat [option=val...] adds a NAT to the topology that connects Mininet hosts to the physical network.Warning: This may route any traffic on the machine that uses Mininet's IP subnet into the Mininet network. If you need to change Mininet's IP subnet, see the --ipbase option.--version prints the version and exits--cluster=server1,server2...run on multiple servers (experimental!)--placement=block|randomnode placement for --cluster (experimental!)
3. 流表操作
2.1 使用命令查看交换机中的流表
- 查看流表项:
mininet>dpctl dump-flows
在一个depth=2,fanout=2的树形拓扑中,执行h1 ping -c1 h2,得到流表项如下:
mn --topo tree,depth=2,fanout=2 mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
*** s2 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):cookie=0x0, duration=4.087s, table=0, n_packets=1, n_bytes=42, idle_timeout=60, idle_age=4, priority=65535,arp,in_port=2,vlan_tci=0x0000,dl_src=06:7d:8b:e3:9f:b5,dl_dst=22:7e:4a:a6:25:c7,arp_spa=10.0.0.2,arp_tpa=10.0.0.1,arp_op=2 actions=output:1cookie=0x0, duration=4.086s, table=0, n_packets=1, n_bytes=98, idle_timeout=60, idle_age=4, priority=65535,icmp,in_port=1,vlan_tci=0x0000,dl_src=22:7e:4a:a6:25:c7,dl_dst=06:7d:8b:e3:9f:b5,nw_src=10.0.0.1,nw_dst=10.0.0.2,nw_tos=0,icmp_type=8,icmp_code=0 actions=output:2cookie=0x0, duration=4.085s, table=0, n_packets=1, n_bytes=98, idle_timeout=60, idle_age=4, priority=65535,icmp,in_port=2,vlan_tci=0x0000,dl_src=06:7d:8b:e3:9f:b5,dl_dst=22:7e:4a:a6:25:c7,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,icmp_type=0,icmp_code=0 actions=output:1
*** s3 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
mininet>
- 添加流表项:
mininet>dpctl add-flow in_port=2,actions=output:1
mininet>dpctl add-flow in_port=1,actions=output:2
在所有的交换机中添加流表,让从1号端口进入的报文都从2号端口转发,添加后流表项如下(在操作之前先清空交换机中的流表):
mininet> dpctl add-flow in_port=1,actions=output:2
*** s1 ------------------------------------------------------------------------
*** s2 ------------------------------------------------------------------------
*** s3 ------------------------------------------------------------------------
mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):cookie=0x0, duration=3.454s, table=0, n_packets=0, n_bytes=0, idle_age=3, in_port=1 actions=output:2
*** s2 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):cookie=0x0, duration=3.454s, table=0, n_packets=0, n_bytes=0, idle_age=3, in_port=1 actions=output:2
*** s3 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):cookie=0x0, duration=3.455s, table=0, n_packets=0, n_bytes=0, idle_age=3, in_port=1 actions=output:2
流表匹配的报文数n_packets都为0,这时候通过h1 ping h2,再查看流表项:
mininet> h1 ping -c1 h2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=1.79 ms--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.793/1.793/1.793/0.000 ms
mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):cookie=0x0, duration=35.967s, table=0, n_packets=2, n_bytes=140, idle_age=0, in_port=1 actions=output:2
*** s2 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):cookie=0x0, duration=35.967s, table=0, n_packets=2, n_bytes=140, idle_age=0, in_port=1 actions=output:2
*** s3 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):cookie=0x0, duration=35.968s, table=0, n_packets=0, n_bytes=0, idle_age=35, in_port=1 actions=output:2
这时候直接可以ping通,发现s2中的流表匹配到两个报文(一个arp请求,一个icmp请求),但通过h1 ping h3,却发现不通,因为从1端口的报文都会无条件匹配到2号端口:
mininet> h1 ping -c1 h3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
From 10.0.0.1 icmp_seq=1 Destination Host Unreachable--- 10.0.0.3 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
- 删除表项:
mininet>dpctl del-flows
- 删除后再查看,流表为空:
mininet> dpctl del-flows
*** s1 ------------------------------------------------------------------------
*** s2 ------------------------------------------------------------------------
*** s3 ------------------------------------------------------------------------
mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
*** s2 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
*** s3 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
这种流表的操作方式十分不方便,也很少有人这样使用。一般操作流表都使用ovs-ofctl,ofctl等工具在终端中操作或通过控制器环境操作。具体见下一节。
2.2 使用命令查看交换机中的流表
ovs-ofctl是命令行下的交换机管理工具,也可以在终端中用来管理openflow 流表。
查看交换机中的流表项:
sudo ovs-ofctl dump-flows -O openflow13 s1 # -O参数后面跟协议,s1表示交换机的id。
ovs-ofctl dump-flows br-sw
当然,也可在mininet的命令行窗口使用sh
命令来直接调用上述指令:
mininet> sh ovs-ofctl dump-flows -O openflow13 s1 # 效果同在终端中执行
执行如下命令,增加一条流表项,将主机1发给主机2的数据包丢弃:
ovs-ofctl add-flow br-sw ‘dl_type=0x0800,nw_src=10.0.0.7,nw_dst=10.0.0.11, priority=27,table=0,actions=drop’
该流表项的匹配字段包括:dl_type=0x0800(MAC帧上一层为IP协议)、nw_src=10.0.0.7(源IP地址为10.0.0.7)、nw_dst=10.0.0.11(目的IP地址为10.0.0.11);优先级priority设为27,高于其他流表,故优先执行;table id为0,即将该流表项下发到table 0中。该流表项表示:从主机10.0.0.7发往主机10.0.0.11的IP包将被抛弃。
其他流表操作
附常用OVS操作
1.添加网桥:ovs-vsctl add-br 交换机名
2.删除网桥:ovs-vsctl del-br 交换机名
3.添加端口:ovs-vsctl add-port 交换机名 端口名(网卡名)
4.删除端口:ovs-vsctl del-port 交换机名 端口名(网卡名)
5.连接控制器:ovs-vsctl set-controller 交换机名 tcp:IP地址:端口号
6.断开控制器:ovs-vsctl del-controller 交换机名
7.列出所有网桥:ovs-vsctl list-br
8.列出网桥中的所有端口:ovs-vsctl list-ports 交换机名
9.列出所有挂接到网卡的网桥:ovs-vsctl port-to-br 端口名(网卡名)
10.查看open vswitch的网络状态:ovs-vsctl show
11.查看 Open vSwitch 中的端口信息(交换机对应的 dpid,以及每个端口的 OpenFlow 端口编号,端口名称,当前状态等等):ovs-ofctl show 交换机名
12.修改dpid:ovs-vsctl set bridge 交换机名 other_config:datapath-id=新DPID
13.修改端口号:ovs-vsctl set Interface 端口名 ofport_request=新端口号
14.查看交换机中的所有 Table:ovs-ofctl dump-tables ovs-switch
15.查看交换机中的所有流表项:ovs−ofctl dump−flows ovs-switch
16.删除编号为 100 的端口上的所有流表项:ovs-ofctl del-flows ovs-switch “in_port=100”
17.添加流表项(以“添加新的 OpenFlow 条目,修改从端口 p0 收到的数据包的源地址为 9.181.137.1”为例):
ovs-ofctl add-flow ovs-switch “priority=1 idle_timeout=0,in_port=100,actions=mod_nw_src:9.181.137.1,normal”
(更多说明请查阅:《基于 Open vSwitch 的 OpenFlow 实践》)
18.查看 OVS 的版本信息:ovs-appctl –version
19.查看 OVS 支持的 OpenFlow 协议的版本:ovs-ofctl –version
1.列出br-int网桥的接口
ovs-ofctl -O OpenFlow13 show br-int2.列出br-int网桥的接口
ovs-ofctl dump-ports -O OpenFlow13 br-int3.列出br-int网桥的某个接口的详细信息
ovs-ofctl dump-ports -O OpenFlow13 br-int 14.查看 Open vSwitch 中的端口信息
ovs-ofctl show -O OpenFlow13 br-int5.获得网络接口的 OpenFlow 编号
ovs-vsctl get Interface tap8f178fef-10 ofport6.查看网桥下的流表
ovs-ofctl dump-flows -O OpenFlow13 br-int7.查看ovs下的 datapath 的信息
ovs-dpctl show8.根据流量显示在流表中的走向
ovs-appctl ofproto/trace br-int in_port=2 | grep “Rule|action”9.ovs设置控制器
ovs-vsctl set-controller br0 tcp:1.2.3.4:66310.ovs添加流表
ovs-ofctl add-flow br0 in_port=1,actions=output:211.删除网桥中所有的流表
ovs-ofctl del-flows br012.删除根据匹配项删除网桥中的流表
ovs-ofctl del-flows br0 “in_port=1”
---------------------------------------------------------------------------------------------------------------------------------
什么是mininet
Mininet是一个进程虚拟化网络仿真器 可以创建由一些虚拟的主机、交换机、控制器和链路的虚拟网络,其交换机支持OpenFlow协议 它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美。
mininet功能
Mininet可以很方便地创建一个支持SDN的网络: host就像真实的电脑一样工作,可以使用ssh登录,启动应用程序,程序可以向以太网端口发送数据包,数据包会被交换机、路由器接收并处理。 有了这个网络,就可以灵活地为网络添加新的功能并进行相关测试,然后轻松部署到真实的硬件环境中(可移植到真实环境)
为OpenFlow应用程序提供一个简单、便宜的网络测试平台启用复杂的拓扑测试,无需连接物理网络具有拓扑感知和OpenFlow感知的CLI,用于调试或运行网络范围的测试支持任意自定义拓扑,主机数可达4096,并包括一组基本的参数化拓扑提供用于网络创建和实验的可扩展Python API
Mininet优点
--------------------------------------------------------------------------------------------------------------------------------