mininet and ovs 总结
ryu控制器安装在arch linux的什么目录?
/usr/lib/python3.6/site-packages/ryu/
1、如何显示mininetCLI的帮助命令?
mininet> help
2、如何显示mininet的结点?
mininet> nodes
3、如何显示mininet的连接?
mininet> net
mininet>links
4、如何在某一个虚拟中段中建立一个简单的HTTP服务器,并且从另外一个终端中对它进行访问?
mininet> h1 python -m SimpleHTTPServer 80 & mininet> h2 wget -O -h1 ... mininet> h1 kill %python
4、如何运行一个递归的测试?
sudo mn --test pingpair (测试) sudo mn --test iperf (测试带宽)
5、如何梗概网络的拓扑和类型?
sudo mn --test pingall --topo single,3 sudo mn --test pingall --topo linear,4
6、如何设置连接的属性,包括贷款和延迟?
sudo mn --link tc,bw=10,delay=10ms
7、如何设置调试模式?
sudo mn -v debug
8、如何自定义一个拓扑,请附上相关的python文件写法?
应用的语句如下:
sudo mn --custom ~/mininet/custom/topo-2sw-2host.py --topo mytopo --test pingall
相应的脚本如下:
topo-2sw-2host.py:
"""Custom topology example Two directly connected switches plus a host for each switch: host --- switch --- switch --- host Adding the 'topos' dict with a key/value pair to generate our newly defined topology enables one to pass in '--topo=mytopo' from the command line. """ from mininet.topo import Topo class MyTopo( Topo ): "Simple topology example." def __init__( self ): "Create custom topo." # Initialize topology Topo.__init__( self ) # Add hosts and switches leftHost = self.addHost( 'h1' ) rightHost = self.addHost( 'h2' ) leftSwitch = self.addSwitch( 's3' ) rightSwitch = self.addSwitch( 's4' ) # Add links self.addLink( leftHost, leftSwitch ) self.addLink( leftSwitch, rightSwitch ) self.addLink( rightSwitch, rightHost ) topos = { 'mytopo': ( lambda: MyTopo() ) }
9、如何改变相应的mac地址?
sudo mn --mac
10、如何直接打开终端?
sudo mn -x
11、如何使用dpctl来查看某个交换机的流表?(这个还没尝试出来)
dpctl dump-flows的格式如下: [-m | --more] dump-flows [dp] [filter=filter] mininet?
12、如何使用其他类型的交换机?
sudo mn --switch ovsk --test iperf
13、如何设置所有东西都有它各自的命名空间?
sudo mn --innamespace --switch user
14、如何设置链接的属性?比如说打开和关闭。
mininet> link s1 h1 down
mininet> link s1 h1 up
15、如何显示某个网络内的主机?
mininet> xterm h1 h2
16、如何设置远程的控制器?
$ sudo mn --controller=remote,ip=[controller IP],port=[controller listening port] sudo mn --controller=remote,ip=192.168.1.150,port=6633
17、如何使用其他的OpenFlow协议?
--switch ovsk,protocols=OpenFlow13
参考网页:
http://fishcried.com/2016-02-09/openvswitch-ops-guide/
要想很好理解OVS的操作,必须要理解基本的概念:
Packet
网络转发的最小数据单元,每个包都来自某个端口,最终会被发往一个或多个目标端口,转发数据包的过程就是网络的唯一功能。
Bridge
OpenvSwitch中的网桥对应物理交换机,其功能是根据一定流规则,把从端口收到的数据包转发到另一个或多个端口。
Port
端口是收发数据包的单元。OpenvSwitch中,每个端口都属于一个特定的网桥。端口收到的数据包会经过流规则的处理,发往其他端口;也会把其他端口来的数据包发送出去.主要有
类型 | 说明 |
---|---|
Normal | 用户可以把操作系统中的网卡绑定到ovs上,ovs会生成一个普通端口处理这块网卡进出的数据包。 |
Internal | 端口类型为internal时,ovs会创建一块虚拟网卡,端口收到的所有数据包都会交给该网卡,发出的包会通过该端口交给ovs。当ovs创建一个新网桥时,默认会创建一个与网桥同名的Internal Port. |
Patch | 当机器中有多个ovs网桥时,可以使用Patch Port把两个网桥连起来。Patch Port总是成对出现,分别连接在两个网桥上,在两个网桥之间交换数据。 |
Tunnel | 隧道端口是一种虚拟端口,支持使用gre或vxlan等隧道技术与位于网络上其他位置的远程端口通讯。 |
Interface
接口是ovs与外部交换数据包的组件。一个接口就是操作系统的一块网卡,这块网卡可能是ovs生成的虚拟网卡,也可能是物理网卡挂载在ovs上,也可能是操作系统的虚拟网卡(TUN/TAP)挂载在ovs上。
FlowTable
流定义了端口之间数据包的交换规则.下面会对FlowTable做了详细的说明.
OVS命令的结构:
ovs-dpctl | datapath控制器,可以创建删除DP,控制DP中的FlowTables,最常使用show 命令,其他很少手动操作 |
ovs-ofctl | 流表控制器,控制bridge上的流表,查看端口统计信息等 |
ovsdb-tool | 专门管理ovsdb的client |
ovs-vsctl | 最常用的命令,通过操作ovsdb去管理相关的bridge,ports什么的 |
ovs-appctl | 这个可以直接与openvswitch daemon进行交互,上图中没有列出来,这么命令较少使用 |
对下面这些命令的一个简要记录:
- ovs-dpctl
show -s
- ovs-ofctl
show, dump-ports, dump-flows, add-flow, mod-flows, del-flows
- ovsdb-tools
show-log -m
- ovs-vsctl
- show 显示数据库内容
- 关于桥的操作
add-br, list-br, del-br, br-exists
. - 关于port的操作
list-ports, add-port, del-port, add-bond, port-to-br
. - 关于interface的操作
list-ifaces, iface-to-br
ovs-vsctl list/set/get/add/remove/clear/destroy table record column [value]
, 常见的表有bridge, controller,interface,mirror,netflow,open_vswitch,port,qos,queue,ssl,sflow.
- ovs-appctl
list-commands, fdb/show, qos/show
1、如何显示bridge,显示它与Port等概念的关系?
# ovs-vsctl show
2、如何查看有哪些Bridge,哪些ports,哪些interface?
root@l-network-1:~# ovs-vsctl list-br br-ex br-int br-tun root@l-network-1:~# ovs-vsctl list-ports br-tun patch-int vxlan-ac1c0509 vxlan-ac1c050d vxlan-ac1c051c vxlan-ac1c053f root@l-network-1:~# ovs-vsctl list-ifaces br-tun patch-int vxlan-ac1c0509 vxlan-ac1c050d vxlan-ac1c051c vxlan-ac1c053f # iface与ports同名.
3、如何查看哪个port,interface属于哪个bridge?
root@l-network-1:~# ovs-vsctl port-to-br vxlan-ac1c0509 br-tun root@l-network-1:~# ovs-vsctl iface-to-br vxlan-ac1c0509 br-tun
4、如何查看某个Bridge的流表,如果不是默认的of协议,那么如何显示?
root@l-network-1:# ovs-ofctl dump-flows br-ex
sudo ovs-ofctl -O Openflow13 dump-flows <switch>
5、如何显示某个Bridge的流表?
# ovs-ofctl show br-ex
6、如何显示隐藏流表规则?
# ovs-appctl bridge/dump-flows br-ex
7、如何查看datapath的统计规则?
# ovs-dpctl show
# ovs-dpctl show -s
## 查看某个端口的统计信息ovs-ofctl dump-ports br [port] # ovs-ofctl dump-ports br-ex 1
8、如何查看转发表?
# ovs-appctl fdb/show br-ex
9、设置sFlow,相关网页:
http://docs.openvswitch.org/en/latest/howto/sflow/
http://www.sdnlab.com/3760.html
sudo ovs-vsctl -- --id=@sflow_1 create sflow agent=s4 target=\"10.0.0.2:6343\" \ header=128 sampling=64 polling=10 -- set bridge s4 sflow=@sflow_1
10、如何设置qos?
参考网页:
http://docs.openvswitch.org/en/latest/howto/qos/
http://fishcried.com/2016-02-09/openvswitch-ops-guide/
ovs-vsctl set Interface tap0 ingress_policing_rate=100000 ovs-vsctl set Intervace tap ingress_policing_burst=10000 ovs-appctl qos/show <iface>
11、如何查看流规则的匹配?
watch -d -n 1 "sudo ovs-ofctl dump-flows <bridge>"
12、如何使用tcpdump抓包?
13、需要设置端口的镜像。
ip link add name snooper0 type dummy ip link set dev snooper0 up ovs-vsctl add-port br-int snooper0 # ovs-vsctl -- set Bridge br-int mirrors=@m -- --id=@snooper0 \ get Port snooper0 -- --id=@patch-tun get Port patch-tun \ -- --id=@m create Mirror name=mymirror select-dst-port=@patch-tun \ select-src-port=@patch-tun output-port=@snooper0 select_all=1 tcpdump -i snooper0 ovs-vsctl clear Bridge br-int mirrors ovs-vsctl del-port br-int snooper0 ip link delete dev snooper0
14、如何查看OVS的日志?
# cat /var/log/openvswitch/*.log # ovsdb-tool show-log -m
15、如何发送某个包去测试匹配?
# ovs-appctl ofproto/trace br-ex in_port=10,dl_src=66:4e:cc:ae:4d:20,dl_dst=46:54:8a:95:dd:f8 -generate Bridge: br-ex
16、如何添加一个Ethernet port到已经创建的bridge?
参考:http://docs.openvswitch.org/en/latest/faq/issues/ 之中的问题1
问题中,有人尝试使用以下命令去添加一个端口到bridge当中,但是一添加,就会失去连接到哪个网卡eth0.
$ ovs-vsctl add-br br0
$ ovs-vsctl add-port br0 eth0
回答是这样回答的:
一个将要加入到Open vSwitch bridge的物理网卡设备是不应该有IP地址的。 如果这样的设备是含有地址的,那么这个IP地址是不会被完全工作的。
所以,要怎么恢复功能呢?通过将OVS的"internal"设备的IP地址设置给原来网络设备的地址。
比如说这个网络设备是和bridge 是同名的。eth0的IP地址是192.168.128.5, 你可以通过下面的命令来恢复功能。
$ ifconfig eth0 0.0.0.0 $ ifconfig br0 192.168.128.5
如果连接到运行OVS的机器仅仅是那个有问题的IP地址,那么你想要去运行所有的这些命令在单个命令行当中。
如果有任何额外的路由分配给eth0,那么你同样需要使用命令来调整这些路由到br0.
如果你使用DHCP来获得一个IP地址,那么你应该先kill掉监听在这个端口的DHCP client,然后开始监听br0的进程。你可能仍然需要手动的清除IP地址eth0的地址(e.g. with “ifconfig eth0 0.0.0.0”)
没有一个能让人信服的理由来让觉得OVS是必须这样工作的。然后,这就是Linux 内核 bridge mokuai的工作方式。这是一个模型,这种模型已经适应了Linux bridging过去的做法。
17、在这个帖子的第二个问题:
问题是什么就不太用管了,我在这里知道了两个名字,bond接口和dpdk
bond接口:可以用这种接口来进行提高更高的带宽和更加高的可靠性。使用命令如下:
$ ovs-vsctl add-br br0
$ ovs-vsctl add-bond br0 bond0 eth0 eth1
dpdk:是一套库,用户快速的数据包处理。
18、如何打开端口的STP?到我写的时候,OVS的STP并没有仍然很好测试(2017-05-12)
$ ovs-vsctl add-br br0 $ ovs-vsctl set bridge br0 stp_enable=true $ ovs-vsctl add-port br0 eth0 $ ovs-vsctl add-port br0 eth1
另外一篇有价值的教程是:http://www.sdnlab.com/sdn-guide/14747.html
这篇文章组合起来,大概有五个小实验,摘自于:SDN QQ群#兰大-小学生,文章来源他个人SDN技术博客:http://lamoop.com/post/2013-11-18/40060149263
我看完后,觉得还是直接把它分为五个小如何的方式写出来。
19、如何使用OVS添加物理网卡,组成虚拟网络?
基本情况是:在安装open vswitch的主机上有两块网卡,分别为eth0、eth1,把这两块网卡挂接到open vswitch的网桥上,然后有两台物理机host1、host2分别连接到eth0和eth1上,实现这两台物理机的通信。构建结果图如下:
#ovs-vsctl add-br br0 //建立一个名为br0的open vswitch网桥 #ovs-vsctl add-port br0 eth0 //把eth0挂接到br0中 #ovs-vsctl add-port br0 eth1 //把eth1挂接到br0中
20、如何把虚拟机添加到我们创建的OVS当中?
在安装open vswitch的主机上安装两个虚拟机,把两个虚拟机的网卡都挂接在open vswitch的网桥上,实现两台虚拟机的通信,构建结果图如下:
在上面,已经添加了br0了,取决于你使用什么样的虚拟机,然后我们需要将虚拟机,挂载到我们所创建的网桥上
vbox上,可以直接上network上选择
kvm可能需要以下的脚本(这里指示列出来,我没有完全尝试,不过和我之前成功尝试的差不多这个样子):两个文件分别是/etc/ovs-ifup, /etc/ovs-ifdown
#!/bin/sh switch='br0' /sbin/ifconfig $1 0.0.0.0 up ovs-vsctl add-port ${switch} $1
#!/bin/sh switch='br0' /sbin/ifconfig $1 0.0.0.0 down ovs-vsctl del-port ${switch} $1
创建虚拟机的命令大概如下:
kvm -m 512 -net nic,macaddr=00:11:22:33:44:55-net \ tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive\ file=/path/to/disk-image,boot=on kvm -m 512 -net nic,macaddr=11:22:33:44:55:66-net \ tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive\ file=/path/to/disk-image,boot=on
在启动虚拟机之后,我们需要做的,在装有open vswitch的主机上有一个物理网卡eth0,一台主机通过网线和eth0相连,在open vswitch的主机上还装有一台虚拟机,把此虚拟机和连接到eth0的主机挂接到同一个网桥上,实现两者之间的通信,构建结果图如下:
原文给除的配置就是
# ovs-vsctl add-br br0 //建立一个名为br0的open vswitch网桥 # ovs-vsctl add-port br0 eth0 //把eth0挂接到br0中 # kvm -m 512 -net nic,macaddr=00:11:22:33:44:55-net \ tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive\ file=/path/to/disk-image,boot=on //ovs-ifup和ovs-ifdown和上一节中相同
其实在执行了前面两步之后,应该就可以直接和里面的VM进行通信了。
21、如何连接两个已经创建号的网桥?
ovs-vsctl add-br br 添加一个名为br0的网桥 ovs-vsctl add-br br1 //添加一个名为br0的网桥 ovs-vsctl add-port br0 patch-to-br1 //为br0添加一个虚拟端口 ovs-vsctl set interface patch-to-br1type=patch //把patch-to-br1的类型设置为patch ovs-vsctl set interface patch-to-br1 options:peer=patch-to-br0 把对端网桥和此网桥连接的端口名称设置为patch-to-br0 ovs-vsctl add-port br1 patch-to-br0 //为br0添加一个虚拟端口 ovs-vsctl set interface patch-to-br0type=patch //把patch-to-br0的类型设置为patch ovs-vsctl set interface patch-to-br0options:peer=patch-to-br1 //把对端网桥和此网桥连接的端口名称设置为patch-to-br1 ovs-vsctl set interface patch-to-br0type=patch 和ovs-vsctl set interface patch-to-br0 options:peer=patch-to-br1是对ovs-database的操作,有有兴趣的同学可以参考ovs-vswitchd.conf.db.5
22、如何实现两个网桥通过网线来进行连接
host1:
#ovs-vsctl add-br br0 //添加名为br0的网桥 #ovs-vsctl add-port br0 eth0 //把eth0挂接到br0上
host2:
#ovs-vsctl add-br br0 //添加名为br0的网桥 #ovs-vsctl add-port br0 eth0 //把eth0挂接到br0上
然后就可以通过网络进行通信
23、如何设置端口的镜像流量?
上面13中,虽然有镜像流量的一条命令,但是还是很不清楚,所以我再详细一点写在这里。
参考网页:
http://openvswitch.org/support/dist-docs/ovs-vsctl.8.txt
http://www.rendoumi.com/chun-shou-dong-she-zhi-open-vswitchde-mirror-port/
Mirror:一个端口镜像的配置是附在Bridge上的。Records是使用 id 来进行记录了。
假设有如下的配置场景:有一个 br0 的 Bridge, 在上面有端口 eth0, eth1, eth2.
把eth0和eth1上面发送和接收的流量都发送到eth2.
# 创建一条镜像规则 (我是依照我自己的理解,命令没错,解释不一定) ovs-vsctl -- set Bridge br0 mirrors=@m \ -- --id=@eth0 get Port eth0 \ -- --id=@eth1 get Port eth1 \ -- --id=@eth2 get Port eth2 \ -- --id=@m create Mirror name=mymirror select-dst-port=@eth0,@eth1 select-src-port=@eth0,@eth1 output-port=@eth2 # -- 表示一个命令的开头 # 前面有 -- 是开始另外一条命令的开始 # 创建一个名字@eth0,在后面用。 # --id=@m 代表上面的设置开始对那条镜像进行设置 # select-src-port 是选择数据包的来源端口 # select-dst-port 是选择数据包的目标端口 # output-port 是符合上面的流量,就镜像到哪里的目标端口 # 删除一条流量镜像 ovs-vsctl -- --id=@rec get Mirror mymirror \ -- remove Bridge br0 mirrors @rec # @rec就是这条记录的名字。 # -- remove 后面是要删除的信息。 # 删除所有的镜像 ovs-vsctl clear Bridge br0 mirrors
24、如何删除某个OVS上的流?
sudo ovs-ofctl del-flows <OVS-name>
变更记录:
变更说明 | 变更人 | 时间 |
---|---|---|
整理mininet笔记和部分OVS记录 | andrew | 2016-04-18 |
整理fishcired的笔记的OVS部分,添加到我自己的OVS部分 | andrew | 2016-05-12 |