|
|
一、必须掌握的基础知识
4 u2 e" }+ I# H, n1、具备看懂流表的能力
$ G: k! R) y- L$ LOpenFlow流表是常用的SDN云数据中心转发依据。要搞明白控制转发机制,首先就得具备读懂流表的能力。流表由很多个流表项组成,每个流表项就是一个转发规则。每个流表项由匹配字段、优先级、计数器、指令、超时、cookie这六部分组成。流表项中关键的两个内容是匹配字段和指令。匹配字段包括inport、报文的12元组信息等。指令是用来描述OpenFlow的处理方式,修改数据包的行动集或触发流表的流水线处理。流表的匹配原则是“table0—table255”,优先从table0开始匹配。同一table内部按照优先级匹配,优先级高优先匹配。需要特殊说明一下,不同商业解决方案的流表格式存在一定差异性,但是本质上都是一致的。抓住流表的六要素和流表匹配原则,就能读懂并理解不同厂家的流表。
& b" c/ L7 Y- p+ q4 }- ?& M6 i3 K: H3 e- b5 x) |/ m
以某商业解决方案的两个流表项为例,说明下流表的含义:
2 M `; t9 y# c' `2 C$ @: n7 [/ b8 o1 J* E* P8 R3 C/ {
Java2 z2 @8 X# D6 R" ?4 d8 H
/ a2 X5 P* O) s% j" [. v+ Y. o9 x5 J
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+ o) n, {7 A: a# I' G
1/ [7 x+ B' j9 V/ _" ~) h: N8 @' N
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
( D1 L, F9 a7 T3 k3 s- m, y3 Z这是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端口转发数据包”。6 o! k. s& ^$ s7 T! P8 |
' ?- q) Q- Y% l8 Y0 g; vJava, t7 F( g; ?2 Y/ P4 b) F2 F
$ c4 h- s0 B" y
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
8 u7 G7 X4 g( ^# I- y5 k15 q. j5 L' W# p* X# I
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
; J& R7 o# {7 k4 O6 I4 z9 d这是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端口转发数据包”。# ?. _( I* M8 t" O% z
) |1 B* x m4 y8 Q7 ^) D% C
下面给出了常见的匹配字段和动作,供参考。& _% w' J. f- _: ^+ { n) U
+ F; i; p! k- P' c5 S! l3 B! c# ^Match field
1 R/ Q: g8 [4 v2 T! m7 R/ ^. w
+ U& }8 u8 G5 B7 P) M说明 f" t, d- G3 D7 ^+ U5 ]$ J
/ ]8 p0 h, N1 z3 ~
in_port
% z3 T# ~" S |
2 H9 b4 _- c( }$ m( G" d O- gSwitch input port. \* P4 Y& ^. s1 M( |2 N
! k' z$ ~4 j2 [' t @
dl_dst
& X3 _' H: v8 X6 a
3 ]7 w7 Z$ k9 a! Q ?( eEthernet destination address, S7 y5 O' l: A- c: m
$ |. |2 V6 B% W. `& K j
dl_src
# D6 C/ w& |( b2 Z
8 y c+ s1 y1 c% [; V0 hEthernet source address$ r. t' Y3 J7 P) h
' g% t4 Y0 l2 t! xdl_vlan. p4 I3 o9 d: u8 @8 ]1 U/ P' P4 v" z C
% B6 O& g5 q7 L; a
VLAN id
- A& e4 J; i& {/ M9 t( p
. n: N& H3 V5 d$ c/ a# E2 Dnw_src2 O7 Z3 M* B, _& e( n2 {% T! X
5 I+ |3 C1 U' A, |" ]) n$ h p
IPv4 source address. ]* @; O$ v9 {+ R- Y+ G% o# {2 I
' h, M( F1 z7 _: ` Nnw_dst$ \4 y/ ?. F% a3 E' Z
1 z* H5 l, s& O% c; X6 M' L, b
IPv4 destination address
% L7 A g5 J/ F. s% k
' g2 [9 Y- K( H/ d% atcp_src$ a0 Y' l% {2 M4 [" ~
2 X. m: P* v7 l
TCP source port/ }$ f0 e' }1 L
+ _; m1 h' X5 z6 ]1 d9 R. N( r- j9 atcp_dst1 s2 Z8 I2 O: M" @4 e
, O! S) X& @0 Z' z% }
TCP destination port
' ~& w8 q* n" U2 S/ q
6 H1 F2 p. i3 y" m; j5 F! _udp_src
/ G* ]3 x! ^5 p' g2 q5 F: T/ q0 D3 P; L. S t" H" S
UDP source port
5 v9 j8 F3 R- {% ?, q$ I! j: K/ G: I- k
udp_dst
( M8 c+ ~% ~. n0 Y. m* [) w3 f1 x) T. Z$ V4 l1 |
UDP destination port0 P: G4 e1 o5 G' \- R0 N
& O+ ?: y( @ F- t, J$ i. ~! s6 m
Action
( A9 l2 P- Z4 S; D* p B" V- m# X* l) V# g( F
动作$ E: c! [5 Z3 H& B2 A
' f( J. b1 L) J' m+ Q6 Oresubmit
+ a4 @7 x/ [4 M5 |) r
) v6 L. G2 E; u# S( z跳转表: D4 f( [1 _( X/ r- G% t7 B0 b! J
+ U: w6 @& T( P# Tdrop
3 a$ h2 {- |9 I0 _2 {7 ?7 B" j2 Y/ b
- B/ o# d! t L丢弃9 ]; Q# P0 o5 h. N+ l1 G" _; V* A
/ n. g9 x5 R ~4 e/ Lload:$local_vlan->NXM_NX_REG0[0..11]
" C" Y$ G0 o( w% I: J
1 w, f9 t1 [- l( w4 {+ R- dlocal_vlan放在寄存器里
1 W' ~, ]1 M9 U, ~0 a
7 s# }6 y% [) u# B' c3 z. OCONTROLLER
; M4 N3 o, N, n' |! q \3 N9 Z- y( H
上送控制器
' O* t& l/ E6 r- B+ l# `8 q) n" K4 Q2 R% r6 m+ I: j/ x4 Q
mod_vlan_pcp8 r9 o# i, n6 v: ?9 a
/ u2 q5 [9 U: E修改vlanpcp" N- f7 \. X4 B! B [$ m) J6 W
# [8 O) Y% |! ]7 J0 p0 h0 Fmove
$ s9 U. k3 M% V: q" Q1 s( W( ] b; ^' O' D) u( w5 i' j. Q: g" n H
将报文的dst设置为src
( c7 n; U& i+ g6 G \2 a2 |0 a) j3 W+ ^; H2 e" S( C) N6 R
mod_dl_src
8 w5 \1 e8 e' z) Y8 W, d7 z8 F/ n/ D/ v/ t
修改目的mac3 T+ p2 x- n; v* }
9 {( V2 w1 y' Y7 C% g0 j
load
; Q9 A8 n/ a& e2 Q1 K
/ a# S: y" O9 n. V设置某个报文头部的值7 Q* [. G0 |( S" h3 c# b
2 A& F f6 N+ `) E. W) z3 S" B( b: L' {output
# ~* g, K r; n& z3 a
% p7 E" |8 I; b8 I) s+ q! v J G从指定端口发出
E4 \) y7 I4 _0 V) z0 M, _) Q7 [; ]) w3 v2 T
IN_PORT
2 ?+ [% h8 J0 o# y
9 m S4 ?: F7 H0 k# B+ g从入端口发出
; q5 c) W& C' B7 u2 p* V' U
6 p' S& H8 N5 _6 x+ F6 k" S/ ?0 aset_tun_id
# T7 f9 l: `5 x8 `1 J O1 d- @ ]4 d. h$ C" o+ |, B- S( s
设置vni
* P4 Q- J0 V8 W1 ^
( q+ u) _8 s! r* h+ x1 @2、具备看懂vxlan数据包的能力7 L8 k7 s- @: @9 E
在网络运维中,常常会用到wireshark软件进行数据包的抓取和分析,从而进一步分析网络转发平面的运作机制。在SDN云数据中心的数据平面会用到vxlan隧道封装技术,因此需要了解vxlan的数据封装格式,并能够通过抓取的vxlan数据包进行网络分析。6 X& N/ p# H0 t" q+ N4 b
5 _! Q+ e0 r+ M, R以下是wireshark的一个vlan数据包示例。这是一个ICMP(ping)数据包。Ethernet 是以太网封装,src为源mac地址,dst为目的mac地址。Internet是IP层封装,src是源IP地址,dst是目的IP。
. m, @" P y1 j* n H$ }9 M: S
D/ v/ u& g' @# @7 F5 ~我们来看一个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.0 H7 e8 v/ o" F' J6 C1 b* E
$ r8 ~/ e# A) Y7 G- n! G, }9 q4 a4 T
: h7 ] Q# ^8 Y二、控制和转发的联动分析0 i. e4 r6 Z! q
物理服务器上的虚拟交换机是SDN云数据中心较为常用的网络设备。需要特殊说明一下,在不同商业解决方案中,流表内容和用户流量/vxlan映射关系存在一定差异性。下面以一个商用虚拟交换机的流表和数据包为例,抛砖引玉,分析vpc产品的技术实现。
( C z* } A$ u- _ p( |7 o; c
* M ]/ |2 N$ g7 o) I0 j1、同子网虚拟机的流量互访:7 ?7 a- q) B1 T4 s$ A
G# K$ S; ?: k4 E1 J' w(1)控制平面:分别查看PM1和PM2虚拟交换机的流表。% s/ N0 e: j, z
PM1的虚拟交换机有如下流表:% F/ J+ o( N' B5 }
4 @6 c, l2 h3 V% F1 `1 w2 E6 c
Java
* g9 V3 @5 D% w$ E- s; c/ o" [0 ~0 `+ ^1 p
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
( N2 d/ U0 K( z; |- E1 v; r+ _16 G A6 }+ [# p
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
; i0 h# ]& k4 c5 z" v. N3 \这条流表的含义是:流表的匹配字段是“数据包来自虚拟交换机的端口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转发出去”。2 t8 W% g! `1 V( F8 j3 u$ d
8 C6 P# v* n1 R( h' y: X( ?- C; dPM2的虚拟交换机有如下流表:$ v6 T5 v |% f! Q4 s1 o
! U }, Y5 v: A7 l4 k0 x w
Java
/ ]6 t1 y, n$ t8 [" Q! C* U5 w1 \$ `, c M
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
3 B3 S- e; \- v( @+ u1 X; H, \$ p1% B1 {5 Z1 S1 W3 q# M$ V- |% V
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! U+ J {7 e/ P$ _2 a) A
这条流表的含义是: 流表的匹配字段是“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转发出去”。# k: |' t B y
(2)转发平面:分别在PM1和PM2上OVS的tap1和bond1口进行抓包分析,分析“数据包经过虚拟交换机后做了哪些变化”。
. b9 G1 g$ p9 c; N9 ?* c9 w9 nPM1的tap1的数据包格式如下,是vlan格式:
1 C( X, J4 y, H% l8 S4 c4 g8 l3 Z& h9 H' Y
PM1的bond1的数据包格式如下,是vxlan格式:! G, J. H+ N. I: z o" O! N7 p$ k
: y# H& `" K8 X1 e2 h8 p$ t+ ]PM2的bond1的数据包格式如下,是vxlan格式:
* t8 d1 U9 C. M' `# S1 r
' G( {6 J* n4 v Y) TPM2的tap1的数据包格式如下,是vlan格式:& x, }! A3 L7 Q. r
; | L) _- }+ T! ?2 K4 d9 U通过对上面四个节点的数据包分析,可以得到:PM1的虚拟交换机对来自VM1的数据包进行了vxlan隧道封装,VNI标识是3257333。在underlay交换机上,基于vxlan 的隧道IP地址完成数据包的转发,对隧道里面封装的VM数据包内容处于无感知状态。PM2的虚拟交换机则是相应的完成的vxlan数据包的解封装过程,并将数据包送至VM2。
6 E" A; j8 c4 e* j+ ?% Q3 Z8 G, k. i4 W* M* W! Q
2、跨子网虚拟机的流量互访- g5 r5 D0 |0 g8 S B+ ]
跨子网通信的控制转发联动原理,与同子网场景下的是一致的,只是在流表内容上有一定差异性。跨子网的流量交互涉及到网关联动处理,存在原始数据包的MAC地址转化,同时vxlan隧道封装的VNI也会不同。以PM1的发送端为例,分析如下。
* h1 `% E3 j4 V6 U8 @$ e$ ]4 i
/ j4 O. i/ _5 N; L2 h0 k# WPM1上的流表:6 T7 {0 f% F) m9 e' ]* P
0 z _6 P. e( P h- }: i" F: j# C
Java( V+ c5 u( k$ @ D2 l
1 b5 v3 M7 B' `( A( D
skb_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)),69 {, E5 E- }9 {/ `( \+ e( r
1
' x4 L+ h( N# V( l8 L! ^' {skb_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- j* d1 V: K1 h K$ a( j! b/ ]
这条流表的含义是: 流表的匹配字段是“数据包来自虚拟交换机的端口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转发出去”。
1 H: w! K# B. n ] V3 Q4 G+ {* A7 M) B f8 h/ q. |+ B( y3 \+ }( ?
PM1上bond1的数据包:* p# z L! J% [6 a+ n" \ F& N
' g$ |# r! f5 q( H4 Z
从抓包可以看出,VM1的数据包经过虚拟交换机后被封装为vni为3709754的vxlan数据包,与流表的动作集一致。 |
|