|
|
一、必须掌握的基础知识
# q# @$ R' c/ \# M" g. ^# ?1、具备看懂流表的能力
3 g! U: f& ~# k# t5 aOpenFlow流表是常用的SDN云数据中心转发依据。要搞明白控制转发机制,首先就得具备读懂流表的能力。流表由很多个流表项组成,每个流表项就是一个转发规则。每个流表项由匹配字段、优先级、计数器、指令、超时、cookie这六部分组成。流表项中关键的两个内容是匹配字段和指令。匹配字段包括inport、报文的12元组信息等。指令是用来描述OpenFlow的处理方式,修改数据包的行动集或触发流表的流水线处理。流表的匹配原则是“table0—table255”,优先从table0开始匹配。同一table内部按照优先级匹配,优先级高优先匹配。需要特殊说明一下,不同商业解决方案的流表格式存在一定差异性,但是本质上都是一致的。抓住流表的六要素和流表匹配原则,就能读懂并理解不同厂家的流表。
* P3 Z. d' g% {9 q }
% S$ R# p$ j* _1 z/ C以某商业解决方案的两个流表项为例,说明下流表的含义:
( _" d, y6 w. y: v8 X. Q8 R/ d {( U
" }* {2 {+ `+ o2 f, t+ u- u' ]Java% r0 h# i6 m* L/ f
4 `- N. H6 z& x+ {0 z# w" t; wcookie=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
+ D7 _- q9 y" d$ L' f1( D5 N/ i' ]: e' V
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" ?9 l" p& r. E/ n1 {, d. t
这是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端口转发数据包”。
* O! { a8 l$ I% n$ h! C5 Z( Z: G" k% A% D3 R- {& w w
Java
' V9 X! \. q1 X) u+ T3 x' \' F5 S R3 z' a4 `5 l
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 o( E+ \% D( D! f( K9 k
1; k6 W" K' N& s; P# ^8 T6 J
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
- b! V+ D( n/ M& t# S: e) z这是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端口转发数据包”。
- N$ S* Q7 R0 ]6 h5 ^! f+ W5 E7 t X* t3 e
下面给出了常见的匹配字段和动作,供参考。3 \3 \% e( i9 E2 l
" ^" W9 }/ X7 L: \, d, {Match field
& Z. L% \4 W1 q2 r8 I( x4 Z9 M
; e1 X0 x; b3 q7 O' x0 _6 h说明
5 r! C8 h, _& ~& L' J# Z' J6 d
+ k; @6 v; ^* l, f% D2 W7 Q$ l* pin_port
* D4 R$ k8 U. s a- @
2 U! }& M4 {& V+ ^& bSwitch input port
7 N' D7 r# n: Y) F4 D
" S$ B0 X* e+ v% ]% bdl_dst8 Q9 }; c; _( p+ X
0 M5 p* I1 B2 r) Z1 w/ ?# W8 KEthernet destination address: m$ q( _9 C2 _# l2 B
& c. ?' ?1 T! [+ D! |
dl_src* ~& `# J/ n$ N4 a) z
+ V( @% Z: o- r' i
Ethernet source address5 N' W4 {( i* x0 C G0 W( {8 e
$ c! P) }" G& E$ T' p( Y% U2 g R$ ]5 c
dl_vlan
' Q/ ~* W# c" z6 B% n: {% C* H8 z; i
?! {4 c8 W6 h3 _8 P1 e0 FVLAN id0 R" g" R. K( j( j1 w( z
8 A5 F" e4 _. E* @9 L. L/ unw_src
& V* {, i- u) B) } n+ w6 P* S" S* X8 z, {% Y- r; Q1 Y) b
IPv4 source address8 |+ o8 u* i5 ~
% ^6 g- N: ^6 u6 }5 V3 f( {4 ~nw_dst
/ C2 r, T a1 m, O3 s# @2 m O: B/ R
IPv4 destination address
; C: [8 b$ [; y" s
% V( {6 V' y5 P4 |$ Mtcp_src+ T) N, _ [2 d& D
$ }6 c& ~; s9 a8 }5 |! ?4 ]" Q' ]0 zTCP source port
1 e- _ _% R; J- V
# q% Y* _! g S# b! K Etcp_dst
9 Z! n) ~0 l3 l8 d
4 D/ I0 V4 w" N" q \" u( HTCP destination port) u( L* m: O; t
w! k' q% E& ]3 J. w+ ?, J! l
udp_src
; g# _$ x4 z1 A) T% [) g( N( E+ N y7 T' P: W3 y+ b* q4 M
UDP source port
7 E0 ` L* f% L5 a$ t7 A" V- Y0 ~& u
udp_dst
' g1 X4 P8 B) F4 P* Q0 c S- }! h& N/ H8 e
UDP destination port* Z8 E! F7 N4 o4 ]# `
6 x& }$ M! Y4 Q& K3 gAction
# L$ Y$ d- V. w1 B- u( j; L% A/ C+ e* H% r: R: ^* f3 P; J
动作, q' x" I4 c0 r- X- }2 l
/ u% s5 f, L" y5 z' E, |
resubmit
9 b- R4 h* E6 D; M/ G: s% ^' J6 k$ _2 F/ K# C
跳转表0 g, ~$ `& L, `6 E; x" D5 Z! C* s
3 g& w: L8 L: `/ i' k" Sdrop
1 T. R# p* ?/ p1 Q( l! T8 g$ P# \) J F& v
丢弃. r) b( O, q1 o* K- ] V
% [( M0 J9 T4 B# E7 h6 Pload:$local_vlan->NXM_NX_REG0[0..11]
9 s. w5 p1 p, S- e% ~" Y! e: p0 e0 D) w3 j7 M- w
local_vlan放在寄存器里
4 y) i! f2 w. o8 y4 O2 S' c$ F9 s8 O
CONTROLLER- A% K$ o' ?" u
% F& [. E4 D, ?" Y) B, e0 P
上送控制器. {8 y) ~5 Y' `9 b8 c* R
& F) o+ U* K0 z0 ~2 `& vmod_vlan_pcp" t. E% ^ G6 s9 _' W% |& C8 e& Q
: u( D0 m! e+ W. {1 z& s8 w修改vlanpcp
$ P+ j. _: R6 `# d( F. d* y+ H
K9 ~( L9 K" \/ }& kmove2 o T ]+ Z& b6 ~# ]! y6 F! o
6 e& Q" \8 z$ L! H: a
将报文的dst设置为src( [) {1 k( `; _2 @/ G
7 h" n7 V% u6 J/ M" C& Z
mod_dl_src: a" F) I' Q) V$ L/ O
+ q. ~& Z) ~+ F$ j& G6 q. g# x修改目的mac
; z9 x! w: U$ e$ j3 J: S, G+ l: G" G6 f
load
" y) ]; Y3 x2 K4 @. M% N
8 t, k9 U. [9 L5 I设置某个报文头部的值
' X& h/ u, F9 i; e+ P# u8 Y5 I3 J5 N1 Z; m, ~
output5 S( ~' h( `1 G9 ~- r1 w
' I9 T2 ~; B: c( n% l# s" _1 ?从指定端口发出/ q3 J2 a0 R, `# @. \0 B" H' A
2 ~. ?. m* _ L; y7 P8 d: d, ^9 LIN_PORT& c( Y9 @3 P6 k6 W& C
" I. q+ m( `) l% t$ f7 x5 F从入端口发出7 h- r4 L6 H0 k2 L2 q
8 V( H6 p7 v h8 R4 G' W. }set_tun_id
5 ?1 V) u1 d$ K7 ^2 z! {, m6 x- C, H' U" d
设置vni9 p }7 v) A/ ]
5 u- L- C8 s2 T5 q8 v" }2、具备看懂vxlan数据包的能力: h* U: s E4 ?
在网络运维中,常常会用到wireshark软件进行数据包的抓取和分析,从而进一步分析网络转发平面的运作机制。在SDN云数据中心的数据平面会用到vxlan隧道封装技术,因此需要了解vxlan的数据封装格式,并能够通过抓取的vxlan数据包进行网络分析。, p4 V6 Q4 g& h: \
0 @# q* e; z1 S1 n6 ?/ i以下是wireshark的一个vlan数据包示例。这是一个ICMP(ping)数据包。Ethernet 是以太网封装,src为源mac地址,dst为目的mac地址。Internet是IP层封装,src是源IP地址,dst是目的IP。: q8 V, i) l8 v
. n- x& [5 X8 g8 T( }
我们来看一个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.
& `5 I" C" I& F! J, `0 r% |3 H2 R' f
0 P2 z4 d% h( m$ m5 |. K二、控制和转发的联动分析2 a: y! p5 U5 |2 } ?2 J
物理服务器上的虚拟交换机是SDN云数据中心较为常用的网络设备。需要特殊说明一下,在不同商业解决方案中,流表内容和用户流量/vxlan映射关系存在一定差异性。下面以一个商用虚拟交换机的流表和数据包为例,抛砖引玉,分析vpc产品的技术实现。" P9 V: G6 r: L, S$ B
8 Z( {1 C+ U( B6 I4 B
1、同子网虚拟机的流量互访:+ _0 ^* n3 z' Q. O! N* V
6 M# c+ ^- N9 q; p4 u(1)控制平面:分别查看PM1和PM2虚拟交换机的流表。- u. O j1 M- n; w" _+ L i+ M# Z
PM1的虚拟交换机有如下流表:9 i* e" x- e: F5 b
9 O5 b) \8 R' a# O5 j, m
Java
+ _, H) Y4 c) t* M" z! ?
! P q. u8 F: m! c) h$ @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) {- s( M+ V% x$ \2 L
1
: r7 `0 o m2 |: j/ m) a3 @" |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
9 ^! c9 L! j% O( \3 _3 [- {这条流表的含义是:流表的匹配字段是“数据包来自虚拟交换机的端口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转发出去”。
/ M; n# I2 D% N, ~8 C8 H; N( n
; R& X$ H5 Z: J, m. {PM2的虚拟交换机有如下流表:
1 U2 U3 m, T; l$ {$ q8 i) v0 \
6 Y* `! x/ _% d4 hJava1 A8 M( o$ O: @ M; Z3 K. e
( R* h1 Z* a4 I4 S4 Dskb_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
0 G, ?, n$ x7 z! U1
' L' _2 ]9 V+ l) |3 h C1 Y6 |8 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:5# ?8 q G1 F% v9 B
这条流表的含义是: 流表的匹配字段是“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转发出去”。4 o+ \+ u" T$ y2 E1 b G4 d# A
(2)转发平面:分别在PM1和PM2上OVS的tap1和bond1口进行抓包分析,分析“数据包经过虚拟交换机后做了哪些变化”。
3 _7 a# p0 `4 T. J w. h1 u0 x0 H1 RPM1的tap1的数据包格式如下,是vlan格式:
3 d2 }, X: M+ |
2 k( e+ y+ }% i5 fPM1的bond1的数据包格式如下,是vxlan格式:
" t# g# [' p9 E) u* A- V8 U0 o! p* R/ n ^. \) ^; O' R# r9 C1 R3 h. d
PM2的bond1的数据包格式如下,是vxlan格式:
% f9 \5 M A: R( P( n3 J1 m# u, `+ F+ f+ k% t! m7 X/ C
PM2的tap1的数据包格式如下,是vlan格式:+ e U ^8 X; e, f$ X$ b
7 B! B% |( T( I通过对上面四个节点的数据包分析,可以得到:PM1的虚拟交换机对来自VM1的数据包进行了vxlan隧道封装,VNI标识是3257333。在underlay交换机上,基于vxlan 的隧道IP地址完成数据包的转发,对隧道里面封装的VM数据包内容处于无感知状态。PM2的虚拟交换机则是相应的完成的vxlan数据包的解封装过程,并将数据包送至VM2。4 D. B" U2 W+ w3 n9 r
9 D* ~/ |8 h5 l/ e, F: M8 A1 q0 m2、跨子网虚拟机的流量互访
/ {/ c6 o" W; ]- W( C8 {跨子网通信的控制转发联动原理,与同子网场景下的是一致的,只是在流表内容上有一定差异性。跨子网的流量交互涉及到网关联动处理,存在原始数据包的MAC地址转化,同时vxlan隧道封装的VNI也会不同。以PM1的发送端为例,分析如下。% f" ]- m% G9 o1 | i
# `5 K0 I+ U, h$ TPM1上的流表:
3 w& @( u. K9 g' D/ L9 y5 l& `7 L
3 X! z/ x/ {5 S* @! V- U6 oJava* L# r, @7 I$ n8 U; e
) m$ \7 o/ ^7 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
' u) [2 M) D9 Z2 u: D12 Z# k$ [" N Z7 `: Q! r
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* q" U4 ~; n% j; b& [& h- K# r
这条流表的含义是: 流表的匹配字段是“数据包来自虚拟交换机的端口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转发出去”。
E* C4 w, R' B0 z @
4 A4 V v, z2 cPM1上bond1的数据包:
4 Z/ F ?- x) L, k% B3 j! |9 |* K+ k8 A0 X2 g. ^
从抓包可以看出,VM1的数据包经过虚拟交换机后被封装为vni为3709754的vxlan数据包,与流表的动作集一致。 |
|