|
|
楼主 |
发表于 2021-6-1 08:51:37
|
显示全部楼层
一、OVS概念2 m1 p7 g' t( h; X# H W2 O" h
使用OpenStack neutron+vxlan部署模式下网络节点OVS网桥作为例子2 {, s# k1 v* E N. ]! r4 |
ovs-vsctl show
3 k" {8 S% Q5 h- \; C O ve44abab7-2f65-4efd-ab52-36e92d9f0200
3 P. S0 L; o' l) J4 y3 | Manager "ptcp:6640:127.0.0.1"9 B' H$ w; A; w! W7 J. {$ b# P& z( Z1 |
is_connected: true# A7 j4 u$ b) V3 d1 y) H
Bridge br-ext
0 j, B4 n# N$ d( [" A Controller "tcp:127.0.0.1:6633"
# H2 { V0 O+ k' z% b8 I5 G) j is_connected: true
, O2 W& o+ d( Z' _; `: ^5 @ fail_mode: secure
" X4 @7 a" b, d2 ]- I4 y Port br-ext
5 r }/ d7 H, q% S7 E0 o Interface br-ext
0 w3 F& N A F& G( A type: internal
" U" }1 J1 n) A- y Port "eth1"
9 C. q. o$ j7 l* c9 S& i Interface "eth1", s1 ?: `: {& q; A, j3 o& a! P. d
Port phy-br-ext
( H, }3 d; z) A$ ~& V6 u& W Interface phy-br-ext
" c$ b5 l* g5 e/ a type: patch
: M8 c+ @6 g3 L+ u; E/ C options: {peer=int-br-ext}* \! y" C! V% y: A6 _2 h \5 h( r6 o
Bridge br-tun2 A2 l: k) I. l" Z
Controller "tcp:127.0.0.1:6633"
: S- S6 g( q! g& p" V( R is_connected: true
8 H0 s5 T( h& B6 ^8 Y5 r fail_mode: secure* ?, x, a2 q; ^8 l! [$ b. S+ I
Port br-tun7 u6 X. x& i2 z: ?$ r
Interface br-tun# O+ B! c) M) {0 H9 B, D: l
type: internal
+ q( } Y/ C5 a. | Port patch-int
|: t: M' d8 r8 p! { Interface patch-int$ X. s( G& G8 j7 |1 c; a7 |
type: patch
. o$ [3 c9 w1 t: p5 P options: {peer=patch-tun}
! L& c8 x6 t+ o: p6 I* k5 k& N: U Port "vxlan-080058ca"4 \/ C; A7 M N! P7 f. _
Interface "vxlan-080058ca"- ~/ L2 t+ b/ [: y
type: vxlan; A" x& D% L, q$ Z8 r
options: {df_default="true", in_key=flow, local_ip="8.0.88.201", out_key=flow, remote_ip="8.0.88.202"}1 A& _+ w8 ?; O# m) T5 \
Bridge br-int
/ M4 H1 |2 v1 v! N: h Controller "tcp:127.0.0.1:6633"& V! l, a, n0 N3 P5 G3 V2 i" a7 A
is_connected: true' S: r V4 `% k! K7 Y, h
fail_mode: secure/ `6 p1 o# d' t' |
Port "qr-11591618-c4"/ D' Y/ R i- Q s( F
tag: 3
" Y2 y) i) J7 ^ Interface "qr-11591618-c4"
$ y% b I) B! n+ n/ J" e; d type: internal
# P* n* |; p2 U2 }4 e1 Q2 Q+ ~ Port patch-tun- ? d/ U- y* Y# @
Interface patch-tun
2 s {) X, Q5 h7 X" X. z, |# ^ w type: patch5 n0 _5 m; f5 C/ `# S8 u
options: {peer=patch-int}# U4 Z, o0 X2 J0 I
Port int-br-ext
) a4 A2 j. b" D$ ] Interface int-br-ext' E- j2 n7 V2 A& A1 m+ C
type: patch, v6 O. C' B) c. @" s" {: o$ Z
options: {peer=phy-br-ext} Y- H5 [6 }/ m: m& k# S
" v3 B) t2 O8 ]2 G z1、Bridge
# K4 ?; k. q! B. KBridge代表一个以太网交换机(Switch),一个主机中可以创建一个或者多个Bridge。Bridge的功能是根据一定规则,把从端口收到的数据包转发到另一个或多个端口,上面例子中有三个Bridge,br-tun,br-int,br-ext
: w( {' w( W( Y# d; Q5 f7 Y# M( k$ o添加一个网桥br0) v. T* W3 ~3 s
ovs-vsctl add-br br0. V# S4 L5 I5 @0 p4 r
1$ J% K' t3 r2 M
网桥的fail-mode设置
2 J3 k8 A. W) I3 s! Y8 m2 j# _standalone:该模式下,没有运行controller的情况下,OVS会自动调整为普通交换机模式,像物理交换机一样,此时可能会有环路产生的问题。如果有controller的情况,OVS会自动变成openflow交换机
4 G" [+ N5 v. E) U% A- Jsecure: 该模式下,无论有没有controller,OVS都会作为openflow交换机运行,也就是所有网桥上的端口,等待controller或者用户添加flow到OVS来进行通信。
% `0 _/ N2 @6 M8 d2、Port$ q0 o" `6 v5 c3 a
端口Port与物理交换机的端口概念类似,Port是OVS Bridge上创建的一个虚拟端口,每个Port都隶属于一个Bridge。Port有以下几种类型1 x: @! D$ ]& M/ C
1)Normal+ [+ C0 y* I, X% w( y( O
可以把操作系统中已有的网卡(物理网卡em1/eth0,或虚拟机的虚拟网卡tapxxx)挂载到ovs上,ovs会生成一个同名Port处理这块网卡进出的数据包。此时端口类型为Normal。& c- c+ W/ R6 i: t, e; a- f4 {
如下,主机中有一块物理网卡eth1,把其挂载到OVS网桥br-ext上,OVS会自动创建同名Port eth1。
! B3 O1 u4 N8 x; z- Yovs-vsctl add-port br-ext eth1 //Bridge br-ext中出现port “eth1”
* z+ B9 S) L) n ?+ N0 u1
0 u; i& W2 U0 g8 k% p6 L有一点要注意的是,挂载到OVS上的网卡设备不支持分配IP地址,因此若之前eth1配置有IP地址,挂载到OVS之后IP地址将不可访问。这里的网卡设备不只包括物理网卡,也包括主机上创建的虚拟网卡。7 s6 O7 ?$ H0 o" |3 ~
2)Internal
# F) f; B9 n2 W2 v FInternal类型是OVS内部创建的虚拟网卡接口,每创建一个Port,OVS会自动创建一个同名接口(Interface)挂载到新创建的Port上。接口的概念下面会提到。
7 z) [+ u8 `* `5 e# r8 h& m9 {下面创建一个网桥br0,并创建一个internal类型的Port p09 F# O3 \/ M( v p0 t
ovs-vsctl add-br br0
7 e- I0 L! b- n- j: w, Zovs-vsctl add-port br0 p0 -- set Interface p0 type=internal
/ z+ }2 m9 r/ O$ c6 Z1" w- \% e7 V0 O4 c( J7 W! I
2
% p4 J: h" m7 l0 \1 U6 X# ?5 d查看结果; r6 t+ X& T) I+ p% w+ v0 @5 p
//查看网桥br0
' c4 V: U- o6 Z. H/ g5 F; @ovs-vsctl show br0% `% {' W, n+ a {( l! z9 X
Bridge "br0"
1 |# B6 b! e* i. O9 g: B8 m fail_mode:secure
4 ?0 z" b- A {1 c Port "p0"% T6 m9 |4 z: K. D
Interface "p0") @2 g* o5 n& i9 ~+ S& C/ `) U# s- ~1 O5 E
type:internal% X# }6 f9 p+ e' a8 b& o
Port "br0"; T& ^. E0 f# i
Interface "br0"
5 W5 w+ Y+ r+ w type:internal0 M: o- _2 C O* _/ ~! h& N
3 c" A& T `+ q+ X7 @6 U5 n# Y6 u可以看到有两个Port。当ovs创建一个新网桥时,默认会创建一个与网桥同名的Internal Port。在OVS中,只有”internal”类型的设备才支持配置IP地址信息,因此我们可以为br0接口配置一个IP地址,当然p0也可以配置IP地址
& I. m: T6 M5 X$ [6 kip addr add 192.168.10.11/24 dev br0# Z, D$ n! u' X
ip link set br0 up# S) x+ a4 T7 [9 A
//添加默认路由# v, `5 }5 O/ O! A
ip route add default via 192.168.10.1 dev br0
. s' r3 e. @3 [
) q, V+ N# e. d7 w% F! H, J上面两种Port类型区别在于,Internal类型会自动创建接口(Interface),而Normal类型是把主机中已有的网卡接口添加到OVS中
2 `" ?9 X6 O: H5 W( i: C9 J3)Patch9 c) k. n- S0 n U9 q1 v+ R- K6 R
当主机中有多个ovs网桥时,可以使用Patch Port把两个网桥连起来。Patch Port总是成对出现,分别连接在两个网桥上,从一个Patch Port收到的数据包会被转发到另一个Patch Port,类似于Linux系统中的veth。使用Patch连接的两个网桥跟一个网桥没什么区别,OpenStack Neutron中使用到了Patch Port。上面网桥br-ext中的Port phy-br-ext与br-int中的Port int-br-ext是一对Patch Port2 u+ v. t* @+ r5 y
可以使用ovs-vsctl创建patch设备,如下创建两个网桥br0,br1,然后使用一对Patch Port连接它们& x0 B" R+ t8 Q0 z3 S$ T
ovs-vsctl add-br br01 \7 x! b: d8 ~# ~0 ^6 n& |) t
ovs-vsctl add-br br1( g3 N' S; M) x# i
ovs-vsctl \! F1 i1 |. q. j( C$ L
-- add-port br0 patch0 --set interface patch0 type=patch options:peer=patch1 \
5 r- \$ I2 d& I/ Y4 f/ Z: X-- add-port br1 patch1 --set interface patch1 type=patch options:peer=patch0" }9 a# O& F% g3 ~ R
- R# t$ F% ^8 v# |# m m
结果如下5 |' R% p6 b+ m: V2 [) k
ovs-vsctl show
+ J, w: e: D4 I Bridge "br0"& }. l! z% z$ I. U8 V0 @! l
Port "br0"
5 N1 I8 H/ z( l- U* B: ]$ _9 |4 _ Interface "br0"% p v$ |9 _/ Q' G/ t+ W5 b# V
type:internal
! T/ y( M4 T ^ Port "patch0"
) ?4 C _. x& ]7 J& W Interface "patch0"( G8 h e2 f3 Y8 S5 R3 U, I3 v
type:patch* w3 J% ?" n* J/ s7 o9 ]# N9 N
options:{peer="patch1"}. o' R. J0 I& n# j) c/ f# y
Bridge "br1"
0 X- z: @9 R R* E Port "br1"
! D5 |. Z* [$ k2 D" I Interface "br1". F7 x) ^; F' c, [
type:internal. U7 f1 ]/ z$ ^. l# ?
Port "patch1"
) K0 a% G7 B0 C4 b' ` Interface "patch1"7 u" V" B" o8 I9 K* S) c
type:patch
: R1 Y9 L5 X, I. L& G options:{peer="patch0"}0 S) J& q7 E) Q! E! Q& _
1 ?; ?! ~6 {! ^
4)Tunnel" j. c- R: \7 V7 _
OVS中支持添加隧道(Tunnel)端口,常见隧道技术有两种gre或vxlan。隧道技术是在现有的物理网络之上构建一层虚拟网络,上层应用只与虚拟网络相关,以此实现的虚拟网络比物理网络配置更加灵活,并能够实现跨主机的L2通信以及必要的租户隔离。不同隧道技术其大体思路均是将以太网报文使用隧道协议封装,然后使用底层IP网络转发封装后的数据包,其差异性在于选择和构造隧道的协议不同。Tunnel在OpenStack中用作实现大二层网络以及租户隔离,以应对公有云大规模,多租户的复杂网络环境。
" Y* {2 `! L7 ?9 q# rOpenStack是多节点结构,同一子网的虚拟机可能被调度到不同计算节点上,因此需要有隧道技术来保证这些同子网不同节点上的虚拟机能够二层互通,就像他们连接在同一个交换机上,同时也要保证能与其它子网隔离。% J+ A8 w$ w) m: P& z
OVS在计算和网络节点上建立隧道Port来连接各节点上的网桥br-int,这样所有网络和计算节点上的br-int互联形成了一个大的虚拟的跨所有节点的逻辑网桥(内部靠tunnel id或VNI隔离不同子网),这个逻辑网桥对虚拟机和qrouter是透明的,它们觉得自己连接到了一个大的br-int上。从某个计算节点虚拟机发出的数据包会被封装进隧道通过底层网络传输到目的主机然后解封装。
+ ?0 \" j% j% `- K0 j& ^上面网桥br-tun中Port "vxlan-080058ca"就是一个vxlan类型tunnel端口。下面使用两台主机测试创建vxlan隧道
4 n% P' i' N- p' `3 z6 i4 d! T0 \//主机192.168.7.21上3 j7 u; t, G( C" I
ovs-vsctl add-br br-vxlan3 T( K2 M8 w; ]( M [; q
//主机192.168.7.23上
& V/ G8 ~ L- v) C1 y1 c6 povs-vsctl add-br br-vxlan
7 q# q/ `3 `5 K//主机192.168.7.21上添加连接到7.23的Tunnel Port
# o+ i5 t5 \2 ^/ |. Xovs-vsctl add-port br-vxlan tun0 --set Interface tun0 type=vxlan options:remote_ip=192.168.7.236 V3 T+ r* }% {5 G
//主机192.168.7.23上添加连接到7.21的Tunnel Port' w5 O m' r$ O- Q& D# P4 X6 z& p4 f
ovs-vsctl add-port br-vxlan tun0 --set Interface tun0 type=vxlan options:remote_ip=192.168.7.21
9 O4 R- q5 \5 g4 ~9 g2 z
3 U- y0 ?. }* x5 `. ^3 `! {然后,两个主机上桥接到br-vxlan的虚拟机就像连接到同一个交换机一样,可以实现跨主机的L2连接,同时又完全与物理网络隔离。
5 s# R( c: `& h/ ^4 ]2 H" U% o0 F3、Interface( S2 Q$ C, N% S* e6 o" P
Interface是连接到Port的网络接口设备,是OVS与外部交换数据包的组件,在通常情况下,Port和Interface是一对一的关系,只有在配置Port为 bond模式后,Port和Interface是一对多的关系。这个网络接口设备可能是创建Internal类型Port时OVS自动生成的虚拟网卡,也可能是系统的物理网卡或虚拟网卡(TUN/TAP)挂载在ovs上。 OVS中只有”Internal”类型的网卡接口才支持配置IP地址. W) W7 ]: ~8 Y$ \& D- u- h& ? }0 B
Interface是一块网络接口设备,负责接收或发送数据包,Port是OVS网桥上建立的一个虚拟端口,Interface挂载在Port上。一个接口就是操作系统的一块网卡2 [; H( k: t7 x6 ^0 q+ G0 V6 W
当Open vSwitch创建一个新网桥时,默认会创建一个与网桥同名的Internal Port,同时也创建一个与Port同名的Interface。三位一体,所以操作系统里就多了一块网卡,但是状态是down的。
3 s2 u+ F% K8 y8 c4、Controller8 X: n' C9 y, J1 d2 V5 n
OpenFlow控制器。OVS可以同时接受一个或者多个OpenFlow控制器的管理。主要作用是下发流表(Flow Tables)到OVS,控制OVS数据包转发规则。控制器与OVS通过网络连接,不一定要在同一主机上9 }/ r, p# y# u5 z7 N
可以看到上面实例中三个网桥br-int,br-ext,br-tun都连接到控制器Controller "tcp:127.0.0.1:6633上
" t% ^& Z' X* [% [$ T' b5 s5、Datapath
$ U9 X; l q6 y5 Z( \" @- YOVS内核模块,负责执行数据交换。由于流可能非常复杂,对每个进来的数据包都去尝试匹配所有流,效率会非常低,所以有了datapath这个东西。Datapath是流的一个缓存,会把流的执行结果保存起来,当下次遇到匹配到同一条流的数据包,直接通过datapath处理。考虑到转发效率,datapath完全是在内核态实现的,并且默认的超时时间非常短,大概只有3秒左右。5 G9 V5 x) A$ ?# p: T$ N$ |
二、open vswitch常用操作4 |3 e9 q$ S! a& t" A/ u9 T
1、ovs-vsctl7 D4 J0 E$ O3 {7 g& _$ `
ovs-vsctl是一个管理或配置ovs-vswitchd的高级命令行工具,高级是说其操作对用户友好,封装了对数据库的操作细节。它是管理OVS最常用的命令,除了配置flows之外,其它大部分操作比如Bridge/Port/Interface/Controller/Database/Vlan等都可以完成
% J/ x; C3 U0 H; z" E添加网桥br0: @6 B1 l& W. r( u) f5 u8 f
ovs-vsctl add-br br0
3 O S2 q$ _$ z! v列出所有网桥
8 c1 z1 Q# m2 R; u" Uovs-vsctl list-br6 g j; f) c$ I4 j" y' W/ S+ |
添加一个Port p1到网桥br0, s( ?4 ?# y$ O) e# o, \
ovs-vsctl add-port br0 p1( U0 y. o8 i+ c/ }# K
查看网络br0上所有Port# }! O: I2 O. c& B, \3 q% P5 ^
ovs-vsctl list-ports br0
- _9 x: E1 [0 x; N3 T& a2 V: H/ q获取br0网桥的Openflow控制器地址,没有控制器则返回空
4 Z9 g7 |+ [9 ?3 t+ jovs-vsctl get-controller br0$ i, \6 _) L) B, M! W+ O* ]
设置OpenFlow控制器,控制器地址为192.168.1.10,端口为6633
! x' l% }) }) } `+ ~ovs-vsctl set-controller br0 tcp:192.168.1.10:6633) o, r" k# z$ G: ?6 m
移除controller( H$ h+ n0 s9 Q7 A* m
ovs-vsctl del-controller br0( N7 M/ V3 x1 L* t. S. W) l
删除网桥br0
1 W5 p- k! {! l7 ]7 novs-vsctl del-br br0
3 B9 I% I3 U4 r: @; H2 K1 P- G设置端口p1的vlan tag为1004 I6 i' ]: k1 B* p( n, i0 ^0 C
ovs-vsctl set Port p1 tag=100
1 W$ t; m# w0 l# o/ ]设置端口p0类型为internal
" _$ x/ \7 p: Covs-vsctl set Interface p0 type=internal
H$ ]( m7 O. k0 d$ X! k2 p添加vlan10端口,并设置vlan tag为10,Port类型为Internal2 I) ?+ x0 N& G$ N$ O: W- z/ g3 J$ b
ovs-vsctl add-port br0 vlan10 tag=10 --set Interface vlan10 type=internal
1 S$ T* L$ y8 x添加隧道端口gre0,类型为gre,远端IP为1.2.3.4
4 k( I9 s8 e- Z q/ y* wovs-vsctl add-port br0 gre0 --set Interface gre0 type=gre options:remote_ip=1.2.3.4( s3 c8 t' `1 L0 l: W2 E0 v& j) y; _
, c4 ~, r/ h, A. h4 N) N" l2、ovsdb-tool" \; d% E# J" l
ovsdb-tool是一个专门管理OVS数据库文件的工具,不常用,它不直接与ovsdb-server进程通信
f. l* N/ t @! Q//可以使用此工具创建并初始化database文件! C, w2 C O1 [) p: [2 w
ovsdb-tool create [db][schema]
% y8 ]1 V1 i( G( U5 R//可以使用ovsdb-client get-schema [database]获取某个数据库的schema(json格式)/ j" X' i! [$ K- o
//可以查看数据库更改记录,具体到操作命令,这个比较有用
8 W; \" ?* w: R0 ]ovsdb-tool show-log -m
0 C+ h( D) k0 y+ Q! ?5 ~( @8 Hrecord 48: 2017-01-07 03:34:15.147 "ovs-vsctl: ovs-vsctl --timeout=5 -- --if-exists del-port tapcea211ae-10"# [6 x0 I& R& h9 Q/ _7 V
table Interface row "tapcea211ae-10" (151f66b6):
2 Q$ T4 v, L! B" r4 q& B delete row
, Y/ J7 j$ i& ~: q8 \ table Port row "tapcea211ae-10" (cc9898cd):
* ^6 }2 j# c+ _5 b! x9 K' V delete row
* ~) D. {; A. \# \' Z0 O4 { table Bridge row "br-int" (fddd5e27):) E! y5 O& X9 E
table Open_vSwitch row a9fc1666 (a9fc1666):9 Q; e& E" T4 `# @
record 49: 2017-01-07 04:18:23.671 "ovs-vsctl: ovs-vsctl --timeout=5 -- --if-exists del-port tap5b4345ea-d5 -- add-port br-int tap5b4345ea-d5 -- set Interface tap5b4345ea-d5 "external-ids:attached-mac=\"fa:16:3e:50:1b:5b\"" -- set Interface tap5b4345ea-d5 "external-ids:iface-id=\"5b4345ea-d5ea-4285-be99-0e4cadf1600a\"" -- set Interface tap5b4345ea-d5 "external-ids:vm-id=\"0aa2d71e-9b41-4c88-9038-e4d042b6502a\"" -- set Interface tap5b4345ea-d5 external-ids:iface-status=active"9 q* h6 O% D9 W
table Port insert row "tap5b4345ea-d5" (4befd532):
+ N( ]# x! v/ z# P$ V8 J" m0 X table Interface insert row "tap5b4345ea-d5" (b8a5e830):
3 X$ i1 S _/ _8 M9 T table Bridge row "br-int" (fddd5e27): p3 W( \" a2 e3 k o& m) h M
table Open_vSwitch row a9fc1666 (a9fc1666):" }: p$ H. x' x6 @: |3 M
...0 D7 p! u9 P$ @
$ d$ a; y, L5 p' U
3、ovsdb-client
8 F2 Z; b0 Y Z1 U: J& a2 q- Qovsdb-client是ovsdb-server进程的命令行工具,主要是从正在运行的ovsdb-server中查询信息,操作的是数据库相关
- O3 K6 C4 m% m6 [2 F//列出主机上的所有databases,默认只有一个库Open_vSwitch
; K) ?% v4 J) |, G* hovsdb-client list-dbs
X* d( h8 Y3 e0 C7 c' s" L//获取指定数据库的schema信息* T+ J6 U8 f2 D+ W
ovsdb-client get-schema [DATABASE] L* Y3 ^4 }" p, p
//列出指定数据库的所有表
5 I9 C8 x) G- Q- a) _9 oovsdb-client list-tables [DATABASE]) I8 [3 `( K/ W* g3 p, P9 j
//dump指定数据库所有数据,默认dump所有table数据,如果指定table,只dump指定table数据 7 z8 `; z6 O, B6 e
ovsdb-client dump [DATABASE] [TABLE]
) ^2 a7 Q( D8 I9 r# `% d//监控指定数据库中的指定表记录改变
( Q& ?: p; b1 s. C6 L& ~/ Fovsdb-client monitor DATABASE TABLE
@% [' S3 m4 Z4 |6 {5 H8 r/ [5 l8 t0 `' P5 t
4、ovs-ofctl
9 o2 }8 M1 a- d8 F& h1 [ s3 rovs-ofctl是专门管理配置OpenFlow交换机的命令行工具,我们可以用它手动配置OVS中的OpenFlow flows,注意其不能操作datapath flows和”hidden” flows
2 o' o5 j7 r# g/ n$ u4 \//查看br-tun中OpenFlow flows6 z/ N; R; w' r2 _
ovs-ofctl dump-flows br-tun
; Q4 \, V- Y9 T- a0 r) p9 J//查看br-tun端口信息
$ o) _- O% s2 z/ Y: B6 Aovs-ofctl show br-tun( P% ?2 ?5 d* u6 v/ w, A2 w
//添加新的flow:对于从端口p0进入交换机的数据包,如果它不包含任何VLAN tag,则自动为它添加VLAN tag 101# [( ?5 m B1 c2 ?. Z+ l2 Z
ovs-ofctl add-flow br0 "priority=3,in_port=100,dl_vlan=0xffff,actions=mod_vlan_vid:101,normal"5 X4 h0 T" M- f; g% ?. J
//对于从端口3进入的数据包,若其vlan tag为100,去掉其vlan tag,并从端口1发出 6 Y% _+ }; j3 O0 G% k
ovs-ofctl add-flow br0 in_port=3,dl_vlan=101,actions=strip_vlan,output:1( ^9 X0 |! j$ {1 J3 z) u
//添加新的flow: 修改从端口p1收到的数据包的源地址为9.181.137.1,show 查看p1端口ID为100
9 T! {+ i) t) g# {0 M9 Y. zovs-ofctl add-flow br0 "priority=1 idle_timeout=0,in_port=100,actions=mod_nw_src:9.181.137.1,normal"
$ _: Q, x4 V! Q//添加新的flow: 重定向所有的ICMP数据包到端口 p25 p$ U2 }% T7 f
ovs-ofctl add-flow br0 idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:102
6 \, G! S' T4 {, a! p) Q//删除编号为 100 的端口上的所有流表项
! _. F: ?6 O' Novs-ofctl del-flows br0 "in_port=100" 0 x& q# x/ D6 }! c/ S
, j8 S3 `7 b' k2 x5 s; F- N
三、使用open vswitch构建虚拟网络 K' K N$ a% m2 `
1、构建物理机和物理机相互连接的网络1 G: u& b Z' v7 B2 h8 `) C6 D9 V
在安装open vswitch的主机上有两块网卡,分别为eth0、eth1,把这两块网卡挂接到open vswitch的网桥上,然后有两台物理机host1、host2分别连接到eth0和eth1上,实现这两台物理机的通信。构建结果图如下:
1 ]' u8 o: z) R& o在这里插入图片描述
; v# Z) U: z$ J执行以下命令:
& c, M! J, u" {- W7 ?: z# `- Novs-vsctl add-br br0 //建立一个名为br0的open vswitch网桥
* Y; s8 H1 p# [ovs-vsctl add-port br0 eth0 //把eth0挂接到br0中 _! R6 `5 {, A9 j$ S4 Y; U
ovs-vsctl add-port br0 eth1 //把eth1挂接到br0中4 b) s. H1 S" ]
# f- I# o" Y/ Q9 N' m2 ^
2、构建虚拟机与虚拟机相连的网络) h; Q8 q# v |7 d7 M( c
在安装open vswitch的主机上安装两个虚拟机,把两个虚拟机的网卡都挂接在open vswitch的网桥上,实现两台虚拟机的通信,构建结果图如下:* Q4 Q- Y% `3 z0 {/ ~
在这里插入图片描述, Z7 }; A* [5 e, r+ n4 \6 y
执行以下命令:+ M6 D6 y. Z5 x& }
ovs-vsctl add-br br0 //建立一个名为br0的open vswitch网桥
7 {5 w: N) G# d0 X# [- Z4 u( \, M1. {# ?1 ]1 o" {" h3 S+ p
如果使用vbox或virt-manager把bridge设置为br0即可,如果使用cli kvm则先创建两个文件,用于虚拟网卡的添加与删除。假设这两个文件分别为/etc/ovs-ifup和/etc/ovs-ifdown,则向这两个文件中写入以下内容:
- U, c* b5 H8 c# r( |/etc/ovs-ifup
; F. H( ~: ^$ M/ i6 j1 k4 ~6 k0 J/ U#!/bin/sh
: [) B! o0 Q9 x, I; R, yswitch='br0'5 Z5 k" {, r8 t" ~! q+ r l% r( O
/sbin/ifconfig $1 0.0.0.0 up
1 f, Q/ `% ]4 G5 Jovs-vsctl add-port $(switch) $13 v0 D8 Q! s# y# J6 X& M! }
- h6 L# V6 J) d( L2 D, Q/ a
/etc/ovs-ifdown5 I* A* B( C# T6 k% M. Z
#!/bin/sh
( m+ c8 u( ~3 p |+ U; v* D5 {; K4 o% Zswitch='br0'
2 M$ p! p) ?# m8 I$ t# r' i/sbin/ifconfig $1 0.0.0.0 down2 [( J$ d" t" X5 e
ovs-vsctl del-port $(switch) $1! G$ e }! M/ x( ~ v) f6 E7 ]4 n
" S5 F7 l+ j4 H2 H- L1 L& i# n/ w
使用以下命令建立虚拟机. B, f% M, l1 y* F+ Z, {
kvm -m 512 -net nic,macaddr=00:11:22:33:44:55 \4 ^- L L( l7 t! N; N' j0 y
-net tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown \
- N2 n; |5 A8 @" d& _) i-drive file=/path/to/disk-image,boot=on + t, N' Z0 ~# x$ Y4 c& O G- M
kvm -m 512 -net nic,macaddr=11:22:33:44:55:66 \7 b8 E( j" ]2 j) N5 }( F
-net tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive \, L8 o" j" n/ f6 U. q2 h
file=/path/to/disk-image,boot=on1 m+ W4 \& U! l3 B
, ~9 m! ~; v9 C$ Q) \7 Y: i3 G, d3、构建虚拟机与物理机相连的网络
6 r1 k N2 y8 {6 L% a在装有open vswitch的主机上有一个物理网卡eth0,一台主机通过网线和eth0相连,在open vswitch的主机上还装有一台虚拟机,把此虚拟机和连接到eth0的主机挂接到同一个网桥上,实现两者之间的通信,构建结果图如下:
- D- g# R7 [; S: [2 @- \在这里插入图片描述, H7 f7 D5 M) Q$ l; I1 I# _
执行命令:0 ?1 j/ G8 G. C& @" W8 A
ovs-vsctl add-br br0 //建立一个名为br0的open vswitch网桥
5 v& |5 e8 ]. O4 i: X! y0 jovs-vsctl add-port br0 eth0 //把eth0挂接到br0中* V1 m- u! t% k$ I4 [: H) m6 m
kvm -m 512 -net nic,macaddr=00.11.22.33.44.55-net \, J7 z/ l" W( R) A* Q3 J. g+ i
tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive \
+ {8 |( S( H8 @9 q" W/ Pfile=/path/to/disk-image,boot=on //ovs-ifup和ovs-ifdown和上一节相同
4 L4 K% W% h2 e. m$ x+ L" X* D& Q; J" Y( K9 t9 @' m/ E
4、构建网桥和网桥相连的网络
$ K$ Z I* H% Y9 C以上操作都是将多个主机(物理机或虚拟机)连接到同一个网桥上,实现它们之间的通信,但是要构建复杂的网络,就需要多个网桥,在装有open vswitch的主机上建立两个网桥,实现它们之间的连接,构建结果如下:+ R% r8 P1 Y! X0 S9 K3 `7 v
在这里插入图片描述; H8 b1 y S/ H* x2 L
执行命令:( _* u- ?+ E1 D+ A8 m
ovs-vsctl add-br br0 //添加一个名为br0的网桥
|* P" V2 S) F+ C0 }7 Vovs-vsctl add-br br1 //添加一个名为br1的网桥5 z: r* h, n) ?& y) X& }& o
ovs-vsctl add-port br0 patch-to-br1 //为br0添加一个虚拟端口
4 X1 ?9 C" v, O% j0 k6 Kovs-vsctl set interface patch-to-br1 type=patch //把patch-to-br1的类型设置为patch
. e) o8 F6 P" v9 `; a2 \ovs-vsctl set interface patch-to-br1 options:peer=patch-to-br0 //把对端网桥和此网桥连接的端口名称设置为patch-to-br08 x& Q. B4 R& [" z" e: R. C
ovs-vsctl add-port br1 patch-to-br0 //为br0添加一个虚拟端口
4 c, b( O/ t- ?9 n- H$ A1 Jovs-vsctl set interface patch-to-br0 type=patch //把patch-to-br0的类型设置为patch
$ ]% h, ~, q( m; Y1 iovs-vsctl set interface patch-to-br0 options:peer=patch-to-br1 //把对端网桥和此网桥连接的端口名称设置为patch-to-br1 c& b/ g0 f; Z# ]4 m% x
1) Y3 s- Q" w. T& b- B- [
. d4 `1 k* O9 C! T
5、在不同的主机之间构建网桥之间的连接
" [6 @2 L. H) M, p, u# o# b& _/ O在两台机器上分别安装上open vswitch并创建网桥,分别为两个网桥添加物理网卡,然后通过网线连接两个网桥,实现两个网桥之间的互通。构建结果图如下:* | n% \) K8 p& ]' e
在这里插入图片描述
" |& s( S# J" ?7 x6 j9 }2 \执行命令:) `/ S( M& C8 T
host1 q6 t) t* J( G9 S4 p+ k
ovs-vsctl add-br br0 //添加名为br0的网桥
: H' Q* e" }: s* d1 t, @, e0 Povs-vsctl add-port br0 eth0 //把eth0挂接到br0上
5 [' s5 }3 O: H7 I& N# A/ Y
- J7 Y5 h$ [4 |+ e" T6 @4 p4 ~& ]% f; s( f" g1 E/ j
host2
4 [. [! N8 @$ }; Lovs-vsctl add-br br0 //添加名为br0的网桥
. w* R6 ~) m$ x o- C2 ^ovs-vsctl add-port br0 eth0 //把eth0挂接到br0上9 p1 V' B3 X$ y0 j
; k/ D! s6 [7 P
然后使用网线把host1的eth0和host2的eth0相连即可。
. T. W7 e X0 v0 @0 `) F6 c使用上边五种方法的组合就可以构建出各种复杂的网络,为各种实验提供网络的支持。7 A1 r* d* h4 N, w) f2 Q U
四、OVS中的各种流(flows)
, W( q0 N' R+ `/ `: Hflows是OVS进行数据转发策略控制的核心数据结构,区别于Linux Bridge是个单纯基于MAC地址学习的二层交换机,flows的存在使OVS作为一款SDN交换机成为云平台网络虚拟机化主要组件
8 P2 {! F) H. u0 eOVS中有多种flows存在,用于不同目的,但最主要的还是OpenFlow flows这种,文中未明确说明的flows都是指OpenFlow flows3 b. S' Z& ^/ Z) E
1、OpenFlow flows3 o5 S6 j8 m& e; n$ j2 K, J2 Z! k% x
OVS中最重要的一种flows,Controller控制器下发的就是这种flows,OVS架构部分已经简单介绍过,关于OpenFlow 的具体使用,会在另一篇文章中说明
! b, |1 H0 g ]! v3 m4 x# W2、“hidden” flows) ` y/ R7 C4 C( e% `4 c" `
OVS在使用OpenFlow flows时,需要与OpenFlow控制器建立TCP连接,若此TCP连接不依赖OVS,即没有OVS依然可以建立连接,此时就是out-of-band control模式,这种模式下不需要"hidden" flows。$ v' J5 A+ ]! I4 t9 f& M/ [
但是在in-band control模式下,TCP连接的建立依赖OVS控制的网络,但此时OVS依赖OpenFLow控制器下发的flows才能正常工作,没法建立TCP连接也就无法下发flows,这就产生矛盾了,因此需要存在一些"hidden" flows,这些"hidden" flows保证了TCP连接能够正常建立。关于in-band control详细介绍,参考OVS官方文档Design Decisions In Open vSwitch 中In-Band Control部分,“hidden” flows优先级高于OpenFlow flows,它们不需要手动设置。可以使用ovs-appctl查看这些flows,下面命令输出内容包括OpenFlow flows,"hidden" flows
+ D* ], n7 u: v7 K( Zovs-appctl bridge/dump-flows<br>) c& m! ^4 m8 G) ?, C' B
0 ^: e2 u' A. X) l2 G
3、datapath flows6 j0 q# i9 P. R7 V3 e0 ]' _
datapath flows是datapath内核模块维护的flows,由内核模块维护意味着我们并不需要去修改管理它。与OpenFlow flows不同的是,它不支持优先级,并且只有一个表,这些特点使它非常适合做缓存。与OpenFlow一样的是它支持通配符,也支持指令集(多个action)% G9 B- k" V4 {! h9 E; o
datapath flows可以来自用户空间ovs-vswitchd缓存,也可以是datapath内核模块进行MAC地址学习到的flows,这取决与OVS是作为SDN交换机,还是像Linux Bridge那样只是一个简单基于MAC地址学习的二层交换机
0 D7 z( f! s( X, I5 u4、管理flows的命令行工具
?/ R$ p8 W0 R3 w* p2 M我们可以修改和配置的是OpenFlow flows。datapath flow和"hidden" flows由OVS自身管理,我们不必去修改它。当然,调试场景下还是可以使用工具修改的
7 H" p0 C2 s9 t+ H% W介绍下上面三种flows管理工具,不具体说明,具体使用可以查看相关man手册! l6 H) H# T, g5 W& v
ovs-ofctl dump-flows <br> 打印指定网桥内的所有OpenFlow flows,可以存在多个流表(flow tables),按表顺序显示。不包括"hidden" flows。这是最常用的查看flows命令,当然这条命令对所有OpenFlow交换机都有效,不单单是OVS1 I# {& g1 ^4 }8 N \
ovs-appctl bridge/dump-flows <br> 打印指定网桥内所有OpenFlow flows,包括"hidden" flows,in-band control模式下排错可以用到2 a( C, v i5 u5 J; d, @5 W
ovs-dpctl dump-flows [dp] 打印内核模块中datapath flows,[dp]可以省略,默认主机中只有一个datapath system@ovs-system man手册可以找到非常详细的用法说明,注意ovs-ofctl管理的是OpenFlow flows/ `& p' I. V+ [0 M2 t; R9 ^
|
|