检查访问日志,发现用户登录的IP来自反向代理服务器。
设置如下
www.abc.com -> reversed proxy to my server 123.123.123.123
有没有办法配置 http 访问日志来跟踪反向代理服务器后面的实际传入 IP?
答案1
您正在寻找X-Forwarded-For
标头。任何称职的代理都会将此标头添加到其转发的 HTTP 请求中。
如果您的整个网站都采用此代理,那么您需要找到LogFormat
与其相关的内容,通常如下所示:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
并将标题添加到它(或换出%h
只会是你的反向代理)像这样:
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
如果您不想重新定义combined
日志格式,那么请创建自己的格式:
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined_proxy
CustomLog /path/to/logfile.log combined_proxy
%{<header>}i
是一种将任何其他请求标头放入日志文件的方法。
笔记:该标头不一定总是单个 IP 地址。如果请求来自多个代理,那么您将获得一个逗号分隔的列表,格式为:client, proxy1, proxy2
;您可能需要更新脚本或日志抓取工具以适应这种情况。
答案2
就在这里。
对于当前版本的 Apache:mod_rpaf
对于 2.3 分支之后的任何版本:mod_remoteip
这两个命令都会用来自任何受信任的反向代理REMOTE_ADDR
的传入标头中的最后一个 IP 替换正在运行的 Apache 进程中的变量X-Forwarded-For
。此 IP 地址也将记录在您的标准 Apache 日志中,而无需对其进行任何更改。
这个变量也可用于您的 PHP 代码,因为$_SERVER['REMOTE_ADDR']
它是您通常期望远程 IP 地址所在的位置。
这些模块所需的唯一配置是向它们提供可信反向代理列表。
从安全角度来看,这些报头可以被添加、删除、伪造,甚至可能被篡改。无法保证你从此报头获得的任何 IP 地址都是正确的真的访问者的 IP 地址。列表中的最后一个 IP 地址(由您信任的反向代理添加)是您唯一可以确定的 IP 地址。