Apache-2.4
錯誤的客戶端 IP 從 Varnish 和 HAProxy 傳遞給 Apache
我有一個我正在使用的設置
Varnish/Hitch >> HAProxy >> Apache
。除了客戶端 IP 地址未正確傳遞到後端 Apache 伺服器的問題外,它可以正常工作。Apache 日誌顯示了執行 HAProxy 的機器的 IP 地址。我的 Varnish 命令行包含:
varnishd -b 127.0.0.1:8080 -a 127.0.0.1:8000,PROXY
搭便車有這個:
backend = "[127.0.0.1]:8000" write-proxy-v2 = on
HAProxy 配置有:
defaults option forwardfor mode http frontend CacheFrontend bind *:8080 backend apache server apache web01:80
在 Apache 中,我正在使用
remoteip_module
並擁有它httpd.conf
RemoteIPHeader X-Forwarded-For
根據我的閱讀,我沒有理由在使用此模組時更改 Apache 中的日誌格式。
我不確定配置錯誤在哪裡。
編輯:
這是一個簡短的 PHP 腳本,顯示了傳遞給 Apache 的內容:
<?php echo $_SERVER['HTTP_X_FORWARDED_FOR'] . PHP_EOL; echo $_SERVER['REMOTE_ADDR'] . PHP_EOL;
<redacted_client_ip>, 127.0.0.1 10.7.7.107
10.7.7.107
是 HAProxy 機器的 IP。
PROXY 協議絕對是要走的路,因為它傳輸原始客戶端 IP 地址而不管躍點數。
然而,為了使這項工作,所有躍點都應該了解 PROXY 協議。
漆
我沒有在您的配置概述中看到這一點,但您絕對應該
.proxy_header
在 Varnish 伺服器的後端定義中設置該屬性。請刪除
-b
Varnish 命令行選項並將其替換為典型的-f /etc/varnish/default.vcl
. 在您的default.vcl
文件中,您應該聲明您的後端並確保它使用PROXY。
default.vcl
這是該文件的範例:vcl 4.0; backend default { .host = "127.0.0.1"; .port = "8080"; .proxy = 2; }
如前所述,
-b
應該替換為-f
. 這可能是這樣的:varnishd -f /etc/varnish/default.vcl -a 127.0.0.1:8000,PROXY
HaProxy 和 Apache
就HaProxy而言:請確保傳入的 HaProxy 連接也使用 PROXY。
而對於 Apache,您可以選擇只讀取
X-Forwarded-For
標頭來獲取客戶端 IP 地址,或者也接受 PROXY 協議連接。