龙空技术网

Radware IPv6链外天窗案例-百度地图外链解决方案(二)

晓数神州 107

前言:

现时看官们对“百度地图api接口文档”都比较重视,朋友们都想要学习一些“百度地图api接口文档”的相关文章。那么小编同时在网摘上汇集了一些对于“百度地图api接口文档””的相关内容,希望你们能喜欢,朋友们一起来学习一下吧!

Radware IPv6链外天窗案例-百度地图外链解决方案(二)来啦!

百度地图外链解决思路

这个是我们在某证券的IPv6测试中总结出的一个案例,因为这个外链天窗解决的过程和解决的手段都足够复杂,可以为大家提供更多的解决思路。但凡遇到百度地图这种外链的事情,该手册一定会起到相当大的辅助作用。(VS即Virtual Server 虚拟服务)

先看基础的配置:

主站VS——v6 转 v4

/c/slb/virt ipv6

ena

ipver v6

vip 240e:644:100:0:0:0:0:7

rtsrcmac ena

dname "inherit"

wanlink "ipv6"

type wizard

/c/slb/virt ipv6/service 8088 http

group test

rport 80

dbind forceproxy

/c/slb/virt ipv6/service 8088 http/pip

mode address

addr v4 58.56.105.10 255.255.255.255 persist disable

/c/slb/gslb/network 100

ena

ipver v6

sip 0:0:0:0:0:0:0:0

addvirt ipv6 65535

/c/slb/gslb/rule 100

ena

type inbound-llb 8088

ttl 0

rr 1

dname ";

/c/slb/gslb/rule 100/metric 1

gmetric network

addnet 100

/c/slb/gslb/rule 100/metric 2

gmetric proximity

/c/slb/gslb/rule 100/metric 3

gmetric bandwidth

这个是主页的地址(240e:644:100:0:0:0:0:7)和解析(),这个主页中的某个子页面下有一处外链了百度地图(api.map.baidu.com)(VS即Virtual Server)

创建修改策略,关联主站VS

创建修改外链的策略

/c/slb/layer7/httpmod 1

ena

/c/slb/layer7/httpmod 1/rule 2 text

ena

body include

action remove "TEXT=Accept-Encoding: gzip, deflate"

/c/slb/layer7/httpmod 1/rule 3 text

ena

directn resp

body include

action replace "FROMTEXT=; "TOTEXT=;

将 httpmod 关联至主站VS

/c/slb/virt ipv6/service 8088 http/http

httpmod 1

该策略使得主站可以返回修改后的域名,客户端请求到该域名就相当于请求到链路负载上的某个VS,即外链VS。

2.1.是基于域名的外链

然后我们还要创建外链VS,以及外链VS的解析(map.95538.cn)

(通过Alteon自身去ping api.map.baidu.com得到外链的地址,real及group部分的配置不再展示)

外链VS——v6 转 v4

/c/slb/virt baidu_map_api

ena

ipver v6

vip 240e:644:100:0:0:0:0:16

rtsrcmac ena

dname "inherit"

wanlink "ipv6"

/c/slb/virt baidu_map_api/service 8088 http

group baidu_map_api

rport 80

dbind forceproxy

/c/slb/virt baidu_map_api/service 8088 http/pip

mode address

addr v4 58.56.105.10 255.255.255.255 persist disable

/c/slb/gslb/network 110

ena

ipver v6

sip 0:0:0:0:0:0:0:0

addvirt baidu_map_api 65535

/c/slb/gslb/rule 110

ena

type inbound-llb 8088

ttl 0

rr 1

dname "map.95538.cn"

/c/slb/gslb/rule 110/metric 1

gmetric network

addnet 110

/c/slb/gslb/rule 110/metric 2

gmetric proximity

/c/slb/gslb/rule 110/metric 3

gmetric bandwidth

请求该外链当然还需要修改request请求头中HOST的值,否则百度地图API会返回503。

创建修改HOST的策略

/c/slb/layer7/httpmod 2

ena

/c/slb/layer7/httpmod 2/rule 2 text

ena

action replace "FROMTEXT=map.95538.cn:8088" "TOTEXT=api.map.baidu.com"

将修改HOST的 httpmod 策略关联至外链VS

/c/slb/virt baidu_map_api/service 8088 http/http

httpmod 2

正常情况的外链到这一步基本就结束了,但是,百度地图API的外链才算是刚刚开始。

2.2.外链返回的外链

百度地图API的这个外链,并没有将地图信息回传给我们,而是又返回了两个外链,当然同样是(api.map.baidu.com),只是uri信息不同。

上图展示的是原网站的信息,而实际的情况除了第一条被修改成了(map.95538.cn:8088),后面两条还是(api.map.baidu.com)。当时的抓包信息:

我们的modification没有将后续的(api.map.baidu.com)进行修改?而且通过这个包我们还可以看到respond信息中还有一条Set-Cookie……

针对外链回传的外链没有被修改的问题,我们通过httpmod进行了各种尝试,包括将text修改成url,包括将相同的text创建两条,均没有任何效果。

2.2.1. http modification性能的不足和异常

性能不足:无法对外链返回的外链进行修改

异常:http modification修改request后,会使得request发生两次,导致服务器间歇性返回 400 bad request。

我不是太确定产生两次GET的原因是modification本身的缺陷,还是跟Alteon软件版本有关,可以确定的是,这种情况在31.0.6的时候是没有的。而且,如果不把客户端request请求头中“Accept-Encoding:gzip, deflate”删掉,这种情况是不会出现的。

但因为400 Bad Request,并非只发生在此处,而是但凡关联了httpmod 的VS都会有这种现象发生,而且频率非常高,造成了非常差的体验感。

2.2.2. 使用as++替换http modification 解决性能不足和异常

抱着侥幸的心理,我们使用as++将modification 策略替换掉了

主站VS下的as++

(CLIENT_DATA相当于HTTP_REQUEST)

(SERVER_DATA相当于HTTP_RESPOND和HTTP_RESPOND_DATA)

/c/slb/appshape/script http_body_ipv6

ena

import text

when CLIENT_ACCEPTED {

TCP::collect

}

when CLIENT_DATA {

set re_gzip "Accept-Encoding: gzip, deflate"

set re_null " "

set j [TCP::payload find $re_gzip]

if { $j != -1 } {

TCP::payload replace $j 30 $re_null

}

TCP::release

TCP::collect

}

when SERVER_CONNECTED {

TCP::collect

}

when SERVER_DATA {

set map_baidu "api.map.baidu.com"

set change_data "map.95538.cn:8088"

foreach start_str [TCP::payload find_all $map_baidu] {

TCP::payload replace $start_str 17 $change_data

}

TCP::release

TCP::collect

}

-----END

外链VS下的as++

/c/slb/appshape/script http_body

ena

import text

when CLIENT_ACCEPTED {

TCP::collect

}

when CLIENT_DATA {

set old_host "map.95538.cn:8088"

set new_host "api.map.baidu.com"

set i [TCP::payload find $old_host]

if { $i != -1 } {

TCP::payload replace $i 17 $new_host

}

set re_gzip "Accept-Encoding: gzip, deflate"

set re_null " "

set j [TCP::payload find $re_gzip]

if { $j != -1 } {

TCP::payload replace $j 30 $re_null

}

TCP::release

TCP::collect

}

when SERVER_CONNECTED {

TCP::collect

}

when SERVER_DATA {

set map_baidu "api.map.baidu.com"

set change_data "map.95538.cn:8088"

foreach start_str [TCP::payload find_all $map_baidu] {

TCP::payload replace $start_str 17 $change_data

}

TCP::release

TCP::collect

}

-----END

测试证明,http modification 与 as++并不一样,至少能力差很多。

set map_baidu "api.map.baidu.com"

set change_data "map.95538.cn:8088"

foreach start_str [TCP::payload find_all $map_baidu] {

TCP::payload replace $start_str 17 $change_data

}

(api.map.baidu.com)都完全修改掉了,不止刚刚看到的那两处。

经过这样的修改之后,再次抓包发现,我们请求到了更多的信息,但遗憾的是,百度地图依然不显示。对比正常能请求到地图的包发现,正常的数据包从请求第一个(api.map.baidu.com)开始,余下的session全是在同一个会话当中。而请求不到地图,但确实返回了大量信息的包中,我们发现每个session都是一个独立的会话。

我们猜测,这可能与会话保持有关,我们通过v6请求过去,百度地图API返回了Set-Cookie之后,我们后续的请求,会自动丢弃百度API返回的Cookie,而且很显然,我们每次请求都发往了不同的百度地图服务器。

2.3.外链有基于cookie的会话保持

我们尝试了insert,passive,rewrite各种方式,企图将Cookie插入,甚至,我们都用上了手动插入,就是用as++写入一条静态的,百度地图API返回过来的Cookie,完全没有任何效果。

观察一下这个Cookie吧,这个Cookie中包含了很多信息,我做了一个这样的猜想,会不会是因为这些信息中的某一条导致了客户认为这个set-cookie是不安全,不合法的呢。比如“domain=.baidu.com”,仅仅只是一种猜测,不过没有别的办法还是可以尝试一下。于是,通过as++在respond方向,将多余的cookie信息remove掉。

set fg_ex "FG=1; expires="

set fg "FG=1"

set i [TCP::payload find $fg_ex]

if { $i != -1 } {

TCP::payload replace $i 97 $fg

}

在外链VS中SERVER_DATA中添加了这么一段。将FG=1;后面的内容全部移除。

然后,激动人心的事情发生了。刷新页面后,百度的地图的一些控制缩放的原件出现了,而地图也在反复的缩放过程中,似有似无的出现。

当出现这个结果时,我几乎都认为,这恐怕就是最好的结果了。

可惜,依旧经不起考验,这种奇迹,就只出现了一次,清空浏览器缓存,再次刷新,地图再没出现过。

此项问题该如何解决呢?限于篇幅原因,请大家期待下一章节,Radware IPv6链外天窗案例-百度地图外链解决方案(三)

标签: #百度地图api接口文档