36
技術社區[雲棲]
Apache前端使用SLB 7層轉發,獲取客戶端真實IP的方法
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 https://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"

最後更新:2017-09-20 12:03:14