如何配置NetScaler使得Apache能够记录ClientIP地..
时间:2010-12-20 来源:xing_jia
本人英语水平有限,如有歧义,请参见原文:http://support.citrix.com/article/CTX109350
说明:
本文档包含了关于配置Apache Web server 基于NetScaler设备指定的HTTP Header值,去记录client IP地址的方法
需求:
本例中,假设网络访问结构如下:
在这个拓扑结构中,Apache Server被安装在一个或多个NetScaler的后面,所有访问Apache的流量将会在通过NetScaler后才能到达。
备注:
· 本图描述了一个双臂结构的配置,不管怎样,本文其实同样也适合于单臂结构的配置
· 本文中假设NetScaler给Apache服务组正确配置了一个VIP,并通过已解析好的域名来访问
· 本功能模块在Apache V1.3和2.0上测试通过
· 本例中,10.2.3.4即为VIP地址
背景:
· 在上图描述的情境中,在网络层,发到WebServer的HTTP请求是从NetScaler的MIP地址发起的,于是其请求包中包含的原IP地址被设置为了MIP,即10.5.6.7。
· 在多数情形下,WebServer通过NetScaler的响应,也会按照源请求IP地址来将响应返回给客户端。这样,WebServer就被很好的隐藏在了内部,使其对真正的客户端不可见,客户端只能通过VIP,即10.2.3.4来访问WebServer。
· 但这同时也就造成了WebServer的log记录中,将所有的客户端地址就记录为NetScaler的MIP,即所有客户端的地址都是10.5.6.7。如果我们想基于客户端IP地址,来做一些关于账户登录信息统计、登录IP安全限制等任务时,就造成了麻烦和影响。
这就是我们要解决的问题
解决方法:
· 配置NetScaler,开启自定义HTTP Header Inserted功能,在转发的HTTP Header中插入标识
· 配置Apache,按照预定标识,将ClientIP记录进日志
详细配置:
1.配置NetScaler,对相应的Service或者Service Group开启自定义HTTP Header Inserted功能,在转发的HTTP Header中插入标识,本例中我们将标识定为“Client-IP”
命令行方式:
> set service <Service_Name> -cip ENABLED Client-IP
图形界面方式:
下面是一个NetScaler配置好以后,转发给Apache的请求包内容,自定义Header已经包含其中:
GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Client-IP: 10.60.1.166
2.配置Apache的Log输出,使其按照传输过来的HTTP Header中Client-IP的信息来记录访问日志
· 打开/opt/apache2/conf/httpd.conf文件,修改前最好备份一下
· 添加如下信息:
LogFormat "%{Client-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\"" ns-access
CustomLog <Lof_File_Path>/<Log_File_Name> ns-access
注意: 如过配置文件中已经存在该行,则你可以按需要对该行进行就该,日志文件的后续记录也将随之改变。如果是新添加此行,则将按照新格式创建一个新的日志文件
· 保存退出
· 重新启动Apache服务器
# /opt/apache2/bin/httpd –k restart
· 在所有需要的Apache服务器上重复执行以上配置
更多信息:
完整的http.conf配置和详细信息,请参考Apache HTTP server documentation,本例情形只是个例子
另外,如果想要使用更复杂的基于ClientIP的应用,请参考Custom Header Module for Apache 2.x to Process Client IP Address