起因
近期,我在自己维护的系统中遇到了和F5有关的问题,所以有幸研究了一下F5插入的cookie和IP地址之间的关系。该系统前端由F5进行负载均衡,并通过cookie插入的方式来做会话保持,后端有50台应用服务器。
原理
当F5采用cookie会话保持的方式进行应用分发时,会在请求中插入一条自己的cookie,用于判断分发到后端的哪台应用。当下次再次处理时,如果看到请求中带有自己插入的cookie,会按该cookie中包含的IP进行转发,进而保证用户能够分发到同一台应用。例如下面这条请求,F5插入了自己的cookie:BIGipServerLearning_tcp80_ap_pool=841232395.10531.0000
61.138.232.21 - - [02/Aug/2016:14:00:14 +0800] 193 "GET /asset/pickers/search.png HTTP/1.1" 304 - "http://xxxx.com/learning/catalog/browseForLearning.rdf" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3)" "dsloginTypeTips=3; cookieidTagFlag=1; tagInfoId=%26_000050%3D07; lastUpdateTime=2016-07-30%2015%3A21%3A55; halfLoginCustName=9AF10A20E294F15F258B2D760A35A5761156BBB5E8776CE8; halfLoginCustId=A84CABE8981F1D30425E8DA362BB9EE6; halfLoginShowName=9AF10A20E294F15F425E8DA362BB9EE6; tagInfoCustId=36356287; cityCodeFlag=0; cityName=%E7%9F%B3%E6%B2%B3%E5%AD%90; cityCode=659001; BIGipServerLearning_tcp80_ap_pool=841232395.10531.0000" "-" |
其中该条cookie中:841232395.10531.0000,841232395所代表的是IP,10531为端口。当后端应用IP地址不变的情况下,该值是固定的,说明F5有一个算法来维系这种对应关系。
算法分析之IP转换
下面我们来还原一下这个算法:
拿出值:841232395
第一步:将该10进制值转换为16进制(得到一个8位的值,如果不够8位,前面补0)
3224300B
第二步:将这个8位的值分为四段
32 24 30 0B
第三步:按顺序将每段数字分别转换成10进制,分别得到4个数字
32 → 50
24 → 36
30 → 48
0B → 11
第四步:倒置顺序,分别做为IP地址的4段,即11.48.36.50
下面,再来转换一个:18875658
18875658->转换成16进制->120050A->不够8位,前面补0->0120050A->分成4段->01 20 05 0A->分别转换成10进制->1 32 5 10->倒置顺序->得到IP地址:10.5.32.1
代表端口的第二个字段:10531,是如何转换的呢?
算法分析之端口转换
下面将端口的算法进行还原:
第一步,将该10进制数字(10531),转换为16进制
2923
第二步,将得到的数字分成两段
29 23
第三步,倒置顺序
23 29
第四步,将倒置后的4位数合在一起,转换为10进制
9001
说明后端应用的端口为9001
转换顺序即简化为:
10531->转换成16进制->2923->分成两段->29 23->倒置顺序->2329->转换成10进制->9001
应用价值
当你知道这个转换关系时,就可以通过请求中得到的cookie来判断F5分发到了哪台应用上。
自动化转换脚本
本人将转换步骤写成了shell脚本,运行脚本即可得到转换后的结果。
请移至:http://down.51cto.com/data/2236815
下一篇将介绍如何将IP地址转换为F5插入cookie所用到的数字串。
链接:http://showing.blog.51cto.com/11976328/1841574