Apache 前端使用负载均衡SLB 7层(http/https)转发,Apache如何获取客户端真实IP?
答案是通过HTTP头中的X-Forwarded-For 进行获取,SLB相当于一个代理,在转发HTTP请求时,会把客户端真实IP地址,加入到 X-Forwarded-For ,ECS上的Apache,可以进行配置取出X-Forwarded-For 记录的客户端真实ip。
下面介绍Apache如何进行配置。
需要安装一个Apache的第三方模块:mod_rpaf
这个模块也有好几个版本,建议安装 github上的:https://github.com/y-ken/mod_rpaf
好处是这个版本的模块,配置时支持IP段匹配的方式
(Support for partial IP address as '192.168.' for RPAFproxy_ips.)
以Centos6.8 yum安装的Apache为例 。
其他系统的安装方法,可以参考github上说明 https://github.com/y-ken/mod_rpaf
1、执行命令安装模块mod_rpaf
yum localinstall http://y-ken.github.com/package/centos/6/x86_64/mod_rpaf-fork-0.6-5.el6.x86_64.rpm
安装后会自动生成mod_rpaf的配置文件
/etc/httpd/conf.d/rpaf.conf
模块放在
/etc/httpd/modules/mod_rpaf-2.0.so
检查配置文件和模块都有了,说明已经正常安装成功。
ls /etc/httpd/conf.d/rpaf.conf
ls /etc/httpd/modules/mod_rpaf-2.0.so
2、接下来修改模块 mod_rpaf 的配置文件
vi /etc/httpd/conf.d/rpaf.conf
在默认配置的基础上,修改2行配置 RPAFproxy_ips 和 RPAFsethostname
RPAFproxy_ips: 设置SLB的内网IP地址,ip地址信息参考:https://help.aliyun.com/document_detail/27660.html
设置的IP地址可以用IP段的形式,多个IP之间空格隔开,注意SLB的内网IP段掩码,其中有 10 位和 15 位的掩码 100.64.0.0/10 ,100.116.0.0/15 可以合并可以写成 100.
RPAFsethostname: 修改为On
修改后的配置内容
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFproxy_ips 10.158. 10.159. 10.49. 100. 100.109. 100.97.
RPAFheader X-Forwarded-For
RPAFsethostname On
RPAFsethttps Off
RPAFsetport Off
3、修改完配置后,重启Apache
service httpd restart
然后查看Apache的访问日志,已经可以正常记录客户端真实访问Ip。
其中 HEAD / HTTP/1.0 是SLB的健康检查,
100.116.186.58 - - [20/Sep/2017:11:42:48 +0800] "HEAD / HTTP/1.0" 200 - "-" "-"
100.116.209.46 - - [20/Sep/2017:11:42:48 +0800] "HEAD / HTTP/1.0" 200 - "-" "-"
117.73.243.50 - - [20/Sep/2017:11:42:49 +0800] "GET / HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
![_](https://yqfile.alicdn.com/bc588aa4707c27c44637fb72f03835179654b8e8.png)