|
|
一、必须掌握的基础知识$ n0 c% { f: k! Y
1、具备看懂流表的能力# h7 P% _2 s# X; L* o
OpenFlow流表是常用的SDN云数据中心转发依据。要搞明白控制转发机制,首先就得具备读懂流表的能力。流表由很多个流表项组成,每个流表项就是一个转发规则。每个流表项由匹配字段、优先级、计数器、指令、超时、cookie这六部分组成。流表项中关键的两个内容是匹配字段和指令。匹配字段包括inport、报文的12元组信息等。指令是用来描述OpenFlow的处理方式,修改数据包的行动集或触发流表的流水线处理。流表的匹配原则是“table0—table255”,优先从table0开始匹配。同一table内部按照优先级匹配,优先级高优先匹配。需要特殊说明一下,不同商业解决方案的流表格式存在一定差异性,但是本质上都是一致的。抓住流表的六要素和流表匹配原则,就能读懂并理解不同厂家的流表。
( E! y8 h4 W. ?9 l6 L5 _8 Z
9 c! q/ o/ d5 W% H7 \+ K: l5 D以某商业解决方案的两个流表项为例,说明下流表的含义:
I# x( U9 v/ ^! K$ Z/ B: k4 m$ u- ]1 `' X
Java
4 J m2 C( O7 \' v. |9 T {
' z; K n) d, R( ?+ _cookie=0x2000208,duration=231310.205s,table=160,n_packets=2879,n_bytes=282142,idle_age=0,hard_age=65534,priority=90,ip,dl_dst=fa:16:3f:00:02:d1,nw_dst=192.168.1.4 actions=mod_dl_dst:fa:16:3e:54:db:6a,mod_dl_src:fa:16:3e:2c:f0:e3,strip_vlan,output:32 Z. _1 H3 e! f, q: j* P. o) j
12 x4 G3 H4 ?( w( B: X
cookie=0x2000208,duration=231310.205s,table=160,n_packets=2879,n_bytes=282142,idle_age=0,hard_age=65534,priority=90,ip,dl_dst=fa:16:3f:00:02:d1,nw_dst=192.168.1.4 actions=mod_dl_dst:fa:16:3e:54:db:6a,mod_dl_src:fa:16:3e:2c:f0:e3,strip_vlan,output:3
: z4 \5 t! q {- W7 J' U3 H( D1 e这是table160的一个优先级为90的流表项内容,它的匹配项是“IP数据包,目的MAC地址是fa:16:3f:00:02:d1,目的IP地址是192.168.1.4”,若是数据包的包头与流表匹配项完全匹配后,则执行下面动作“修改数据包的目的MAC地址为fa:16:3e:54:db:6a,修改源MAC地址为fa:16:3e:2c:f0:e3,剥掉vlan标签,从交换机的3端口转发数据包”。8 t. w# H0 @: B1 [- C0 v
% p, \6 f$ [6 C$ K6 i8 ]! ]- tJava
, f0 m+ N; H" |8 w
/ I6 s& r! i+ dcookie=0x2000205,duration=168409.329s,table=200,n_packets=93326,n_bytes=23319603, idle_age=117, hard_age=65534, priority=90,dl_vlan=6,dl_dst=d4:94:e8:5b:4e:01,actions=strip_vlan,set_tunnel:0x4e5c(20060),load:0xa0005f5(10.0.5.245)->NXM_NX_TUN_IPV4_SRC[],load:0xa00032d(10.0.3.45)->NXM_NX_TUN_IPV4_DST[],output:23 w: n( q: V3 O
1- ^( x& {: C" Q
cookie=0x2000205,duration=168409.329s,table=200,n_packets=93326,n_bytes=23319603, idle_age=117, hard_age=65534, priority=90,dl_vlan=6,dl_dst=d4:94:e8:5b:4e:01,actions=strip_vlan,set_tunnel:0x4e5c(20060),load:0xa0005f5(10.0.5.245)->NXM_NX_TUN_IPV4_SRC[],load:0xa00032d(10.0.3.45)->NXM_NX_TUN_IPV4_DST[],output:2 m4 t- j% ]7 ^" Q$ r' Q$ \7 Z3 V
这是table200的一个优先级为90的流表项内容,它的匹配项是“vlan id是6,目的MAC地址是d4:94:e8:5b:4e:01”,若是数据包的包头与流表匹配项完全匹配后,则执行下面动作“剥掉vlan标签,将数据包封装为vni为20060的vxlan隧道,隧道的源IP地址是10.0.5.245,隧道的目的IP地址是10.0.3.45,从交换机的2端口转发数据包”。
. t+ |, C3 R# J. p4 X6 k% R
% ~% [( u0 D+ B2 s; I下面给出了常见的匹配字段和动作,供参考。4 P0 f% z" r) a
& I/ E* M& n: g2 I5 v* n
Match field
4 H' n0 l. G* ?! x1 c$ x# v @2 P2 L3 A; r: z
说明$ A: M& a+ p6 `: ~
i- ^( V" ?; D X2 Nin_port% _; `- Z) z( q: v- ?4 w
) \( e# U7 V9 W
Switch input port
$ T9 Y. G+ Q- ~' ~) U$ J: ]6 O
$ M: X) G3 z' Wdl_dst
& i! I9 G# x( F; t8 C3 S/ v
$ y! ~, l! {5 O/ }, ~Ethernet destination address; J' S6 f: c0 s
- ^- I7 Z3 @9 p3 o( y' bdl_src
% Q. R9 _$ M7 \. ~2 w4 G/ P8 _' J- @! i& B
Ethernet source address6 u2 `: f: N! r5 g# |4 a2 e( b5 \ l! _
: [+ }1 g2 M3 X( U3 l
dl_vlan" z$ X. k- r5 x) p! h. l
) ]- R/ C* y% s5 x9 F0 l t! W' mVLAN id3 O! l1 z- m. T) b- @# V& v
6 E5 D0 S# o) R6 T, _+ |
nw_src* M5 s B3 P2 m% ]* \
" c! |! Z0 x; ^3 zIPv4 source address
( Z: H. M5 g* m1 ~) E5 y% \, Q9 P2 F1 @4 n" N- @2 R! M
nw_dst
; T3 w) K0 e2 ]9 \
4 R3 r& k0 S# t7 n" JIPv4 destination address: h) Q% A+ p# r/ m: j, N) ]9 p$ P1 i
& k$ L1 n z- ~8 f
tcp_src0 U8 B2 D( F4 K6 Y3 M
# l& i4 C4 t, \' O$ t1 m y+ \- wTCP source port+ ?0 Y7 U5 |, \0 z6 s
1 T1 h/ v! [% r# F( f
tcp_dst
3 W- p8 ?; E$ f8 b1 }9 d
, b! w9 T9 P2 V J7 o& mTCP destination port( l# ^6 r6 |, c! D; d! D5 z
, u1 |$ h, v; w3 xudp_src! p; ]$ K/ }) \0 b$ ~9 s
. w- _1 h- C5 r' J4 e" cUDP source port% ?* ]/ h; D6 C- f0 _* A# i
' |6 \, {* A6 ^udp_dst( P1 {3 \% R4 t" r
% f$ ^- V) h* E) RUDP destination port
# y9 u( Q( L9 m: h2 K( P. q; h) U: T2 h: L
Action( @* B0 F' ? `7 s/ |# {
1 n6 r( x7 ~- `) N动作
$ a! J: ~# ]# h. I H- z9 r9 j$ N3 }8 N( G$ \
resubmit7 w3 e4 @" E, S8 u
' E1 W, U0 `* U/ ~跳转表
1 ?* s: o' ]' x* Q4 C* ^9 ~" I( H5 Z2 ^9 _7 F. w B- V
drop5 a: t$ p7 c7 R4 B) d
' a9 ]: g. Y# z L
丢弃 J: i6 Q, x1 b( V% c4 o
: h5 @6 o7 X9 l l8 hload:$local_vlan->NXM_NX_REG0[0..11]! a a) g4 z/ ^* b
! n7 B& c! F9 C( B
local_vlan放在寄存器里* h, r/ V: j: h+ S; v9 A& X: _
8 Z% O" N2 E# h' qCONTROLLER
5 F! {" W0 {$ B) J4 y4 p% a/ V- u, e+ h, f) T) N
上送控制器
8 F3 z# G1 o! A6 |7 Z. V) \
0 \0 B1 p7 ?3 F# B# [1 F8 cmod_vlan_pcp2 ^. W. r3 p8 \$ V& c
" w) }8 H! r$ U% G6 P修改vlanpcp. C+ L: `1 K$ p; K/ g8 v
9 Z9 h. I$ N" Y+ Z# `2 B* a3 Dmove! H6 X8 ^: L! o* J8 k
* k( s3 R. }+ J' V0 Z: q
将报文的dst设置为src
( Y' p4 R9 {9 D+ b4 P* I7 L. f3 J1 ?) |* Y
mod_dl_src) L( a4 u7 I; i
, g5 F4 l8 X, ^4 S
修改目的mac4 J6 i, u2 b% ]- ?: p
. z& z' N4 y1 M) H
load
& Z) T# e' p% V4 q7 A" H) P/ x$ E) N5 f) y5 g$ @
设置某个报文头部的值
. c; Y# k e# l% R- a$ d7 s2 ?8 C# ^: E" B" b) p8 Y2 Q0 J
output
, f6 R: i7 v& ]$ P- r# m: t, e1 E$ O3 i( S2 f' V# ~" g
从指定端口发出: |5 v2 j5 o( p# }- h
* u# z! H3 C5 Z7 x& H, ?IN_PORT
; p+ M6 u9 S! ?- d4 T- G3 i1 a# d0 R( G( a! j) w6 |
从入端口发出
5 H) X* h5 M, v8 a
4 b2 A! R1 M$ x8 [1 E9 Mset_tun_id
3 S& f% F3 y! J5 W
9 @3 H! R) S% h* j设置vni
2 t, l! Y; |- Y2 F6 n* P/ m
& J$ m4 n' [: D; d: d2、具备看懂vxlan数据包的能力* X* ~3 c# \* @
在网络运维中,常常会用到wireshark软件进行数据包的抓取和分析,从而进一步分析网络转发平面的运作机制。在SDN云数据中心的数据平面会用到vxlan隧道封装技术,因此需要了解vxlan的数据封装格式,并能够通过抓取的vxlan数据包进行网络分析。
6 h3 Q) r5 H1 P9 g3 F9 K0 f R6 K% V7 }' p, z' M% I# F, _
以下是wireshark的一个vlan数据包示例。这是一个ICMP(ping)数据包。Ethernet 是以太网封装,src为源mac地址,dst为目的mac地址。Internet是IP层封装,src是源IP地址,dst是目的IP。 |$ ?6 L$ q* y' A
) z, [. @2 x+ n6 N ^2 ~. }. d我们来看一个vxlan数据包的wireshark示例。这也是一个ICMP(ping)数据包,跟vlan数据包相比,多了一层数据封装。。Vxlan隧道的源IP地址是10.0.3.45,目的IP地址是10.0.5.169,隧道的VNI标识是20022。原始数据包的源IP地址是114.114.114.114,目的IP地址是192.168.1.4.) {. B5 G0 B% f" x; S" R# D
8 c8 {! ]" K% b; z( g8 o
! q/ C1 c) ]3 h: [, T0 O( t二、控制和转发的联动分析
$ N! ] X8 W" E2 N物理服务器上的虚拟交换机是SDN云数据中心较为常用的网络设备。需要特殊说明一下,在不同商业解决方案中,流表内容和用户流量/vxlan映射关系存在一定差异性。下面以一个商用虚拟交换机的流表和数据包为例,抛砖引玉,分析vpc产品的技术实现。3 d; V9 W. C/ J: N8 O. Q5 K
" P- U/ u) T; O; h! J. s2 u
1、同子网虚拟机的流量互访:$ I$ R$ M$ E% u$ ?
- i5 I4 S: {2 E( s: P1 O1 o4 Q
(1)控制平面:分别查看PM1和PM2虚拟交换机的流表。2 O5 k* h% Z. S; M( X, P
PM1的虚拟交换机有如下流表:/ s1 k. [& H+ ` x1 n
) J/ Z. A" B6 @0 b5 q, f7 m
Java a; {; J$ ]9 h- \1 A V9 X
0 w0 X9 b' w( b2 E/ A
skb_priority(0),in_port(5),eth(src=fa:16:3e:79:b7:62,dst=fa:16:3e:eb:2b:1e),eth_type(0x0800),ipv4(src=192.168.1.3/255.255.255.255,dst=192.168.1.5/255.255.255.255,proto=1/0xff,tos=0/0x3,ttl=64/0,frag=no/0xff), packets:7, bytes:686, used:0.883s, actions:set(tunnel(tun_id=0x31b3f5(3257333),src=0.0.0.0,dst=10.0.4.84,tos=0x0,ttl=64,flags(key))),6
) r- k* T" K2 f. b, v7 X) ^5 v5 `( l10 k3 r# E" ?& ?. T$ ]1 X- z4 x
skb_priority(0),in_port(5),eth(src=fa:16:3e:79:b7:62,dst=fa:16:3e:eb:2b:1e),eth_type(0x0800),ipv4(src=192.168.1.3/255.255.255.255,dst=192.168.1.5/255.255.255.255,proto=1/0xff,tos=0/0x3,ttl=64/0,frag=no/0xff), packets:7, bytes:686, used:0.883s, actions:set(tunnel(tun_id=0x31b3f5(3257333),src=0.0.0.0,dst=10.0.4.84,tos=0x0,ttl=64,flags(key))),60 o3 L. t/ U9 r% _( f9 D
这条流表的含义是:流表的匹配字段是“数据包来自虚拟交换机的端口5,源MAC地址(src=fa:16:3e:79:b7:62),目的mac地址(dst=fa:16:3e:eb:2b:1e),源IP地址(192.168.1.3),目的IP地址(192.168.1.5)”,若是数据包完全匹配,则执行的指令是“将数据包封装为VNI为3257333的vxlan隧道,vxlan隧道的源IP为自身,目的IP为10.0.4.84,并从端口6转发出去”。6 Z, n, n( f. y8 [, x
; f( { n; O# l; g' }
PM2的虚拟交换机有如下流表:9 `( ?/ p& a/ W8 j
' W- W0 s# m& B: J3 V( wJava0 G, V" `& G; i! r0 K
+ N% [' t& v- @2 F! S5 G! O5 oskb_priority(0),tunnel(tun_id=0x31b3f5(3257333)/0xffffffffffffffff,src=10.0.4.119/255.255.255.255,dst=10.0.4.84/255.255.255.255,tos=0/0xff,ttl=64/0xff,flags(key)),in_port(6),skb_mark(0),eth(src=fa:16:3e:79:b7:62,dst=fa:16:3e:eb:2b:1e),eth_type(0x0800),ipv4(src=192.168.1.3/255.255.255.255,dst=192.168.1.5/255.255.255.255,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff), packets:30, bytes:2940, used:0.335s, actions:58 Z( ^7 u( O+ U1 ~* M: h' f* x3 c
1' ?) l6 L( W( t, r) f4 L# G; B, y5 B
skb_priority(0),tunnel(tun_id=0x31b3f5(3257333)/0xffffffffffffffff,src=10.0.4.119/255.255.255.255,dst=10.0.4.84/255.255.255.255,tos=0/0xff,ttl=64/0xff,flags(key)),in_port(6),skb_mark(0),eth(src=fa:16:3e:79:b7:62,dst=fa:16:3e:eb:2b:1e),eth_type(0x0800),ipv4(src=192.168.1.3/255.255.255.255,dst=192.168.1.5/255.255.255.255,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff), packets:30, bytes:2940, used:0.335s, actions:5
& [+ I/ M: E3 p# o( `这条流表的含义是: 流表的匹配字段是“vxlan数据包的VNI为3257333,vxlan源IP地址(10.0.4.119),vxlan目的IP地址(10.0.4.84),数据包来自OVS的端口6,原始数据包的源MAC地址(src= fa:16:3e:79:b7:62),目的mac地址(dst= fa:16:3e:eb:2b:1e),源IP地址(192.168.1.3),目的IP地址(192.168.1.5)”,若是数据包完全匹配,则执行的指令是“将数据包解封,并从端口5转发出去”。3 r# s, `* x: L
(2)转发平面:分别在PM1和PM2上OVS的tap1和bond1口进行抓包分析,分析“数据包经过虚拟交换机后做了哪些变化”。
: B: ]6 p* i; ~+ [" gPM1的tap1的数据包格式如下,是vlan格式:
+ l; v3 K' x: L( m) D' o
2 w& B4 H" Q+ J1 x& ~PM1的bond1的数据包格式如下,是vxlan格式:* T9 S. q; A$ K' W b
3 F2 X8 u# C$ X' }& s5 y! g1 ]
PM2的bond1的数据包格式如下,是vxlan格式:7 [; b& F+ L9 m
' L# d, I2 f8 R& \PM2的tap1的数据包格式如下,是vlan格式:7 U8 V4 U, `# \5 E
- o! X8 j3 G* u8 b通过对上面四个节点的数据包分析,可以得到:PM1的虚拟交换机对来自VM1的数据包进行了vxlan隧道封装,VNI标识是3257333。在underlay交换机上,基于vxlan 的隧道IP地址完成数据包的转发,对隧道里面封装的VM数据包内容处于无感知状态。PM2的虚拟交换机则是相应的完成的vxlan数据包的解封装过程,并将数据包送至VM2。: Q+ y, N( I# U" h$ z: Y4 ]+ o
3 y: R5 O6 f/ g2 }5 R. b( R2、跨子网虚拟机的流量互访& K+ \* k6 ]3 D: j
跨子网通信的控制转发联动原理,与同子网场景下的是一致的,只是在流表内容上有一定差异性。跨子网的流量交互涉及到网关联动处理,存在原始数据包的MAC地址转化,同时vxlan隧道封装的VNI也会不同。以PM1的发送端为例,分析如下。+ x) x! W" N* G0 r: }+ s% ^
( ~- W# Q; U, g2 D" K
PM1上的流表:
- n2 z1 E3 @7 w4 {9 C' d( z, D$ P; G/ I! O9 Q2 \8 ]
Java# U7 Q4 h, t( }9 A
! f# ~) E; z0 n$ r* n" a- gskb_priority(0),in_port(21),eth(src=fa:16:3e:79:b7:62,dst=68:54:ed:00:00:36),eth_type(0x0800),ipv4(src=192.168.1.3,dst=192.168.8.74,proto=1,tos=0,ttl=64,frag=no), packets:277, bytes:27146, used:0.594s, actions:set(tunnel(tun_id=0x389b3a(3709754),src=0.0.0.0,dst=10.0.4.129,tos=0x0,ttl=64,flags(key))),set(eth(src=68:54:ed:00:00:0c,dst=fa:16:3e:fc:4c:1f)),set(ipv4(src=192.168.1.3,dst=192.168.8.74,proto=1,tos=0,ttl=63,frag=no)),6/ R) D! n3 o, `* M5 N
1
" V' c$ {& A4 N" J0 p. wskb_priority(0),in_port(21),eth(src=fa:16:3e:79:b7:62,dst=68:54:ed:00:00:36),eth_type(0x0800),ipv4(src=192.168.1.3,dst=192.168.8.74,proto=1,tos=0,ttl=64,frag=no), packets:277, bytes:27146, used:0.594s, actions:set(tunnel(tun_id=0x389b3a(3709754),src=0.0.0.0,dst=10.0.4.129,tos=0x0,ttl=64,flags(key))),set(eth(src=68:54:ed:00:00:0c,dst=fa:16:3e:fc:4c:1f)),set(ipv4(src=192.168.1.3,dst=192.168.8.74,proto=1,tos=0,ttl=63,frag=no)),6
* F5 S3 r+ \. U! O* V这条流表的含义是: 流表的匹配字段是“数据包来自虚拟交换机的端口21,源MAC地址(src=fa:16:3e:79:b7:62),目的mac地址(dst=68:54:ed:00:00:36),源IP地址(192.168.1.3),目的IP地址(192.168.8.74)”,若是数据包完全匹配,则执行的指令是“将数据包封装为VNI为3709754的vxlan隧道, vxlan隧道的源IP为自身,目的IP为10.0.4.129,同时修改原始数据包的源地址为(src=68:54:ed:00:00:0c),目的MAC地址为(fa:16:3e:fc:4c:1f),最后从端口6转发出去”。
5 ~( W$ k1 Q' p* q! O; ~( W/ e% G" O' d" R. j
PM1上bond1的数据包:- T/ N; s( C/ Q
2 a3 v3 t6 J' C& Z' M" W从抓包可以看出,VM1的数据包经过虚拟交换机后被封装为vni为3709754的vxlan数据包,与流表的动作集一致。 |
|