HAProxy & Apache 關於 (X-Forwarded-For)XFF 記錄的一些筆記

最近工作中需要用到 HAProxy 做為新舊網站架構中的 condition switch, 用來切換新舊的網站, 因為開發團隊有些網頁並沒有在新的網站上開發或轉移,對於特定符合條件的這些舊的網站的連接要切換回舊的網站,剩下的所有需求就要導向新網站,所以建議用 Reverse Proxy 來進行切換,當時在評估時主要只有考量 HAProxy 及 Nginx 這二個基本上都可以滿足我的需求,但為了簡單好管理(其實都很好管理),就用了HAProxy, 而以下會記錄一些常用且要特別記下來的地方幫助自己記憶。

X-Forwarded-For (XFF) 問題

主要就下面二行,這個意思是將新加入一個欄位叫 X-CLIENT-IP 並將原始的來源 IP 帶過去給 HTTP Header, 設了了個並重啟 haproxy 服務後應該就可以在 HTTP Header 中看到這個欄位,預設應該會會有一個叫 X-Forwarded-For,但如果 Client 經過 Proxy1 及 LoadBalancer 則會在這個欄位看到如 SRC_IP Proxy1 Loadbalancer 這樣的資訊在這一個欄位中, 因為我對Client IP  有興趣而已,所以單獨拉出這個欄位來記錄或檢索用.

option forwardfor
http-request add-header X-CLIENT-IP %[src]

X-Forward-HTTP-Header

Apache Log 記錄 Source Client IP 的問題

但在 HTTP header 中加入這個欄位,預設 Apache Log 並沒有記錄這個X-Forward-For 欄位資訊,所以一起連。Apache Log 的 format 一起改一下吧,如果使用。IIS 也要記得參照一下格式,對應的改一卜,才不會發現分析記錄時看到的都是不是預期的 IP Address.

Apache 就改 /etc/httpd/conf/httpd.conf 中,找一下 LogFormat 字串,將原來的 mark 掉換成下面這幾行後存檔重啟 httpd 就可以了.

[code lang="bash"]# Adding for record X-Forwarded-For(XFF) to Apache Log
 LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
 LogFormat "%{X-Forwarded-For}i %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" proxy
 SetEnvIf X-Forwarded-For "^.*..*..*..*" forwarded
 CustomLog "logs/access_log" combined env=!forwarded
 CustomLog "logs/access_log" proxy env=forwarded[code lang="bash"]

 

Nginx 記錄檔格式設定的問題

若是用 Nginx 為你的 Web Server 就參閱下面這個連結改 nginx.conf
https://ma.ttias.be/nginx-access-log-log-the-real-users-ip-instead-of-the-proxy/

簡單說就是改 nginx 在 http{} 段中,找到一行 log_format.

log_format main '$http_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent "$http_referer" '
'"$http_user_agent"' ;

原來的欄位是 $remote_addr 就改成 $http_x_forwarded_for 

記得將 access_log 這行後面加上 main 用來設定為主要記錄格式

access_log      /var/www/site/logs/access.log main;

 

如果接下來還有時間再來補充一下 Haproxy 及 Nginx 較進階的設定與參數.

IIS 記錄檔格式設定的問題

補充一下: 若是要改 IIS LogFormat 可以參閱下面這個連結去加入XFF.
https://www.loadbalancer.org/blog/iis-and-x-forwarded-for-header/

Author: