OpenflowVSwitch使用详述.docx
《OpenflowVSwitch使用详述.docx》由会员分享,可在线阅读,更多相关《OpenflowVSwitch使用详述.docx(16页珍藏版)》请在冰豆网上搜索。
OpenflowVSwitch使用详述
OpenvSwitch用例2
分类:
OpenStack2014-03-0317:
18 936人阅读 评论(0) 收藏 举报
1ovs-vsctl使用:
添加名为br0的网桥
ovs-vsctl add-brbr0
删除名为br0的网桥
ovs-vsctl del-brbr0
列出所有网桥
ovs-vsctl list-br
判断网桥br0是否存在
ovs-vsctl br-existsbr0
列出挂接到网桥br0上的所有网络接口
ovs-vsctl list-portsbr0
将网络接口eth0挂接到网桥br0上
ovs-vsctl add-portbr0eth0
删除网桥br0上挂接的eth0网络接口
ovs-vsctl del-portbr0eth0
列出已挂接eth0网络接口的网桥
ovs-vsctl port-to-breth0
2流规则:
每条流规则由一系列字段组成,分为基本字段、条件字段和动作字段三部分:
基本字段包括生效时间duration_sec、所属表项table_id、优先级priority、处理的数据包数n_packets,空闲超时时间idle_timeout等,空闲超时时间idle_timeout以秒为单位,超过设置的空闲超时时间后该流规则将被自动删除,空闲超时时间设置为0表示该流规则永不过期,idle_timeout将不包含于ovs-ofctldump-flowsbrname的输出中。
条件字段包括输入端口号in_port、源目的mac地址dl_src/dl_dst、源目的ip地址nw_src/nw_dst、数据包类型dl_type、网络层协议类型nw_proto等,可以为这些字段的任意组合,但在网络分层结构中底层的字段未给出确定值时上层的字段不允许给确定值,即一条流规则中允许底层协议字段指定为确定值,高层协议字段指定为通配符(不指定即为匹配任何值),而不允许高层协议字段指定为确定值,而底层协议字段却为通配符(不指定即为匹配任何值),否则,ovs-vswitchd中的流规则将全部丢失,网络无法连接。
其中dl是datalink的缩写,nw是network的缩写,tp是transport的缩写。
动作字段包括正常转发normal、定向到某交换机端口output:
port、丢弃drop、更改源目的mac地址mod_dl_src/mod_dl_dst等,一条流规则可有多个动作,动作执行按指定的先后顺序依次完成。
实例:
1. 查看虚拟交换机ovsbr0的信息:
$ovs-ofctl showovsbr0
2. 查看ovsbr0上各交换机端口的状态
$ovs-ofctl dump-portsovsbr0
3. 查看ovsbr0上的所有流规则
$ovs-ofctl dump-flowsovsbr0
4. 丢弃从2号端口发来的所有数据包
$ovs-ofctl add-flowovsbr0
idle_timeout=0,in_port=2,actions=drop
注意:
此处的in_port是指虚拟网卡(vif,tap)的,并非传输层的端口号(如www:
80,ftp:
21,22等),通过ovs-ofctl showovsbr0可查得端口号,传输层的端口号有tp_src/tp_dst指定。
5. 删除条件字段中包含in_port=2的所有流规则
$ovs-ofctl del-flowsovsbr0in_port=2
6. 丢弃所有收到的数据包
$ovs-ofctl add-flowovsbr0
dl_type=*,nw_src=ANY,action=drop
注意:
(1)流规则中可包含通配符和简写形式,任何字段都可等于*或ANY,
(2)简写形式为将字段组简写为协议名,目前支持的简写有ip,arp,icmp,tcp,udp,与流规则条件字段的对应关系如下:
dl_type=0×0800 <=> ip
dl_type=0×0806 <=> arp
dl_type=0×0800,nw_proto=1 <=> icmp
dl_type=0×0800,nw_proto=6 <=> tcp
dl_type=0×0800,nw_proto=17 <=> udp
(1.1.0即以后版本支持)
dl_type=0x86dd. <=> ipv6
dl_type=0x86dd,nw_proto=6. <=> tcp6
dl_type=0x86dd,nw_proto=17. <=> udp6
dl_type=0x86dd,nw_proto=58. <=> icmp6
3测试VALN:
参考文章:
openvswitch.org/support/config-cookbooks/vlan-configuration-cookbook/
配置实例1:
在两台xen+openvswitch的服务器上172.16.19.206和172.16.19.208,启动四个虚拟机(206:
VM3,VM4;208:
VM1,VM2),结构图如下所示:
配置如下:
1.在206上:
Ifconfigeth1
172.16.19.206/16up
(1)创建网桥:
Ovs-vsctladd-brovsbr0
#注意创建网桥之后,会在网桥上创建同名的端口ovsbr0,类型为internal,用于给网桥配置IP方便管理等。
(2)让网桥ovsbr接管eth0:
Ovs-vsctladd-port ovsbr0eth0
(3)配置网桥的IP:
Ifconfigeth00.0.0.0
Ifconfigovsbr0
172.16.19.230/16up
(4)创建虚拟机:
VirshcreateVM1.xml
VirshcreateVM2.xml
(5)查看网桥:
Ovs-vsctlshowovsbr0
会发现ovsbr0下面会有6个端口ovsbr0,eth0,tap1.0,tap2.0,vif1.0,vif2.0。
(关于tap和vif参见其他容,在本服务器上起作用的是tap,具体哪个起作用还需要测试)
2.在208上,配置类似:
3.配置VLAN
(1)VM1,VM2属于VLAN1
Ovs-vsctlsetport
tap1.0tag=1
Ovs-vsctlsetporttap2.0
tag=1
之VM1和VM2之间可以互ping,
(2)VM1属于VLAN1,
VM2属于VLAN1
Ovs-vsctlsetport
tap1.0tag=1
Ovs-vsctlsetporttap2.0
tag=2
之VM1和VM2之间无法互ping,
(3)VM1,VM2,VM3,VM4属于VLAN1
208上:
Ovs-vsctlsetport
tap1.0tag=1
Ovs-vsctlsetport
tap1.0tag=1
206上:
Ovs-vsctlsetporttap3.0
tag=1
Ovs-vsctlsetporttap4.0
tag=1
之VM1,VM2,VM3,VM4之间可以互ping,
(4)VM1,VM3,属于VLAN1,
VM2,VM4属于VLAN2
208上:
Ovs-vsctlsetport
tap1.0tag=1
Ovs-vsctlsetport
tap2.0tag=2
206上:
Ovs-vsctlsetport
tap3.0tag=1
Ovs-vsctlsetport
tap4.0tag=2
在我的试验中,VM1,VM2,
VM3,VM4之间无法互ping,而理论上应该是VM1和VM3可以互ping,VM2和VM4之间可以互ping。
目前还不知道什么原因造成的。
待续。
。
。
3.4Sflow:
1.下面先来关注几个问题:
(1)Sflow是什么呢?
与sflow相应的有一个Netflow。
sFlow和Netflow聽起來很相似,但在骨子裡卻不一樣。
Netflow會針對所有流經的網路封包去取得其特徵,包含SourceIP
address、DestinationIPaddress、Source
portforUDPorTCP,0forotherprotocols、Destination
portforUDPorTCP,typeandcodeforICMP,or0forotherprotocols、IPprotocol、Ingressinterface(SNMPifIndex)、IPTypeofService這些資訊。
由於Netflow會對所有流經的封包進行處理,若網路流量極大時,Netflow所提供的資料量亦會隨之增加,若資料量太大,後端分析引擎可能會不堪負荷,進而影響資料判讀時的正確性。
sFlow的作法和Netflow不同,sFlow以取樣的方式取出資料的摘要,使用者可以自訂其取樣大小及取樣週期,即使流經大量網路流量,但sFlow經取樣後的資料相對於Netflow而言會大量的減少,如此一來就可以兼顧資料正確性並確保後端分析引擎處理能力。
在實務上,sFlow較常運用於高速網路的環境,也是因為其具有此特性的關係。
sFlow提供的資料格式在之後實作的階段會加以展示,在此不多作說明。
在實作時,會遭遇到許多的困難,這是因為sFlow僅在部分設備上提供,也不像Netflow,在Linux中可使用nfdump套件來產生符合其格式的流量。
(2) 是不是open
vswitch支持了sflow就不支持了netflow?
不是,在其官方的介绍里(上文的官方图片),可以看到也是支持netflow的。
目前我的做法是,使用sflowtool将sflow转换为netflow。
2.配置实例:
目标:
流量导出,并可以使用snort,tcpdump对流量进行监控和分析。
配置图如下所示:
在208服务器上安装xen和openvswitch,并启动两个虚拟机VM1,VM2。
不在赘述。
(1)
配置sflow流量导出
#!
/bin/sh
COLLECTOR_IP=172.16.18.18
COLLECTOR_PORT=6343
AGENT_IP=eth1
HEADER_BYTES=128
SAMPLING_N=2
POLLING_SECS=1
ovs-vsctl–
–id=sflowcreatesflowagent=${AGENT_IP}
target=\”${COLLECTOR_IP}:
${COLLECTOR_PORT}\”header=${HEADER_BYTES}
sampling=${SAMPLING_N}polling=${POLLING_SECS}—setbridgeovsbr0
sflow=sflow
这是配置sflow的一个脚本,现在解释其中的意思:
COLLECTOR_IP是指进行流量监控的机器,本次实例中是指172.16.18.18
COLLECTOR_PORT=6343是指把流量发到COLLECTOR_IP的6343端口
AGENT_IP=eth1是指把流量从本地的eth1端口发出去
并指定每1秒poolling一次,每次的取样频率为64(即,每隔64个Packet取样一次)。
(2)
转换sflow
现在让VM1(ip:
x.x.x241)pingVM2(ip:
x.x.x242)
执行上面那个脚本,在18.18机器上用snort会看到206发到18.18的包,而不会看到241和242之间通信的数据包。
因为241和242通信的数据被sflow封装起来之后再发给18.18.如果想看到这个数据,需要将sflow转换为snort和tcpdump的格式,具体命令如下:
$sflowtool
–p6343–t|snort–r–
或者
$sflowtool
–p6343–t|tcpdump–X–r-
(3)
sflowtool的使用:
-f可以转发到另一台机器上
$sflowtool –p6343–t–fx.x.x.x/6343
-c可以将sflow转换为netflow
其他的使用信息,参见mansflowtool
3.5Ovs接入物理机器
目的:
是openvswitch不仅可以控制虚拟机(VM1,VM2),也可以控制物理机器(PY1)
配置图如下:
具体配置如下:
(1)
由网桥ovsbr0接管eth0和eth2。
Ovs-vsctladd-port
ovsbr0eth0
Ovs-vsctladd-port
ovsbr0eth2
(2)
Eth0接外网,eth1接hub
(3)
在208上启动两个虚拟机VM1,VM2。
并配置IPx.x.x.241,x.x.x.242
(4)
配置物理机PY1的IP为,x.x.x.250
(5)
现在已经联通了,下面测试一下,可以有250ping241,启动sflow便可观测到相应的信息。
4.遇到的问题
4.1找不到opevswitch_mod.ko和brcompatd.ko核模块怎么办?
编译安装和apt安装都需要编译核模块,而编译核模块需要安装linux-header,即需要/lib/modules/`uname-r`/build,下的容。
请确保系统已安装linux-header。
4.2
Xen无法创建虚拟机?
查看xen日志文件,并判断错误原因
$tail
–n100/var/log/xen/qemu-dm-XXX.log
(1)
如果出现以下错误:
$tail-n100
/var/log/xen/qemu-dm-u3.log
domid:
44
-cconfigqemu
networkwithxenbridgefor
tap44.0ovsbr0
can’taddtap44.0to
bridgeovsbr0:
Operationnotsupported
/etc/xen/scripts/qemu-ifup:
couldnotlaunchnetworkscript
Couldnot
initializedevice‘tap’
需要加载openvswitch的bridge的兼容模块brcompatd.ko,即
$insmod
/path/to/brcompatd.ko
(2)一切都配置妥当的时候,我还遇到个错误,导致虚拟机无常启动,是因为xml配置文件中部分写在了的前面,改过来之后就好了。
4.3
关于兼容模块brcompatd.ko
看看官方给出的解释:
openvswitch.org/cgi-bin/gitweb.cgi?
p=openvswitch;a=blob_plain;f=INSTALL.bridge;hb=HEAD
ThisfiledocumentshowOpenvSwitchmaybeusedasadrop-in
replacementforaLinuxkernelbridgeinanenvironmentthatincludes
elementsthataretightlytiedtotheLinuxbridgetools
(e.g."brctl")andarchitecture. Werecommenddirectlyusingthe
managementtoolsprovidedwithOpenvSwitchratherthanthese
compatibilityhooksforenvironmentsthatarenottightlytiedtothe
Linuxbridgingtools;theyaremoreefficientandbetterreflectthe
actualoperationandstatus.。
。
。
。
大致意思是有很多工具,软件等等和Linuxkernelbridge的关联比较紧密,比如我们使用的xen-4.1。
上一小节提到xen无法创建,错误里面有句话是”/etc/xen/scripts/qemu-ifup:
couldnotlaunchnetworkscript”,而查看这个脚本,里面的容是:
#!
bin/sh
Echo
–c`configqemunetworkwithxenbridgefor`
Echo
$*
Ifconfig
$10.0.0.0up
Brctladdif$2$1
此处便发现这个脚本使用Brctl,而其依赖于linuxbridge。
4.4
tap和vif的区别
PV虚机只有一个vifX.N,而HVM虚机不安装PV
Driver的时候会有两个网络接口vifX.N和tapX.N,而且实际上使用的是tapX.N。
HVM虚机安装PV
Driver并重启后,tapX.N会消失,使用vifX.N(若不重启还是使用tapX.N)
tapinterfaces->qemu-emulatedNICs(realtekmodelbydefault),
used
whennoPVdriversinstalled(usingOS’owndriverforthatmodel)
vifinterfaces(theonethatyoucanrename)->xennetworkfrontend
NICs,usedwhenyouhavePVdriversinstalled(likeGPLPV,
meadowcourt.org/downloads/)
thevifisa
virtualinterfacethatworks with
pvdriversindomU. ThetapisaQemuinterfacethatisusedwith HVMsthatdon’thavepvdrivers.
So,ifyoustartaHVMdomU,you’ll
havethevifthatXencreatesandthetapthat
Qemucreates,ifpv driversare
available,thenoncetheyareloadedDomuusesthemandthe tapgoesaway,butifnotthenboth
remain,butonlythetapinterface is
beingused. Obviously,ifyouneedmoredetailedexplaination,then I’mofnofurtheruse.:
)
4.5
深入认识tap和tun
官方FAQ:
TUN时点对点的设备,tap表示以太网设备的,做为虚拟网卡驱动,Tun/tap驱动程序的数据接收和发送并不直接和真实网卡打交道,而是通
过用户态来转交。
在linux下,要实现核心态和用户态数据的交互,有多种方式:
可以通用socket创建特殊套接字,利用套接字实现数据交互;通过proc文件系统创建文件来进行数据交互;还可以使用设备文件的方式,访问设备文件会调用设备驱动相应的例程,设备驱动本身就
是核心态和用户态的一个接口,Tun/tap驱动就是利用设备文件实现用户态和核心态的数据交互。
当没有核模块支持的时候,OpenvSwitch完全运行于用户态,ovs的数据通路有tun来实现。
参见4.6,当没有核支持的时候,如何使用ovs。
为了对tap/tun有更深入的体会,下面将观看tun源代码,并使用tun写个程序。
tun源代码可从此处获得
/*file_operations结构体,将正常的文件操作对应于tun相应的函数,这样可以像操作文件一样操作tun*/staticstructfile_operationstun_fops={owner:
THIS_MODULE,llseek:
tun_chr_lseek,read:
tun_chr_read,write:
tun_chr_write,poll:
tun_chr_poll,ioctl:
tun_chr_ioctl,open:
tun_chr_open,release:
tun_chr_close,fasync:
tun_chr_fasync};staticstructmiscdevicetun_miscdev={TUN_MINOR,"net/tun",&tun_fops};/*c语言中的__init保证该函数只执行一次*/int__inittun_init(void){printk(KERN_INFO"UniversalTUN/TAPdevicedriver%s""(C)1999-2000MaximKrasnyansky\n",TUN_VER);if(misc_register(&tun_miscdev)){printk(KERN_ERR"tun:
Can'tregistermiscdevice%d\n",TUN_MINOR);return-EIO;}return0;}voidtun_cleanup(void){misc_deregister(&tun_miscdev);}/*加载tun模块*/module_init(tun_init);module_exit(tun_cleanup);
下面应用一下tun,写个程序体会一下(tun源码中的一个example)
#include#include#include#include#include#include#definemax(a,b)((a)>(b)?
(a):
(b))intmain(intargc,char*argv[]){charbuf[1600];intf1,f2,l,fm;fd_setfds;if(argc<2){p