F5常用5种插入客户端源地址方法简述常旭2014年8月目录一、引言........................................................................................3二、测试环境.................................................................................42.1、网络拓扑..............................................................................42.2、基础配置..............................................................................4三、应用层常用方法.....................................................................53.1、X-Forwarded-For..................................................................53.1.1、配置步骤....................................................................53.1.2、验证...........................................................................63.2、插入Header..........................................................................73.2.1、配置步骤....................................................................83.2.2、验证...........................................................................83.3、插入Cookie..........................................................................93.3.1、配置步骤..................................................................103.3.2、验证.........................................................................103.4、TCP-Option........................................................................113.4.1、配置步骤..................................................................123.4.2、验证.........................................................................133.5、TCP-payload.......................................................................153.5.1、配置步骤..................................................................163.5.2、验证.........................................................................17四、总结......................................................................................18一、引言随着IT环境的高速发展,解决我们日常各种需求的应用像雨后春笋般以一个惊人的速度爆发式增长,而其中大部分应用为了抢占市场都存在开发周期短的问题。如果基于这样的一个背景让应用开发人员将功能是否满足需求、可用性、应用性能、安全性、是否按时上线、后期维护复杂度等几个现实问题做优先级排序,那么安全性肯定会排在最后。但实际上现在大多数应用在设计业务逻辑时就已经对安全有了一定要求。比如最近一段时间经常在项目上遇见后端服务器需要查看客户端源IP地址的需求。这实际上就是一个简单的安全手段,通过查看客户端源IP地址来达到审计的目的,或者通过ACL列表过滤客户端请求等。我们在讨论如何让后端服务器看到客户端源IP地址前先来看一下F5的几种部署模式。首先是三角传输(即npath模式),这是一种非常古老的部署模式,主要应用于响应包明显大于请求包的场景(如请求包大小为10k,服务器回包1000M!有点夸张),但随着设备性能的不断提高且该模式配置极其复杂(需要服务器开启loopback功能,并通过iptable关闭ARP响应功能,但不同Linux版本关闭iptable命令均不同)目前已经退出了历史舞台。其次,第二种是路由模式,由于其工作原理类似于路由器而得名。通过这种部署模式BIG-IP就可以满足需求,让后端服务器看到客户端源IP地址。既然这样,问题不就解决了吗??但往往生活就是这样不尽如人意。比如后端服务器和客户端处于相同网段,当服务器看到客户端IP地址后直接通过二层回包,这样客户端收到的数据包由于请求目的地址和回包地址不同而自动被拒绝。类似场景就比较尴尬了,即需要让后端服务器看到客户端源地址又不能让后端服务器看到客户端源地址,在这样一个矛盾的现实案例中我们要想同时满足网络和应用的需求,只能通过非常规的方法来进行处理。最近遇到了好几个类似的问题,但由于应用程序的不同客户端IP地址插入的位置也不尽相同,本文通过汇总几种常用的插入IP方式进一步展现F5在软件定义方面的强大优势,但由于应用快速发展及个人经验等客观因素影响,无法将所有方法一一进行阐述,如果哪位兄弟们有其他更好的方法烦请告诉我一下,非常感谢(联系方式mars_crow@sina.com)。二、测试环境2.1、网络拓扑在笔记本上安装VMware,并开启四台虚拟机。其中两台为VirtualEdition-v11.4.1,另外两台为后端真实服务器。访问流程如上图,通过IE浏览器访问第一台VE的VS,由于Poolmember是第二台VE的VS,因此流量自动转发到第二台VE,并最终分配到后端两台真实服务器。本次测试所有iRule均添加到第一台VE,所有iRule验证的工作均在第二台VE上完成,如果验证符合预期且页面能正常打开证明测试成功。2.2、基础配置ConfigurationVM-1VM-2RS_Self1.1.1.11.1.1.2EX_Self2.2.2.12.2.2.2VIPIP:2.2.2.10Port:80IP:2.2.2.100Port:80SNAT2.2.2.2001.1.1.200DefaultPersistentNoneNoneFallbackPersistentNoneNoneHealthMonitorsNoneNoneLoadBalancingMethodRoundRobinRoundRobinMembersIP:2.2.2.100Port:80IP:1.1.1.11Port:80IP:1.1.1.12Port:80三、应用层常用方法3.1、X-Forwarded-ForX-Forwarded-For简称XFF头,它虽然不是RFC中定义的标准请求头信息,但市面上几乎所有HTTP代理及负载均衡设备均支持该功能。标准格式如下:X-Forwarded-For:client1,proxy1,proxy2.3.1.1、配置步骤1.登录BIG-IPWebUI配置界面2.选择LocalTraffic下的Profiles3.点击Create4.选择HTTPprofile模板5.选择InsertX-Forwarded-For选项6.在InsertX-Forwarded-For选择栏中选择Enabled7.点击Clieck8.选择LocalTraffic下的VirtualServerList9.选择测试VS10.选择HTTPProfile选项11.选择XFF-HTTP12.点击UpdateXFF-HTTP配置图:VS绑定XFF-HTTP:3.1.2、验证1.登录第二台BIG-IPWebUI配置界面2.选择LocalTraffic下的iRule3.点击Create4.添加iRules(内容:log输出)5.选择LocalTraffic下的VirtualServerList6.选择测试VS7.添加创建后的iRules8.点击Finished9.登录SecureCRT10.查看log输出内容iRules内容:whenHTTP_REQUEST{#HTTP_REQUEST事件sethttp_header[HTTP::headerX-Forwarded-For]#将[HTTP::headerX-Forwarded-For]赋值给http_headerloglocal0.$http_header#输出log$http_header}iRule配置图:SecureCRT输出:Sep407:30:51marsinfotmm1[8758]:Rule/Common/Insert-headerHTTP_REQUEST:2.2.2.254Sep407:30:51marsinfotmm1[8758]:Rule/Common/Insert-headerHTTP_REQUEST:2.2.2.254Sep407:30:51marsinfotmm[8758]:Rule/Common/Insert-headerHTTP_REQUEST:2.2.2.254Sep407:30:51marsinfotmm[8758]:Rule/Common/Insert-headerHTTP_REQUEST:2.2.2.254Sep407:30:51marsinfotmm1[8758]:Rule/Common/Insert-headerHTTP_REQUEST:2.2.2.254页面输出:3.2、插入Header有时在和应用开发人员沟通源IP地址这个问题时,他们不太希望我们插入的名字为X-Forwarded-For,反而可能是某个设备的名字、特殊定义字段等(如:infosec)。因此,这个时候我们只能通过iRule来完成。3.2.1、配置步骤1.登录BIG-IPWebUI配置界面2.选择LocalTraffic下的iRules3.点击Create4.添加iRules5.选择测试VS6.添加创建后的iRules7.点击FinishediRule内容whenHTTP_REQUEST{#HTTP_REQUEST事件HTTP::headerinsertinfosec[IP::client_addr]#将变量infosec插入至HTTP::header,变量值为[IP::client_addr]}注:1、infosec为header名字2、[IP::client_addr]为infosec值。当然,由于事件为HTTP_REQUEST,如果使用[IP::remote_addr]也可以达到同样的效果。3.2.2、验证本次验证过程及配置步骤请参考3.1.2。iRule内容:whenHTTP_REQUEST{#HTTP_REQUEST事件setinfosec[HTTP::headerinfosec]#将[H