簡體   English   中英

在 apache 中將 REMOTE_ADDR 設置為 X-Forwarded-For

[英]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內置模塊可以做到這一點。

  1. 啟用mod_remoteip
    (例如a2enmod remoteip

  2. 創建可信 IP 范圍列表(您從中接受遠程 IP 標頭的 IP)。 您可以將它們放在conf/trusted-ranges.txt類的文件中

  3. 將此行添加到 Apache 配置中:

     RemoteIPTrustedProxyList conf/trusted-ranges.txt
  4. 更改日志文件格式以使用%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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM