将F5插入的cookie转换为IP地址


起因

近期,我在自己维护的系统中遇到了和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

时间: 2024-10-05 04:19:23

将F5插入的cookie转换为IP地址的相关文章

JAVA 长整型转换为IP地址的方法

代码如下: /** * 整型解析为IP地址 * @param num * @return */ public static String int2iP(Long num) { String str = null; Long[] tt = new Long[4]; tt[0] = (num >>> 24) >>> 0; tt[1] = ((num << 8) >>> 24) >>> 0; tt[2] = (num <&

【Web探索之旅】第三部分第二课:IP地址和域名

内容简介 1.第三部分第二课:IP地址和域名 2.第三部分第三课预告:协议 第三部分第二课:IP地址和域名 上一课我们说了在Web之中,全球各地有无数台机器,有些充当客户机,有些作为服务器. 那么这些机器如何找到和辨认彼此呢?难道不会"只是因为在人群中多看了你一眼,再也没能想起你容颜"吗? 如果我用我的浏览器上网,我怎么知道哪个服务器向我发送此网站呢? 为了解决这个难题,IT科学家们使用了一个叫做IP地址的东西(东西好像有点太难听了,IP它根本就不是个东西好嘛). IP是Interne

域名转化到IP地址的实现

在linux中,有一些函数可以实现主机名和地址的转化,最常见的有gethostbyname().gethostbyaddr()等,它们都可以实现IPv4和IPv6的地址和主机名之间的转化.其中gethostbyname()是将主机名转化为IP地址,gethostbyaddr()则是逆操作,是将IP地址转化为主机名. 函数原型: 1 #include <netdb.h> 2 3 struct hostent* gethostbyname(const char* hostname); 4 5 st

IP地址在数据库里面的存储方式

大多数公司的表结构都需要经过DBA进行审核,有时候你会看到存储IP地址采用varchar(15),这种方式都是传统的做法,这种方法需要占用15个字节,那么有更省空间的做法么?肯定是有的,那就是用int存储.如果采用int存储这里又有2种处理方式. 1. 利用MySQL函数进行处理.可以采用INET_ATON,INET_NTOA函数进行转换. 2. 利用开发语言的函数进行处理,以php进行举例.可以采用ip2long,long2ip函数进行转换. 上面2种方法得到的结果都是一致的.因为算法都是一样

mac下ip地址重定向

在终端临时使用最高权限用vim编辑/etc下的hosts文件,若提示Password: 输入开机登录密码并回车: yanguobindeMacBook-Pro:~ yanguobin$ sudo vim /etc/hosts 在末尾插入即可 格式为ip地址+空格+域名 可以将一个域名重定向到一个ip 例如: 127.0.0.1 peer1 127.0.0.1 peer2 记得保存退出 原文地址:https://www.cnblogs.com/yanguobin/p/11452916.html

F5 cookie值与IP地址(二):将IP地址转换成F5 cookie值

简  介 在上一篇中,我们介绍了如何将cookie码转换成IP地址,这次我们将介绍如何将IP地址转换成cookie码.如何上一篇分析清楚了,本篇也很简单. 链接:http://showing.blog.51cto.com/11976328/1841564 转换步骤 下面,我们将以IP地址:192.168.1.1为例: 192.168.1.1->倒置顺序->1 1 168 192->分别转换为16进制->1 1 A8 C0->不够两位的补0->01 01 A8 C0-&g

C#中IP地址转换为数值的方法

任何语言都通用的方法转换 IP 地址 a.b.c.d ==> a*256*256*256+b*256*256+c*256+d ===> 256*(c+256*(b+256*a)) +d 示例: 72.167.124.214 ==> 72*256*256*256+167*256*256+124*256+214 ===> 256*(1 24+256*(167+256*72))+214 .net 提供的方法转换 IP 地址 // 字符串转换为数字 System.Net.IPAddress

JAVA中如何将整数表示的ip地址转换为字符串表示

/** * 将整数表示的ip地址转换为字符串表示. * * @param ip 32位整数表示的ip地址 * @return 点分式表示的ip地址 */public static final String long2Ip(final long ip) {      final long[] mask = { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 };      final StringBuilder ipAddress = new Stri

JAVA将字符串表示的ip地址转换为long表示

/** * 将字符串表示的ip地址转换为long表示. * * @param ip ip地址 * @return 以32位整数表示的ip地址 */ public static final long ip2Long(final String ip) { if (!RegexpUtils.isExactlyMatches("(\\d{1,3}\\.){3}\\d{1,3}", ip)) { throw new IllegalArgumentException("[" +