当存在 RemoteIPHeader X-Forwarded-For 时,Apache 不会记录 remoteIP

当存在 RemoteIPHeader X-Forwarded-For 时,Apache 不会记录 remoteIP

我正在使用 Apache/2.4.27

在 VirtualHost 中,我使用以下命令从 Loadbalancer 转发远程客户端 IP 标头:

RemoteIPHeader X-Forwarded-For

这是该虚拟主机所服务的应用程序所需要的。

这是主 httpd.conf 上下文中的日志格式。

LogFormat "%h (%{X-Forwarded-For}i) %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

当我在虚拟主机中列出 RemoteIPHeader X-Forwarded-For 时,Apache 会停止将远程客户端 IP 写入日志。

当我将其从 VirtualHost 中删除时,远程客户端 IP 开始再次出现在日志中。

有什么想法为什么RemoteIPHeader X-Forwarded-For不能使用(%{X-Forwarded-For}i)LogFormat 吗?

谢谢 !

答案1

代理层(Nginx)

proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        X-Real-IP       $remote_addr;

后端层 (Apache)

# Log format config
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" common
SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
CustomLog "logs/access_log" common env=forwarded

# Header config
RemoteIPHeader X-Real-IP
RemoteIPHeader X-Client-IP
RemoteIPInternalProxy 192.168.10.10 192.168.10.11

描述:

proxy_set_header- 指令设置 nginx 发送到后端的标头;因此在这个例子中,我们发送两个变量(到标头):X-Forwarded-ForX-Real-IP

X-转发- 在代理端,必须设置此标头应传递到后端并可从其层访问

真实IP- 它不会影响网页上所需的变量,但我们保持它处于启用状态,以便 Apache 服务器将客户端的地址放在日志中(您还需要设置日志格式本身):

### X-Real-IP enabled
172.217.20.206 - - [03/Jun/2017:11:12:11 +0200] "GET /tls-check.php?9832 HTTP/1.0" 200 1409
### X-Real-IP disabled
172.16.21.11 - - [03/Jun/2017:15:12:49 +0200] "GET /tls-check.php?13266 HTTP/1.0" 200 1448

卷曲

:~$ curl -H Cache-Control: no-cache -ks https://example.com/tls-check.php?${RANDOM} | grep "HTTP_X_FORWARDED_FOR\|HTTP_X_REAL_IP\|SERVER_ADDR\|REMOTE_ADDR"
[HTTP_X_FORWARDED_FOR] => 172.217.20.206
[HTTP_X_REAL_IP] => 172.217.20.206
[SERVER_ADDR] => 192.168.10.100
[REMOTE_ADDR] => 192.168.10.10

tls_check.php

<?php

echo '<pre>';
print_r($_SERVER);
echo '</pre>';
exit;

?>

答案2

如果您要使用 mod_remoteip,请将 %a 恢复为该格式。

在 bugzilla 中,mod_remoteip 会在从 %{X-Forwarded-For}i 中删除时填充 %a。因此,在具有一个受信任代理的简单情况下,由于 mod_remoteip,%a 将保存用于在 X-Forwarded-For 中查看的值

答案3

它对我有用。将 %h 替换为 %a

LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

答案4

我将其添加为答案以获取格式,而不是对@DaWe4444 正确答案的评论。虽然它是正确的,但我一开始并不理解。

为了阐明起见,我的最终配置如下:

RemoteIPHeader Client-ip
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy my.proxy.ip.address

它适用于 Debian 上 Apache 2.4.25 上游的 Apache Traffic Server。

我需要将 apache2.conf 中的组合日志格式行更改为:

-LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
+LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

一些方案要求根据 X-Forwarded-For 标头切换日志格式,但 mod_remoteip 会取消设置该标头,因此这些方案不适用于 mod_remoteip。由于 %h 会产生 DNS 查找成本(%a 只是客户端 IP),我很惊讶地发现它是默认设置。过去,禁用查询中的 DNS 是每个 Apache 管理员要做的第一件事之一;日志文件分析器将处理这一部分。

相关内容