|
|
一、必须掌握的基础知识
8 j+ Q, b6 p1 ] v C1、具备看懂流表的能力
) m; V2 N' N Z% j# U0 B8 DOpenFlow流表是常用的SDN云数据中心转发依据。要搞明白控制转发机制,首先就得具备读懂流表的能力。流表由很多个流表项组成,每个流表项就是一个转发规则。每个流表项由匹配字段、优先级、计数器、指令、超时、cookie这六部分组成。流表项中关键的两个内容是匹配字段和指令。匹配字段包括inport、报文的12元组信息等。指令是用来描述OpenFlow的处理方式,修改数据包的行动集或触发流表的流水线处理。流表的匹配原则是“table0—table255”,优先从table0开始匹配。同一table内部按照优先级匹配,优先级高优先匹配。需要特殊说明一下,不同商业解决方案的流表格式存在一定差异性,但是本质上都是一致的。抓住流表的六要素和流表匹配原则,就能读懂并理解不同厂家的流表。
* A! Z3 `2 b, Z! d+ {! \' x8 N' C) a6 R6 S& [9 L: Z' V
以某商业解决方案的两个流表项为例,说明下流表的含义:% u9 T# m7 C8 f6 {* V# u
( Q0 U% ~% i5 ]
Java
1 H( R6 `! q- g: b# j2 Y, x
1 l$ i# }. K1 x0 X( W' Lcookie=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& G6 y1 h) E& o
19 g6 E/ \& F, I% g; s
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
: y( y( Z' s1 K. P% A7 w. \这是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端口转发数据包”。7 S, Z. D, c, ~5 }6 y3 S
2 K! L& o& W# }( R; n' gJava* s# x! ^. \; w7 O
5 z! e" |2 h A- E5 Lcookie=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
+ d5 t! H, I% @7 z3 M3 h, W! O- H& y1! @, Z( t8 z& A8 {+ u% X) @' x
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. z( d0 A% T+ ?) S
这是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端口转发数据包”。7 Z9 I2 X+ f# o t" B
. B$ H- w g0 G下面给出了常见的匹配字段和动作,供参考。
8 z8 C! ~+ X" B6 |6 i( B# r& t a/ U5 i# e6 \3 d' S
Match field
& t1 r8 n1 H* }9 s; a
+ l y, I3 i0 U4 U4 y说明1 t/ V% G! k& N; f+ ?( K
) t5 l- J6 F3 A7 z& _
in_port
6 F! h8 U$ L9 A, ?; |6 @: U2 ^9 U* J
Switch input port
# m1 r, I4 Y4 D" z; p* D) T6 M6 E' H
dl_dst% ?. V5 K* T( `0 k n
% l) w- U7 a: y, M4 S7 ZEthernet destination address
2 c3 q. j' @$ e% q
: m' ~7 O0 ] ^* Udl_src# ?* R& ]3 H4 ]
2 O; ~4 S: c& y+ U! [1 g8 L* c
Ethernet source address& U* y' f# |; {) F0 y! H
8 Y/ N2 |1 b; L
dl_vlan
/ W M( _2 l/ W1 h& w2 a, l$ R4 ]9 B( u2 ^
VLAN id
& b: G7 R6 J/ J
+ h( p0 g" k9 z$ `nw_src
) M7 U D- v+ c% g
4 @, {8 Z) f9 ]) _" r9 o* }IPv4 source address
* W% D+ f' |6 B; k2 e( o
5 f2 W( X& i5 w3 Jnw_dst
3 P2 r. i0 P& B' p. L
) i/ p6 U/ G! jIPv4 destination address, E' I8 i( q7 v6 F
; I: g7 }! w2 Y# s: Btcp_src
5 C6 ^- ^8 g" v. _
: V+ A! q0 Y6 E. mTCP source port2 E0 ]# j5 d/ g& h
5 g9 g& v, X9 p c# _% Jtcp_dst: j. |# {7 _- C: U
9 X% h' t. M# |- `7 M9 V3 S, z5 [
TCP destination port, g! o6 Y: B1 |: \, A! C$ E
) D" M( o9 A6 \+ i' M g
udp_src
# A+ P5 C" H/ f+ s$ d7 f7 x% a& P1 \) [, \, a6 a4 M3 \8 ~
UDP source port
- k" `2 l% {* m" {; V( O5 i, H$ k4 b% q- z; u) V- ~6 G
udp_dst
1 D& R+ t6 ^$ V3 `9 P9 F, i& c8 w4 V1 y3 U# E$ k* j
UDP destination port
6 I3 y* V% H+ K) T2 H/ O
% S. Q; C {1 [1 Q1 AAction
0 R( d3 E* R0 _5 s& c- M5 |3 p! s5 _4 \# i
动作1 O. D& [7 x9 }& i% m
7 |: C2 N# W ?3 W
resubmit4 G u, x) \* U( |7 A5 ~
6 }3 b% c$ d: L1 l
跳转表) T6 x; W0 X1 J h5 m6 ^
. ^1 n3 q4 l0 F V, m. |# Z' L% f* Q7 o
drop4 X4 q/ y! X9 W, s2 t
( f; M$ l5 q# P( G+ s! o丢弃% m" k$ S, Z7 _
p3 D9 S7 [' P8 f# Y. C/ Oload:$local_vlan->NXM_NX_REG0[0..11]
6 ^1 w1 P: B8 f. p
2 O. g$ D9 f( J+ M3 w$ flocal_vlan放在寄存器里) j. P2 x0 y1 |+ w1 Y
u2 d( E" f; R8 M' E/ R6 w
CONTROLLER
5 h' m& ?3 d& y9 d6 ~8 E A
# {7 Q3 j- t+ y# l1 s" o1 O上送控制器
; t0 M) Y1 Z+ `8 o8 u* W5 o7 s0 m5 L0 }" ^
mod_vlan_pcp8 R/ N. R; z4 Q" H5 a
N* V, {5 Z( E0 \
修改vlanpcp/ [3 O; n) N" }8 S/ K
6 a9 }# w i: H: Vmove
" |: U0 i2 R7 ^; z# @0 E/ M" Y
; t/ Q1 _1 V; r4 G8 K将报文的dst设置为src* C X( \2 @4 ~+ i# i
" g+ ~2 V1 A4 E+ Q' B; A) S
mod_dl_src7 ^/ |4 L( g9 b- F& F7 a$ E
9 Z/ o1 R* V6 J! M
修改目的mac
- j! O& K5 c! \- o" U- z
3 _8 U7 M O, N. K0 i/ @load
/ W% ^3 U% o9 K: p9 i+ o0 m
* P3 y# E8 Z( A! {8 i* O% }设置某个报文头部的值
2 O3 z; [9 p4 D0 H0 a; z
" @- e1 N. a, G8 \2 moutput; ^; ^2 `) q( X. ~
* g' J) P1 I5 _
从指定端口发出
' A) u& W0 N; e/ l3 ? c
$ I( Q8 e5 S) K; WIN_PORT
' \# J% }1 b, q. c+ _1 J
, d3 }7 m* X. @. t从入端口发出
3 ~+ l2 f! Y; A* [: [4 ?4 W: W$ ~2 \, j
set_tun_id
1 i, ^, K: _# g5 U+ {7 V e7 G, v" @" [, K! P" O
设置vni+ l$ Y' n$ R* o. y" O4 u2 f
, x0 N' ^5 H2 y- r
2、具备看懂vxlan数据包的能力
6 d9 q8 H- a: N2 P4 f在网络运维中,常常会用到wireshark软件进行数据包的抓取和分析,从而进一步分析网络转发平面的运作机制。在SDN云数据中心的数据平面会用到vxlan隧道封装技术,因此需要了解vxlan的数据封装格式,并能够通过抓取的vxlan数据包进行网络分析。
& S. F" u6 H, I# j+ K9 \0 n
7 @* ^* c& { G$ @以下是wireshark的一个vlan数据包示例。这是一个ICMP(ping)数据包。Ethernet 是以太网封装,src为源mac地址,dst为目的mac地址。Internet是IP层封装,src是源IP地址,dst是目的IP。
7 w7 a* k8 R$ _; f4 e; _9 {' W3 ]' y3 K0 J9 O% c/ `5 A6 e
我们来看一个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.
8 m& J! Z7 ~4 c3 P
. i6 `' k0 G" O( n. {6 O2 u ~" o) D
2 Y ?/ d: d' q$ y* n Z4 j( G二、控制和转发的联动分析, G8 f2 f8 w& u7 s: E
物理服务器上的虚拟交换机是SDN云数据中心较为常用的网络设备。需要特殊说明一下,在不同商业解决方案中,流表内容和用户流量/vxlan映射关系存在一定差异性。下面以一个商用虚拟交换机的流表和数据包为例,抛砖引玉,分析vpc产品的技术实现。! K/ F7 C h$ W) d" P! ~
5 p9 u% S5 ?) f/ l# P8 z9 [
1、同子网虚拟机的流量互访:1 X" e! W+ d1 Q$ ^
: X5 T' Y2 w" r9 E, J; \( i(1)控制平面:分别查看PM1和PM2虚拟交换机的流表。
- k1 ?# ?$ G, BPM1的虚拟交换机有如下流表:, b) Q1 E8 X9 A: R8 v) w5 `
) K" {. ^( ]6 L; r2 s* F( a$ r
Java2 G* h) |7 A9 u& n
0 S; |2 x; f$ y1 F: E
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! _/ f- v$ s( K7 I
13 }* I$ r2 `1 C. a1 u3 S
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$ V) J% d9 p' G" r0 C
这条流表的含义是:流表的匹配字段是“数据包来自虚拟交换机的端口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转发出去”。
4 A0 t+ [9 e! x7 w2 \" o8 W
7 x# {( X: }- @1 I$ i5 EPM2的虚拟交换机有如下流表:) l% l( ]9 ?& X2 K) Q4 w# N
: _6 {8 D% e+ ?4 H4 _/ m
Java
( n) ~: e: d& { w8 }6 p9 R1 w% `
/ W5 O; {+ r. } b" vskb_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:53 O" f2 r" S6 l( K3 z
1
4 Y- M% { K% T$ T" yskb_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, o- L8 L; r1 z1 e$ ?
这条流表的含义是: 流表的匹配字段是“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转发出去”。
7 o# P1 ~% [8 J& h(2)转发平面:分别在PM1和PM2上OVS的tap1和bond1口进行抓包分析,分析“数据包经过虚拟交换机后做了哪些变化”。' ]: R' v# E! t' K3 } h. o
PM1的tap1的数据包格式如下,是vlan格式:
& M+ V( Q8 H. m9 r2 o; G& |. K1 U E: u: r, \& } H
PM1的bond1的数据包格式如下,是vxlan格式:
( ~& L E' t3 f! S9 J! \2 a# \5 S6 z( D6 c/ D! X. H) s
PM2的bond1的数据包格式如下,是vxlan格式:) u" R! g& l8 p( [
7 f4 Q, D; c& [$ ^ APM2的tap1的数据包格式如下,是vlan格式:! p) J+ a. @# P; o# O& ], s. u
& |8 }8 A) D8 F" y8 k: j# a- e# h$ Q通过对上面四个节点的数据包分析,可以得到:PM1的虚拟交换机对来自VM1的数据包进行了vxlan隧道封装,VNI标识是3257333。在underlay交换机上,基于vxlan 的隧道IP地址完成数据包的转发,对隧道里面封装的VM数据包内容处于无感知状态。PM2的虚拟交换机则是相应的完成的vxlan数据包的解封装过程,并将数据包送至VM2。
5 W3 h2 n4 [0 y/ D* A" f
3 _% `: _/ Y. N# H3 @: T# w l& ?: e2、跨子网虚拟机的流量互访
7 f+ ]; f1 G3 @3 w2 {跨子网通信的控制转发联动原理,与同子网场景下的是一致的,只是在流表内容上有一定差异性。跨子网的流量交互涉及到网关联动处理,存在原始数据包的MAC地址转化,同时vxlan隧道封装的VNI也会不同。以PM1的发送端为例,分析如下。! _' z; i% N! h! _1 V
& R/ v$ R2 X% P, z1 s% n( s
PM1上的流表:
! u. k" d B0 f7 t8 U; u$ n4 `
& `! c5 y2 `% Z4 C0 m3 ~Java" \% }; l3 S* g- ?: u, M
0 @: M, | Q) f6 z- ]) iskb_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 B2 H* U' G( @- C
1% z4 H; S% U& |; \- N
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
$ d6 p3 L9 L0 A! V' 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转发出去”。8 W! r2 W: f% [6 B0 _
7 a4 V& b# T. I% j* C! zPM1上bond1的数据包:+ N( g" M0 g! k! X
+ _ ~! u1 l1 v- v+ |+ d从抓包可以看出,VM1的数据包经过虚拟交换机后被封装为vni为3709754的vxlan数据包,与流表的动作集一致。 |
|