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
     
posted @ 2017-05-12 11:30  WenYao.Huang  阅读(3422)  评论(0编辑  收藏  举报