我有一组负载均衡的 Apache 服务器,运行 20 多个虚拟主机,位于 HAProxy 负载均衡器后面。我试图让 Apache 服务器在日志文件中记录实际的客户端 IP,以便有效地使用 fail2ban。网上有很多关于这方面的文章,比如这, 或者这,但他们描述的解决方案在我们的案例中似乎不起作用。
我让 HAProxy 发送 x-forwarded-for 标头,其中包含实际客户端的 IP(我已使用 tcpdump 检查了流量,它确实存在),但原始客户端 IP 未出现在 access_log 中,只有负载均衡器的 IP。我用来测试这一点的 vhost 的日志记录配置是:
CustomLog "/var/log/apache2/www.sitename.co.uk-access_log" "%h %{x-forwarded-for}i %a %l %u %t \"%r\" %>s \"%{Referer}i\" \"%{User-Agent}i\""
但是日志数据顽固地显示LB IP而没有其他任何内容,例如:
<HAProxy IP> - <HAProxy IP> - - [29/Oct/2020:13:37:08 +0000] "GET /wp-content/uploads//path/to/file.png HTTP/1.1" 304 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Tablet PC 2.0; Zoom 3.6.0; Microsoft Outlook 15.0.5285; Microsoft Outlook 15.0.5285; ms-office; MSOffice 15)"
...所以我显然遗漏了一些东西。但有人能告诉我是什么吗?
所用软件:Apache/2.4.43 (OpenSSL/1.1.1d PHP/7.4.6)、HAProxy 2.0.14,均在 OpenSuse 15.2 上运行
答案1
回答我自己的问题;这是因为大多数主机都使用 HTTPS。因此,HAProxy 上的前端是 TCP,这意味着“forwardfor”选项不会插入标头(因为这是 HTTP 前端的选项)。 一些虚拟主机不使用 HTTP,这就是为什么我在流量捕获中看到一些 XFF 标头,但大多数都使用,而且我测试的所有都使用 HTTPS。
我必须通过让 HAProxy 终止 HTTPS 并通过 HTTP 与后端 Web 服务器通信来解决这个问题。很抱歉浪费了大家的时间。