[英]Set REMOTE_ADDR to X-Forwarded-For in apache
在 Apache 位於反向代理(例如 Squid)之后的情況下,cgi 環境變量REMOTE_ADDR
獲取代理的地址而不是客戶端的地址。
但是,代理會設置一個名為X-Forwarded-For
的標頭來包含客戶端的原始 IP 地址,以便 Apache 可以看到它。
問題是,我們如何讓 Apache 用X-Forwarded-For
標頭中的值替換REMOTE_ADDR
,以便所有 Web 應用程序都能透明地看到正確的地址?
您可以為此使用 mod_rpaf。 http://stderr.net/apache/rpaf/
請注意,如果請求經過了多個代理,則 X-Forwarded-For 標頭可能包含 IP 地址列表。 在這種情況下,您通常需要最左邊的 IP。 您可以使用 SetEnvIf 提取它:
SetEnvIf X-Forwarded-For "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFFCLIENTIP=$1
請注意使用$1設置 XFFCLIENTIP 環境變量以保存正則表達式中第一組的內容(在括號中)。
然后您可以使用環境變量的值來設置標頭(或在 Apache 日志格式中使用它,以便日志包含實際的客戶端 IP)。
目前 apache 模塊 mod_remoteip 是推薦的方法; rpaf 沒有得到可靠的維護,可能會導致問題。
除了前面提到的mod_rpaf之外,似乎mod_extract_forwarded也將執行此功能。
mod_extract_forwarded
一個優點是它可以從EPEL用於 RHEL/CentOS 服務器,而mod_rpaf
不是。
看來,無論這兩個模塊讓你白名單代理服務器的整個子網,這就是為什么CloudFlare的開發人員創建自己的插件: mod_cloudflare其中,應該注意,不像其他兩個通用的工具; 它包含一個硬編碼的 CloudFlare 子網列表。
是的,我們可以做到這一點。
只需在您的 PHP.ini 中添加一個 auto_prepend_file,例如auto_prepend_file = "c:/prepend.php"
並在此文件中添加以下內容:
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
您需要 Apache 寬度RemoteIPHeader X-Real-IP
的 MOD_REMOTEIP 。
干杯,
吉雷馬赫
很遺憾,
在撰寫本文時,freshports.org、people.apache.org 或 gist.github.com 上的 backports 和 fork 都沒有工作。 它們都基於 apache httpd 2.3 的早期 alpha 版本,該版本既不兼容 2.2 也不兼容 2.4 的當前版本。
因此,在嘗試調整向后移植以創建適用於 httpd 2.2 的真正工作的過程中浪費了數小時的時間之后,我決定轉向 httpd 2.4。 在 httpd 2.4 中,mod_remoteip 可以順利工作,即使負載均衡器具有永久保持活動連接,它用於將來自不同實際客戶端 IP 地址的請求代理到后端。 我不確定其他模塊是否可以處理這種情況(更改同一連接內每個請求的客戶端 IP 地址)。
請記住,此值可以被欺騙。 有關跨站點腳本后果的真實示例,請參閱http://blog.c22.cc/2011/04/22/surveymonkey-ip-spoofing/ 。
您可以安裝模塊mod_extract_forwarded並將MEFaccept參數設置為 all。
從Apache 2.4 開始,有mod_remoteip內置模塊可以做到這一點。
啟用mod_remoteip
(例如a2enmod remoteip
)
創建可信 IP 范圍列表(您從中接受遠程 IP 標頭的 IP)。 您可以將它們放在conf/trusted-ranges.txt
類的文件中
將此行添加到 Apache 配置中:
RemoteIPTrustedProxyList conf/trusted-ranges.txt
更改日志文件格式以使用%a
而不是%h
來記錄客戶端 IP。
對於Cloudflare,您需要信任其所有 IP 范圍並使用自定義標頭CF-Connecting-IP
:
RemoteIPHeader CF-Connecting-IP
您可以像這樣獲得 Cloudflare 范圍:
curl https://www.cloudflare.com/ips-v4 > trusted-ranges.txt
curl https://www.cloudflare.com/ips-v6 >> trusted-ranges.txt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.