|
2 B5 l3 a# y& o) _% z
Radware IPv6链外天窗案例-百度地图外链解决方案(二)来啦!
* g. V3 {% L0 ~" E# [ 百度地图外链解决思路
# z8 I0 a5 O; z: C8 d1 d# | 这个是我们在某证券的IPv6测试中总结出的一个案例,因为这个外链天窗解决的过程和解决的手段都足够复杂,可以为大家提供更多的解决思路。但凡遇到百度地图这种外链的事情,该手册一定会起到相当大的辅助作用。(VS即Virtual Server 虚拟服务)
: d0 s; O. ` A. L0 {& g 先看基础的配置:
6 R/ y, k) R, n; T
( u! d! f9 t# |& H + I' i1 n3 N. k& I, B
, M8 g8 v: E! L& b% x) a 主站VS——v6 转 v4
- G2 t" O1 v5 x- R/ j0 ` /c/slb/virt ipv6
* f& W% t! v% F3 c ena
7 n8 J0 S/ @3 H3 e; \2 C$ G ipver v6 ! z f7 F# \9 v& h1 K6 t
vip 240e:644:100:0:0:0:0:7
- m H% g' F, m2 ~/ S rtsrcmac ena
2 p; \* {3 e2 T4 K x dname "inherit"
5 E3 z& O9 V. ?5 F: e wanlink "ipv6"
) q$ F0 ~0 r4 r4 i type wizard
/ ~% ]1 b* c& p0 n, D8 _5 _ /c/slb/virt ipv6/service 8088 http
" C) ?1 `4 C- J; C9 R) H1 v; L group test 2 H' k# B6 p& s E
rport 80
; A5 u6 u& A7 o5 k dbind forceproxy
3 j4 r) r @3 _5 { /c/slb/virt ipv6/service 8088 http/pip
+ p- d6 s$ H6 @; G mode address
( ~: l8 a1 N, p8 F* }. A addr v4 58.56.105.10 255.255.255.255 persist disable 2 C8 n9 ^ f9 h N/ [. i; ]# v
/c/slb/gslb/network 100
$ @1 g U: R' I+ Z1 E ena
. A3 M I6 _4 Z ipver v6
6 w9 Y+ J6 R7 A- K' ~" F sip 0:0:0:0:0:0:0:0 0 i8 N6 v& K! ?3 m; u! X8 W/ b
addvirt ipv6 65535 ) w/ C9 W h2 X8 I: W, l
/c/slb/gslb/rule 100
, R u$ z& Q% [5 X: M- ]) W) p ena ) Y5 q# g* D% |9 }
type inbound-llb 8088
1 |/ f. E& W) W4 _7 ^; H; | ttl 0 ( \8 o( u" k* Y* f" A- g
rr 1
' r @: z7 d. w$ c) P6 L dname "www.easysino.com" # p% _, k& H% c3 B: a8 j# d
/c/slb/gslb/rule 100/metric 1
: U2 o6 c2 d5 b' Q6 J" L gmetric network , e4 k7 M( b$ B& F8 I2 G2 k
addnet 100
- P# L, a0 Z% i8 l. _ /c/slb/gslb/rule 100/metric 2
. H8 n$ O9 p' H$ w: Z gmetric proximity
; q9 P# \; H# d, F& J V /c/slb/gslb/rule 100/metric 3 . b/ x! Q0 |' I6 E: \, \: c
gmetric bandwidth
0 {+ x% ?9 S0 O
/ k& E' V7 n' B9 ~
6 K$ y4 N" E% f& x* L/ h' p- M * B% J9 a% D: Q/ i
这个是主页的地址(240e:644:100:0:0:0:0:7)和解析(www.easysino.com),这个主页中的某个子页面下有一处外链了百度地图(api.map.baidu.com)(VS即Virtual Server) 3 [6 S& ~- b. y( U3 U7 D1 U
创建修改策略,关联主站VS 7 X$ z9 Y- H" \, J
4 P0 a7 F( [% b
- Z; s/ _9 U3 n" C
$ E/ |0 l! z2 v* u& B
; v8 s* c4 p/ A* V; h
创建修改外链的策略
" B K% M7 L- S% D; ? /c/slb/layer7/httpmod 1
% h1 V0 h2 e0 ~2 H% s- t4 N7 O ena ! K4 M5 N# u# J: g
/c/slb/layer7/httpmod 1/rule 2 text - H/ |. S' l. ?0 E$ |$ |5 B
ena ) R. @3 ]1 m" s: _
body include * W% F2 z& e6 s% p
action remove "TEXT=Accept-Encoding: gzip, deflate"
7 N/ ]4 X4 b* B6 K9 d /c/slb/layer7/httpmod 1/rule 3 text , j& r# F" D3 L+ O7 n7 a1 o1 b
ena & i# U3 K9 I- C% N: S
directn resp
& ]8 X; L4 v1 ~& \# {. j0 @& X: l body include ! v' l2 K9 |* [$ e5 z
action replace "FROMTEXT=http://api.map.baidu.com" "TOTEXT=http://map.95538.cn:8088" 4 }# U3 |5 y+ r8 I
将 httpmod 关联至主站VS . v- A3 m$ J( D
/c/slb/virt ipv6/service 8088 http/http ' b! O( T) X7 O& {! h
httpmod 1 - b5 l R2 M0 Z+ H; t0 {
! u/ l- e- x' k
$ b t0 P1 A( M; b4 i8 P
9 b4 k* c* x/ k; P
该策略使得主站可以返回修改后的域名,客户端请求到该域名就相当于请求到链路负载上的某个VS,即外链VS。 ) ^, I- b1 ?! d
2.1.是基于域名的外链- [' m8 U* S6 _
然后我们还要创建外链VS,以及外链VS的解析(map.95538.cn) 6 I) v' s) v! o' D L5 a; i
(通过Alteon自身去ping api.map.baidu.com得到外链的地址,real及group部分的配置不再展示) ( W( ?$ S7 F* v1 j% n, v" D
: i4 _6 C5 c" Z7 E7 I- e
4 b8 P& k! l. a d; d& b
/ Y6 E& r @* @8 N0 z5 W% f 外链VS——v6 转 v4 $ g4 `3 N0 _. O' j: M# r( j
/c/slb/virt baidu_map_api + ^. u/ M1 j! D( N9 _, R# Z
ena
# U& \- s$ U, D; L, V8 ]* q ipver v6 4 a: r0 ^ x; W* R' i* F6 Q+ X
vip 240e:644:100:0:0:0:0:16
# {) G/ J( y; m& [: Y rtsrcmac ena
' N8 i# E( R( q# X9 ] dname "inherit" # ~/ l1 _- V. z
wanlink "ipv6" , p% m) c: \: E' _
/c/slb/virt baidu_map_api/service 8088 http / L6 j* @4 N( ^- S- a; e1 w' n7 c
group baidu_map_api ( w8 S. u1 D0 p* |' Q
rport 80 6 y E: u6 Y5 O0 p" g! `" w3 e) S. L
dbind forceproxy
: M( u; i$ x' _9 R /c/slb/virt baidu_map_api/service 8088 http/pip 5 j# o- F0 T2 a- M: p
mode address 4 m1 g0 n, O' ?8 S6 F
addr v4 58.56.105.10 255.255.255.255 persist disable
9 F& {5 E: d* Z /c/slb/gslb/network 110
/ C4 f! d$ e1 H( n ena
5 u) h# _7 J$ U" ~5 a ipver v6 # f& e8 S& K7 H L3 m5 G
sip 0:0:0:0:0:0:0:0
4 n7 X' c9 }. C: f; b# K addvirt baidu_map_api 65535 ( d/ J; J6 ]6 a" [. ?
/c/slb/gslb/rule 110
* [7 J' R( W l ena 3 p8 B# C$ v( J
type inbound-llb 8088
5 z$ Z7 P. l4 M' @5 ~ ttl 0 - d. b3 w# j- b- u
rr 1
4 T0 q! i( o6 d9 ? dname "map.95538.cn"
0 O5 P, m, W* u/ F1 C$ s l /c/slb/gslb/rule 110/metric 1 ' G5 y: I- T; P2 n, t
gmetric network
4 ]7 `0 _; X2 M9 p9 | addnet 110 . n( m9 Y. }5 V' o# T# |
/c/slb/gslb/rule 110/metric 2 8 Y$ m" v& @0 g; i
gmetric proximity
, G; |2 p& y0 o+ l, W+ o. e /c/slb/gslb/rule 110/metric 3 ' i1 l; g9 v* P: X
gmetric bandwidth
1 I7 {" f3 L% F5 a# ~ : H4 y# n7 C' m
6 E5 d, P8 Z8 d g
9 B) T7 ? `8 R' R7 E" D3 F+ `1 C7 w 请求该外链当然还需要修改request请求头中HOST的值,否则百度地图API会返回503。
8 y9 p% T. B; R0 q ! I3 z( u. Z3 i* L+ P4 ^0 x( h5 T
8 c D4 R! u+ ?5 O0 _1 h. G1 T7 O0 | : [. b" x9 t( A! s5 v C* I7 v) l( P
创建修改HOST的策略 * O1 Y4 t* c l5 M' [3 [5 R
/c/slb/layer7/httpmod 2
. W" v9 [2 Q" N p7 A ena " D' }# Z6 p5 n. [5 b8 k+ D
/c/slb/layer7/httpmod 2/rule 2 text
3 h0 G8 ?6 M+ o9 }' u ena
7 N; g4 h" B7 W, H& g action replace "FROMTEXT=map.95538.cn:8088" "TOTEXT=api.map.baidu.com" 9 \2 ~5 x' t* e5 e" N
将修改HOST的 httpmod 策略关联至外链VS : w: T2 O' ~, o4 Z' F
/c/slb/virt baidu_map_api/service 8088 http/http + _. f- i8 ]9 u! n. L& b+ ?4 M
httpmod 2
* O! G5 L' v) _& w 8 n: }/ y5 u7 l
0 h% B6 w" s: M" i8 z 7 H# u+ ~7 n8 P* s
正常情况的外链到这一步基本就结束了,但是,百度地图API的外链才算是刚刚开始。 + n/ L6 i; n, e4 g! A: g
2.2.外链返回的外链2 C- r4 \/ D) I9 m/ l- ?& X0 q
百度地图API的这个外链,并没有将地图信息回传给我们,而是又返回了两个外链,当然同样是(api.map.baidu.com),只是uri信息不同。 9 i4 H# i: \! Y3 X3 J' Z
v: T! m5 l* J 上图展示的是原网站的信息,而实际的情况除了第一条被修改成了(map.95538.cn:8088),后面两条还是(api.map.baidu.com)。当时的抓包信息: 1 Z3 b! H9 t& N& K3 {
( [0 b* @) B) i0 y7 z6 U1 h# I
我们的modification没有将后续的(api.map.baidu.com)进行修改?而且通过这个包我们还可以看到respond信息中还有一条Set-Cookie……
# p" t5 K; [6 m) G3 n 针对外链回传的外链没有被修改的问题,我们通过httpmod进行了各种尝试,包括将text修改成url,包括将相同的text创建两条,均没有任何效果。
& f6 j* `* P: v3 W" u; A 2.2.1. http modification性能的不足和异常
0 B. l: d. b, ]: y. S' g 性能不足:无法对外链返回的外链进行修改
' i' V% A4 ~" e# S; R3 a 异常:http modification修改request后,会使得request发生两次,导致服务器间歇性返回 400 bad request。 7 `; o# p! }8 A3 t9 p" p+ Y! |
1 K3 Z5 }* y5 r
我不是太确定产生两次GET的原因是modification本身的缺陷,还是跟Alteon软件版本有关,可以确定的是,这种情况在31.0.6的时候是没有的。而且,如果不把客户端request请求头中“Accept-Encoding:gzip, deflate”删掉,这种情况是不会出现的。
+ ~# I( j# f8 f$ @ 但因为400 Bad Request,并非只发生在此处,而是但凡关联了httpmod 的VS都会有这种现象发生,而且频率非常高,造成了非常差的体验感。
& i( W% o1 d: d+ ?3 w 2.2.2. 使用as++替换http modification 解决性能不足和异常
- h# I8 P8 j- K' P D, j( r' u 抱着侥幸的心理,我们使用as++将modification 策略替换掉了 ( x0 [& O& @. [' s" B5 R
) I; ]! c0 Z; p, J
4 k: S! |/ y6 ? c' h; f 4 o4 O+ w, B) r! L3 u* B
主站VS下的as++ " k# F9 ^( ?# Z, o7 m( _
(CLIENT_DATA相当于HTTP_REQUEST)
7 K P9 R. z) R+ }( p7 _ (SERVER_DATA相当于HTTP_RESPOND和HTTP_RESPOND_DATA) ' L7 E* f2 R3 P6 k
/c/slb/appshape/script http_body_ipv6
+ Z4 A- r; d' ~. n5 O ena 4 s. J1 |3 u8 K' i: ]2 C1 h
import text
* _9 P( m5 C& _+ z- l( V when CLIENT_ACCEPTED { 1 u9 I h3 J' _3 P5 i2 Y; |
TCP::collect
$ n) X$ }0 j0 ^) ^1 f0 r }
4 _+ x2 M, f" O7 J( s when CLIENT_DATA {
5 b) \7 {' `7 S+ n6 I- Q8 R set re_gzip "Accept-Encoding: gzip, deflate" ) G: ~6 S7 F2 F0 ~" K
set re_null " " . Q/ Q. A/ t$ ]7 D) X
set j [TCP::payload find $re_gzip] 4 S9 k( x$ Q: A8 h D
if { $j != -1 } { ' E. i- g* u/ L% B4 m
TCP::payload replace $j 30 $re_null _* d- [; S2 B5 b/ j; n& r7 p9 i
} & O0 O0 I5 z2 w6 h6 C5 u: r: T( w) ~
TCP::release # Y+ l% Z* J% l1 z: X; M/ \7 x
TCP::collect * X1 ]& g" q% N; G7 W) J; ^5 Q
} . h1 ~' b$ {5 d q; ], E
when SERVER_CONNECTED { 5 q1 q- y6 F, g* j3 h9 G3 w+ i
TCP::collect & ~4 A2 Q' ]: [
} & G6 ~; ]5 p0 U, s$ y4 K
when SERVER_DATA {
* p' y$ u/ b1 R set map_baidu "api.map.baidu.com" : G2 f: b# N5 q) S5 a/ C3 }
set change_data "map.95538.cn:8088" ' I. V% `. j8 Z' I) x/ ~: s
foreach start_str [TCP::payload find_all $map_baidu] {
4 }& n9 k# F. \+ }# ^ TCP::payload replace $start_str 17 $change_data ) q F6 @) z$ ?* f* O4 ?$ u
} 2 ^5 R7 V& p# y- s4 Z
TCP::release
0 Z; J. \" ^/ Q" b: J; K; V TCP::collect
3 p) }5 u8 f& U" Q7 G0 w) I- _! S }
p8 r" l5 d8 p" j9 c -----END
$ a$ \, ~4 H% U; z* X( r" t 外链VS下的as++ . N" s/ @' Y2 L) r. S
/c/slb/appshape/script http_body ( k0 e+ _5 N F2 c' y9 r9 T$ B
ena
, a `; k4 a9 o6 O import text $ `! E2 e8 u& o9 Y% ~
when CLIENT_ACCEPTED { 6 ^& s$ T5 l3 l3 l7 P
TCP::collect
( m# Z1 J6 i' _3 q9 r }
4 c6 R; C) o" K" c. V) L, s when CLIENT_DATA { & z' U+ S3 K8 c3 J3 Z4 M
set old_host "map.95538.cn:8088" ; m+ o# F2 i$ I7 B# B$ N9 A8 N
set new_host "api.map.baidu.com" - ]8 g2 Y% B. |8 ]" s, M
set i [TCP::payload find $old_host]
# v( S8 F7 T! @3 m4 q7 s2 M if { $i != -1 } { ( G- t3 x- v9 q+ `7 a8 Q6 n2 K* J
TCP::payload replace $i 17 $new_host ; K+ U7 e2 ?9 K1 z5 @( A6 u; Q
} ' X; Z5 X8 S" q, F6 M. N& V
set re_gzip "Accept-Encoding: gzip, deflate"
7 K& u( @8 ]* _$ {/ m/ x4 U) X4 A- s set re_null " " 0 h- O0 m5 e2 _: u3 _4 m( w
set j [TCP::payload find $re_gzip]
/ {; M; i8 B' B, ~2 M) H: m if { $j != -1 } {
. {4 j0 h6 B/ K' _/ p TCP::payload replace $j 30 $re_null
6 z! s2 ?1 g6 F7 ` } 7 ^, ^2 O9 V; y* o7 ]
TCP::release
- b9 B- `& m- L5 e1 T1 m TCP::collect W5 j4 |1 l* L! V
} , c: _# y/ h5 u; a
when SERVER_CONNECTED {
1 L' c0 R' n6 {) B& A TCP::collect 8 ]. P# M3 [1 \% M
}
5 T; O# T) w, J$ ^+ A when SERVER_DATA { ' Q" k. x: T. }& t2 U( W: [
set map_baidu "api.map.baidu.com" $ y' ]" L- A; d8 k$ Z3 ?5 z
set change_data "map.95538.cn:8088" 0 e" A( A! g, W+ E
foreach start_str [TCP::payload find_all $map_baidu] {
/ A: x: y0 v0 ^ [ k( a2 p TCP::payload replace $start_str 17 $change_data * W" D% y5 v5 I+ \1 G( y! l
} $ c1 m) Q, `' p) w( l
TCP::release
/ K( F. o: `# ~% T4 U1 Q. x TCP::collect
" Q' i5 ^2 l! N, X } 3 P- T7 M. o) {. z$ a# ^* _6 }; ?" O
-----END
) Z4 s# q* v# S9 G; r! a
5 s0 P& C1 T T& a9 E7 c
9 j& n8 v6 {0 r: X
% g' ~* W4 K' T# q" ~. W 测试证明,http modification 与 as++并不一样,至少能力差很多。
$ t7 k6 d/ }+ N
: S- |6 z7 N* _, {! X* ^& M9 A& } " ?; N4 J( ?, h1 J7 H3 A
, p9 Y% c0 K$ y- d |/ G
set map_baidu "api.map.baidu.com"
5 Q9 U# R) G1 ~7 r2 j- Z set change_data "map.95538.cn:8088" + h& l# F( b7 P D9 E1 P3 I
foreach start_str [TCP::payload find_all $map_baidu] {
# k2 p8 x) ?" q! u" V# O! f! `/ A TCP::payload replace $start_str 17 $change_data
. E: t9 J5 i' g s7 ]! C P+ X1 d } $ s! b" t0 J( g/ N' M
8 n6 H5 }" ?, e7 M
) @; [7 [4 Z' |# _% s- E6 H5 U: y5 V . N) L6 n7 c- M U" e# L$ \. J
(api.map.baidu.com)都完全修改掉了,不止刚刚看到的那两处。
9 r' E$ z$ g) V) L 经过这样的修改之后,再次抓包发现,我们请求到了更多的信息,但遗憾的是,百度地图依然不显示。对比正常能请求到地图的包发现,正常的数据包从请求第一个(api.map.baidu.com)开始,余下的session全是在同一个会话当中。而请求不到地图,但确实返回了大量信息的包中,我们发现每个session都是一个独立的会话。 1 T- H! x# p& E; C- b
- j7 U/ ?" d% I* v
我们猜测,这可能与会话保持有关,我们通过v6请求过去,百度地图API返回了Set-Cookie之后,我们后续的请求,会自动丢弃百度API返回的Cookie,而且很显然,我们每次请求都发往了不同的百度地图服务器。 : w; n3 _- [7 A! j
2.3.外链有基于cookie的会话保持
% z- P% {! Z o1 j* W' J- T 我们尝试了insert,passive,rewrite各种方式,企图将Cookie插入,甚至,我们都用上了手动插入,就是用as++写入一条静态的,百度地图API返回过来的Cookie,完全没有任何效果。
$ O3 n3 E$ q: c7 V' P$ @ 观察一下这个Cookie吧,这个Cookie中包含了很多信息,我做了一个这样的猜想,会不会是因为这些信息中的某一条导致了客户认为这个set-cookie是不安全,不合法的呢。比如“domain=.baidu.com”,仅仅只是一种猜测,不过没有别的办法还是可以尝试一下。于是,通过as++在respond方向,将多余的cookie信息remove掉。 1 Y9 w, H C0 P
' J4 l/ n& t' e |% j/ [
( z1 r1 s) Y% Q5 Z, ~
7 h4 f+ O: [) P* }
set fg_ex "FG=1; expires="
, \4 a" e5 T8 I6 j9 ` set fg "FG=1"
) N H Z2 X( r set i [TCP::payload find $fg_ex]
# q7 m" K9 u& \4 Q* M if { $i != -1 } { 8 ^* S9 n4 L- ~* y9 G" j
TCP::payload replace $i 97 $fg ; O6 ~/ }3 r: w& n% X1 F7 g
}
4 R s6 ~* A; N% z 1 x" v9 {- y# {
! ~: S. m$ w( R; m
( w* ?/ Q+ R2 N/ D5 r7 s/ R% a 在外链VS中SERVER_DATA中添加了这么一段。将FG=1;后面的内容全部移除。
7 R: Z Z' B% r7 _- p 然后,激动人心的事情发生了。刷新页面后,百度的地图的一些控制缩放的原件出现了,而地图也在反复的缩放过程中,似有似无的出现。 / a( t' z* u' t% f$ C8 I
6 k) w+ w1 b2 ]1 z& S, B9 |& U
/ p. y1 X$ M- F4 I" P 当出现这个结果时,我几乎都认为,这恐怕就是最好的结果了。
9 w/ b1 J4 L5 d) ~4 f6 R" e" A 可惜,依旧经不起考验,这种奇迹,就只出现了一次,清空浏览器缓存,再次刷新,地图再没出现过。 & z; T- G$ u8 b( G0 s3 W
此项问题该如何解决呢?限于篇幅原因,请大家期待下一章节,Radware IPv6链外天窗案例-百度地图外链解决方案(三) - G( `, b3 Q) U$ t. A
, b) q+ `8 o: f7 h2 F6 y; ], U
" [( r+ S9 G, ~- B7 ]4 N; y
: j! ^+ @0 h, W! p% K. i7 l |