|
) ]& P2 Y) w( L2 s& b& z- \9 u; H
Radware IPv6链外天窗案例-百度地图外链解决方案(二)来啦! ' @& f0 ]7 Q2 a( B8 {
百度地图外链解决思路- k, F& [! T% m
这个是我们在某证券的IPv6测试中总结出的一个案例,因为这个外链天窗解决的过程和解决的手段都足够复杂,可以为大家提供更多的解决思路。但凡遇到百度地图这种外链的事情,该手册一定会起到相当大的辅助作用。(VS即Virtual Server 虚拟服务) : ?9 p/ @. M4 R3 p
先看基础的配置:
, P' a3 [" O8 X) Z' I% { 0 m% g' p+ [, ^0 t
$ P$ N1 B; a8 b8 Z' A& d $ X1 l; t5 f' R" X" n
主站VS——v6 转 v4
% u6 f+ t5 E& D /c/slb/virt ipv6 1 B4 b& B- p. m6 `
ena
/ r9 G! b8 \& F$ S1 r ipver v6
+ f: N( K5 M2 T | vip 240e:644:100:0:0:0:0:7
/ Z1 d0 x" c, ~ rtsrcmac ena
5 t" X' o1 Y# r& p* m& u% I dname "inherit"
1 X5 m. \4 z+ s% c wanlink "ipv6"
6 ?8 ~* ?2 M+ D type wizard
2 |; s, \/ ?& H0 [0 Z ~$ r0 E /c/slb/virt ipv6/service 8088 http
1 g9 g7 A: ~* O1 }5 J- ]) ` group test : l' s! w2 F, n- H2 c8 K6 g
rport 80 2 J. W- c H/ D' C2 u/ ~! X+ l
dbind forceproxy
; G% @* h4 y" [" g3 J# h& _ /c/slb/virt ipv6/service 8088 http/pip ; u4 N- t- C( c2 g8 W
mode address
9 r3 x {. S. Y2 A2 R6 ~8 K* P addr v4 58.56.105.10 255.255.255.255 persist disable ! q( A0 i. G5 {4 ~
/c/slb/gslb/network 100
% g4 V0 Y; W, c& x. f& w* s& r) X+ W ena
4 E! T0 v! ~) w' g ipver v6 6 T; K u9 }1 Z# _ {
sip 0:0:0:0:0:0:0:0
& K) l: @# A8 Y- H' Y% X addvirt ipv6 65535 ; o$ a) Y/ c5 B0 W! c! H
/c/slb/gslb/rule 100
& R4 o& _" ?4 Z% c( a, \! I% q9 ]6 ^5 u ena * j9 T+ @6 h2 X3 i; `! z- ^- ?5 W3 T
type inbound-llb 8088
$ C& s. F3 G. H, p/ @- ~% \8 k, p2 o ttl 0
0 _+ V0 |( I: ~1 I rr 1
% O3 K1 N9 s0 O) D dname "www.easysino.com"
% p7 v, R& z) f5 ?6 r /c/slb/gslb/rule 100/metric 1 # f1 [; f5 d) r+ o9 M! \" M
gmetric network
, i* J/ t" Z! G* x" E' ` addnet 100 0 }& `1 x1 p+ n* O+ d A3 g5 [' w. J
/c/slb/gslb/rule 100/metric 2 p" L7 @$ c/ {
gmetric proximity & z; F1 i' q9 m
/c/slb/gslb/rule 100/metric 3 5 R# B% n- K' {
gmetric bandwidth 7 h. g$ q6 }- y3 K
7 x% s" V' m/ E* r$ D$ O 4 f2 T7 c3 a* w
' ?$ L/ I K3 \' S9 }# ^
这个是主页的地址(240e:644:100:0:0:0:0:7)和解析(www.easysino.com),这个主页中的某个子页面下有一处外链了百度地图(api.map.baidu.com)(VS即Virtual Server)
e% t6 b" i' Y* Z$ \3 A 创建修改策略,关联主站VS 7 X) v2 d4 g- J/ s, Y$ a
$ f/ }+ v8 v% q _/ }" u7 D 9 z& j2 @* J+ _: ~# K
) h8 I. W" E7 I/ L/ a
" q7 ]) b+ C4 b1 ~1 ]2 x
创建修改外链的策略 : Z% M. F, t& k6 j
/c/slb/layer7/httpmod 1
+ P( F% `& e7 E/ {( _: J/ l ena
: C2 S/ v, P0 v /c/slb/layer7/httpmod 1/rule 2 text ' A: T, Q) b$ L3 L/ a* K8 g
ena , O2 `! b2 E( f" t
body include
0 V/ s; \' W3 L5 R3 {& Y action remove "TEXT=Accept-Encoding: gzip, deflate"
- ` k, \+ ]& G! D% i- N% v# D9 \% ^ /c/slb/layer7/httpmod 1/rule 3 text # Y* B" D8 m( ~# P& X: K0 D1 t
ena
: u; v1 I% D8 K+ O$ \ directn resp ( z, w: d! Z4 |: V1 c
body include
9 }4 d" D% X& Q( l$ F1 l. c action replace "FROMTEXT=http://api.map.baidu.com" "TOTEXT=http://map.95538.cn:8088"
" o4 Q$ p) y7 s8 Q$ y 将 httpmod 关联至主站VS
4 h# _1 W3 p: e /c/slb/virt ipv6/service 8088 http/http
% P3 o8 k8 N$ J0 L( I+ H httpmod 1
4 Z8 P9 _2 }' }7 H7 \ 1 |7 ]) ?4 U! v, y1 I4 e6 h( O j
Y; r0 `& ~5 s1 c& p
& q" g! w, M ^1 |2 x+ a 该策略使得主站可以返回修改后的域名,客户端请求到该域名就相当于请求到链路负载上的某个VS,即外链VS。
2 n' Z# f# ^' i( q' X6 e! k3 A 2.1.是基于域名的外链
/ _+ S/ q* Y0 \8 x/ t/ M; i# s 然后我们还要创建外链VS,以及外链VS的解析(map.95538.cn)
( j' P( `+ I6 z# }9 Y (通过Alteon自身去ping api.map.baidu.com得到外链的地址,real及group部分的配置不再展示) " e# ~6 R4 J' j. J! z& J
1 o6 w& t+ @; E3 R% _
% z8 Y% i% [. f" u # T; V1 U* Y: ]
外链VS——v6 转 v4
6 ~: k% q( n; d! K. B /c/slb/virt baidu_map_api
n9 Q1 I6 Y4 p7 D ena
- t2 m1 J# Q( X: b& l$ j ipver v6
0 O- P* m0 g$ ~0 o- O& k+ ` vip 240e:644:100:0:0:0:0:16 / J9 f+ ]5 b ~- ~4 q* ^
rtsrcmac ena & P1 r# V' x/ }$ U' D" }' Z: B% ~: E
dname "inherit" ! x4 g, o2 K" s: I
wanlink "ipv6"
/ p4 G; g. ?8 a. u) c3 t /c/slb/virt baidu_map_api/service 8088 http ) P& L$ }4 _4 w' T5 j
group baidu_map_api $ ^ a: l' x7 X3 T% p6 G! Q4 \
rport 80 0 C9 M) t+ K( |* y- ? k4 O
dbind forceproxy
( ~/ k6 V/ p% z( y. h! }0 A. R /c/slb/virt baidu_map_api/service 8088 http/pip
( c4 o4 Z" t5 w0 e% E0 _: j# b) ^ mode address
2 P1 B+ A$ b* E6 F addr v4 58.56.105.10 255.255.255.255 persist disable $ S1 h1 X1 d8 V H
/c/slb/gslb/network 110
5 ?# H, ^2 K* S1 }1 B5 ~ ena % [3 ]3 e* P$ G0 x6 T/ S* \
ipver v6
+ K+ a5 c& D: \' P8 O sip 0:0:0:0:0:0:0:0
' Z0 Y, u+ ]4 f1 ]8 o$ _! u4 i addvirt baidu_map_api 65535 % z' _" U" g2 W
/c/slb/gslb/rule 110
! K. U4 w5 }1 S; O# t ena
4 Z; j/ V; ]* @# P type inbound-llb 8088 % H' |# D% P* @6 `' `! I" Y9 v
ttl 0
9 }+ ]' w6 [' r& m/ f* y, O% Z7 u5 K rr 1 ( w! V4 Q; O8 r6 A1 v; w6 U
dname "map.95538.cn"
+ M8 w$ [* d6 O( F /c/slb/gslb/rule 110/metric 1 + L1 _/ y7 q' x; b( H
gmetric network
4 d7 s0 C) V3 Z6 ~4 C6 r ~! J: G6 @ addnet 110 0 ]4 V J+ D' x# N# e
/c/slb/gslb/rule 110/metric 2
- G% ^; }, f( ]$ W8 \9 L* H2 D gmetric proximity
. B; s1 i3 R+ v /c/slb/gslb/rule 110/metric 3
" N* y. Z: m. s1 P& `* J' d gmetric bandwidth ) \* H, X0 s& T9 y- s6 T1 W8 ]" y
" V7 t* Y8 w, }' c( `; U' Q
& m6 S0 U, d _4 T& f/ h r" n
0 a }$ p6 q& O: a( [
请求该外链当然还需要修改request请求头中HOST的值,否则百度地图API会返回503。 % _; x R, l. |* g2 A
! t6 T# l4 L/ {& a A
, ~9 p6 } N: z. @
8 g6 K6 _% k$ A 创建修改HOST的策略
% q0 e( G$ q* T7 k1 F. f- n2 J& F /c/slb/layer7/httpmod 2
4 t3 D* Y( {3 _# V ena
) Y) m: b0 m5 u8 ^ /c/slb/layer7/httpmod 2/rule 2 text 0 r) w6 n& F5 k5 |* C! g) D
ena
y# ^2 @' ]* `5 X% n J action replace "FROMTEXT=map.95538.cn:8088" "TOTEXT=api.map.baidu.com"
# t2 o1 D, W& R2 l( Y8 c( ~ 将修改HOST的 httpmod 策略关联至外链VS * h( X" P2 B$ ]& }3 l; i
/c/slb/virt baidu_map_api/service 8088 http/http & P+ d# S) y6 d
httpmod 2 ) R5 @) `) |( {! y" N& Z
! E9 A; E) }; x; {6 a
3 U$ ]2 J7 a1 O( |
- J) A! |, g" j7 W" h7 ? 正常情况的外链到这一步基本就结束了,但是,百度地图API的外链才算是刚刚开始。
4 ~$ G' P) m, c/ S1 @! w) L 2.2.外链返回的外链
2 R r( R4 y @! u) E5 I7 W* | 百度地图API的这个外链,并没有将地图信息回传给我们,而是又返回了两个外链,当然同样是(api.map.baidu.com),只是uri信息不同。 0 v: x) _$ |, v
' \& t6 m3 F' p0 q
上图展示的是原网站的信息,而实际的情况除了第一条被修改成了(map.95538.cn:8088),后面两条还是(api.map.baidu.com)。当时的抓包信息: 6 c1 P5 |! Z, Q$ G2 L6 d6 z$ ]
9 f2 P3 O0 z- N
我们的modification没有将后续的(api.map.baidu.com)进行修改?而且通过这个包我们还可以看到respond信息中还有一条Set-Cookie…… t2 ^( N' d6 ], Q- i
针对外链回传的外链没有被修改的问题,我们通过httpmod进行了各种尝试,包括将text修改成url,包括将相同的text创建两条,均没有任何效果。
# {7 L1 `3 C$ [$ i& d6 |9 x# b 2.2.1. http modification性能的不足和异常+ j1 j# g; R9 Z! P
性能不足:无法对外链返回的外链进行修改 + M* _( ~% p- r! `# V- m
异常:http modification修改request后,会使得request发生两次,导致服务器间歇性返回 400 bad request。
% C- v: Z5 A* M- j + d( }/ E3 o/ R% I
我不是太确定产生两次GET的原因是modification本身的缺陷,还是跟Alteon软件版本有关,可以确定的是,这种情况在31.0.6的时候是没有的。而且,如果不把客户端request请求头中“Accept-Encoding:gzip, deflate”删掉,这种情况是不会出现的。 6 q |" v/ x$ a
但因为400 Bad Request,并非只发生在此处,而是但凡关联了httpmod 的VS都会有这种现象发生,而且频率非常高,造成了非常差的体验感。 . V/ }7 r/ Y2 C$ k, h+ s2 p
2.2.2. 使用as++替换http modification 解决性能不足和异常4 p0 y( ], l+ s6 V& Y8 R: ~
抱着侥幸的心理,我们使用as++将modification 策略替换掉了
+ z- h4 W1 K7 v0 a! O: p* `) R$ C
- O) h# z# r, U; `/ E7 j 9 e! ?8 f; k( \" v9 a% e
5 [ a6 ^6 O1 B+ _# O5 n" B3 `+ H 主站VS下的as++ + r. H# e7 K1 o! c) O8 N+ J8 ?
(CLIENT_DATA相当于HTTP_REQUEST) 4 r! V. b( f* G1 H) ?5 [+ ?
(SERVER_DATA相当于HTTP_RESPOND和HTTP_RESPOND_DATA)
8 F% @' @4 E! y, x& O v$ s /c/slb/appshape/script http_body_ipv6
! i! ]; `9 l1 C, f- n( ] ena
$ v/ n( j3 j- q6 f import text
1 F r7 N9 J" ~4 `8 T0 E when CLIENT_ACCEPTED {
, O7 q) h1 V0 e& e TCP::collect
4 J# j; j) R9 F* [+ \- s }
+ Z+ G% Y/ x/ X s when CLIENT_DATA {
& x9 A4 X2 B0 {; k) f) K set re_gzip "Accept-Encoding: gzip, deflate" 4 i R+ A5 s, Q4 E* Z9 t+ ?) |
set re_null " "
1 R: i0 p3 ]$ A: k" | set j [TCP::payload find $re_gzip]
' f: j3 F0 X7 i1 D8 F7 D q if { $j != -1 } { i8 k0 n, W4 [5 L5 Z
TCP::payload replace $j 30 $re_null ' F2 q- q+ P& `7 K' |
} 8 J. j" N* p' F
TCP::release
+ b3 p k" ]7 p1 G TCP::collect
$ S2 g; {# G$ { }
% v2 n; m, Y# j when SERVER_CONNECTED {
$ y+ [) H7 e- H! q) u& u TCP::collect " b- D2 ~' u" Q& \7 B
}
* ?! }# v$ i% f& x9 H0 F when SERVER_DATA { 4 x/ _0 R3 V+ Q1 Q
set map_baidu "api.map.baidu.com" / y# |. u2 j$ m3 v" T0 t
set change_data "map.95538.cn:8088" ! L) H8 _7 W$ f q9 Y
foreach start_str [TCP::payload find_all $map_baidu] {
! u( f' Q6 A4 h f7 _/ [& V q TCP::payload replace $start_str 17 $change_data 5 K9 v0 v8 g" }! _/ f
} # v1 H; }; b! N4 P: j( v
TCP::release ! K2 U0 Z/ j' v5 J# q3 |
TCP::collect % v" [4 g1 m+ m5 S5 J
} & U, |2 s2 y6 d; p
-----END
+ M! b6 X/ M' o0 V 外链VS下的as++
( F& ~( E- z% w! p; S2 X8 Z# v4 j /c/slb/appshape/script http_body * H& E+ c5 y, I' @% r. E( e
ena
4 U- r n5 Z- g$ l import text " V) [3 y4 m J* o) s* z+ @
when CLIENT_ACCEPTED { ; g T: j+ [( L/ r
TCP::collect ) h; M# O* R' h) Z
} 4 c" @* ?! o. t* A. Q/ o4 l
when CLIENT_DATA { 2 U9 p& u# g" L) r- P
set old_host "map.95538.cn:8088"
5 H" l0 Q0 Z' W2 i. B6 c& r6 B7 l set new_host "api.map.baidu.com"
* {3 i& @: A9 i0 w4 w" J' ~: v set i [TCP::payload find $old_host] / |. P! Z9 O& F% n- I e
if { $i != -1 } { ! y& @0 L+ t& A! ?' t9 z/ @
TCP::payload replace $i 17 $new_host 2 _; d# p0 J" X0 l% [ D4 L! U7 s
}
9 x$ J) R$ Q" l% U1 v4 C' ?( j" z set re_gzip "Accept-Encoding: gzip, deflate"
' b4 g3 H3 T4 @ set re_null " " / A E6 H# `$ Z/ M& m
set j [TCP::payload find $re_gzip] 1 M% a5 M f' k1 X
if { $j != -1 } { * D3 p, R* O/ W5 f$ h3 s$ z
TCP::payload replace $j 30 $re_null
5 x+ w+ u; u: Y3 } }
- t) |3 ?% O. {+ P% d TCP::release 6 ?% U+ H' O S- f7 {
TCP::collect
5 n( \" a3 A7 @2 C }
7 Z' W4 U, a) z: I1 p. {8 v5 }; e when SERVER_CONNECTED { * ]1 J0 W- r! A) y$ S
TCP::collect % R! P: ~/ \. L2 b6 _% v
} 2 |6 X( z- w1 z8 F U8 o3 y4 L
when SERVER_DATA { ; q) _8 I6 C' e2 a+ y$ @/ _ d
set map_baidu "api.map.baidu.com" ) h ?1 i) V1 x% f& B
set change_data "map.95538.cn:8088" - z! \; g! F- m! T0 d" V
foreach start_str [TCP::payload find_all $map_baidu] {
% y. x2 Z/ z9 D1 `/ u TCP::payload replace $start_str 17 $change_data
5 f- r' }+ g# c, X* q( V } 0 P, b8 T. w# t u. |4 W4 \5 d
TCP::release 2 y# r, x; d. K @, F. ?% c% T
TCP::collect
$ n4 a# I4 l8 k0 B' `/ }) z6 y } - ^( R5 c6 F$ o* n
-----END 7 ~3 m! h2 j% E5 A5 ` G9 ^6 N( F
6 _- N" ?" S+ @! T' V
+ w. g. z, K3 c( \
0 I3 n9 z2 y" f& w) g 测试证明,http modification 与 as++并不一样,至少能力差很多。
9 O+ \* k% E) J& w
4 x. W: m/ N% ^' F+ F6 {
6 F0 D/ y- h( u. W
) n# V' }1 a7 c) N set map_baidu "api.map.baidu.com" & h4 a2 [. L8 }7 X V: i
set change_data "map.95538.cn:8088"
* W( X: V1 K1 L( D/ ^+ m* I foreach start_str [TCP::payload find_all $map_baidu] {
9 b; ]! ]/ j9 P- @ TCP::payload replace $start_str 17 $change_data / q, p/ g! J4 }
} & {3 k* @/ Z- m8 h
" L/ a5 R f, G6 |9 R* K
( p0 d u: P8 A. f; A 0 r# j% {' q& y3 q- W3 n
(api.map.baidu.com)都完全修改掉了,不止刚刚看到的那两处。 , O' V' k# f! d, s6 k9 F
经过这样的修改之后,再次抓包发现,我们请求到了更多的信息,但遗憾的是,百度地图依然不显示。对比正常能请求到地图的包发现,正常的数据包从请求第一个(api.map.baidu.com)开始,余下的session全是在同一个会话当中。而请求不到地图,但确实返回了大量信息的包中,我们发现每个session都是一个独立的会话。 3 a: u( h2 u0 S
) \" f1 ^9 g% i) u$ U* e
我们猜测,这可能与会话保持有关,我们通过v6请求过去,百度地图API返回了Set-Cookie之后,我们后续的请求,会自动丢弃百度API返回的Cookie,而且很显然,我们每次请求都发往了不同的百度地图服务器。 1 f6 ~- p* x; b) j
2.3.外链有基于cookie的会话保持7 N8 j, h) K9 C r9 a' l! C7 P
我们尝试了insert,passive,rewrite各种方式,企图将Cookie插入,甚至,我们都用上了手动插入,就是用as++写入一条静态的,百度地图API返回过来的Cookie,完全没有任何效果。
7 F- A5 ?4 X; U i( [ 观察一下这个Cookie吧,这个Cookie中包含了很多信息,我做了一个这样的猜想,会不会是因为这些信息中的某一条导致了客户认为这个set-cookie是不安全,不合法的呢。比如“domain=.baidu.com”,仅仅只是一种猜测,不过没有别的办法还是可以尝试一下。于是,通过as++在respond方向,将多余的cookie信息remove掉。 / z" R2 Z2 h; L
! p6 Q7 p: d) p5 p+ w : g/ k7 P/ b( a9 f1 e! N; }; _
8 R6 h K9 S; K+ ~ \+ o1 @ set fg_ex "FG=1; expires=" 9 }( t3 z2 P' L! o4 U0 h; j+ a
set fg "FG=1"
6 v3 ^0 l" w* i, f1 H o set i [TCP::payload find $fg_ex] 5 H3 O9 k' a: J7 ^: r
if { $i != -1 } { # _. x/ E, D8 k0 b% k0 c( `
TCP::payload replace $i 97 $fg
/ w, {% P+ y: r9 J } 2 x& R& _+ E. P* `/ u; b# @" v0 ~
1 h6 M3 D0 [4 _+ T
. ~3 g! _0 o; R# r5 X5 R0 S
$ l6 G* ?: Y, [$ \' V2 P2 _
在外链VS中SERVER_DATA中添加了这么一段。将FG=1;后面的内容全部移除。 * @, |+ \9 g7 z7 B+ W
然后,激动人心的事情发生了。刷新页面后,百度的地图的一些控制缩放的原件出现了,而地图也在反复的缩放过程中,似有似无的出现。 ' X7 j7 t' \: E/ t4 H5 \
" g* M( u4 R1 j8 _5 C
* I/ S! |$ l4 Z2 G2 F; p* E( ]
当出现这个结果时,我几乎都认为,这恐怕就是最好的结果了。 % W8 T5 _- W2 X2 s, a
可惜,依旧经不起考验,这种奇迹,就只出现了一次,清空浏览器缓存,再次刷新,地图再没出现过。
+ P& z2 m6 x6 `3 ]( b, c/ T 此项问题该如何解决呢?限于篇幅原因,请大家期待下一章节,Radware IPv6链外天窗案例-百度地图外链解决方案(三)
M% f2 Q% R! h) @' l$ I3 \/ j G6 |6 _% |5 S
2 w1 M+ x3 K: L
; K6 H% [7 O0 u* { |