Apache-2.4

錯誤的客戶端 IP 從 Varnish 和 HAProxy 傳遞給 Apache

  • December 23, 2020

我有一個我正在使用的設置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 伺服器的後端定義中設置該屬性。

請刪除-bVarnish 命令行選項並將其替換為典型的-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 協議連接。

引用自:https://serverfault.com/questions/1047286