我已经安装以便从PHP、Apache 日志等中的标头mod_rpaf
获取用户的 IP 地址。X-Forwarded-For
不幸的是,我似乎必须通过设置明确设置该标头将受哪些 IP 的尊重RPAFproxy_ips
。
鉴于 ELB 没有静态 IP,我如何知道mod_rpaf
接受来自任何 IP 甚至任何 10.* IP 的标头?
答案1
您可以尝试使用mod_extract_forwarded
而不是mod_rpaf
— 它支持MEFaccept all
(如果您使用 RHEL/CentOS/other-clone,则该软件包已在 EPEL 中)。 的一个缺点mod_extract_forwarded
是X-Forwarded-For
和Forwarded-For
标头名称是硬编码的,不能像 中那样配置mod_rpaf
。
即使在 中也不支持 IP 范围mod_extract_forwarded
,但您可以配置防火墙以仅允许从某些 IP 范围直接访问 Apache,或者检查规则MEF_RPROXY_ADDR
中的环境变量。mod_rewrite
经过进一步思考,我发现此mod_extract_forwarded
配置存在问题 — 虽然mod_rpaf
不支持多个代理链,并且仅从X-Forwarded-For
标头中获取最后一个地址,但mod_extract_forwarded
尝试支持此功能并使用不属于受信任代理列表的最后一个地址(因此,如果请求已通过多个受信任代理,则将使用实际客户端地址而不是倒数第二个代理地址)。不幸的是,使用MEFaccept all
意味着mod_extract_forwarded
将信任所有代理,因此如果 ELB 代理仅将其数据附加到X-Forwarded-For
标头,而不是完全替换它,则客户端可以通过发送带有自己X-Forwarded-For
标头的请求来传递任何欺骗 IP。
然而,我找到了另一个解析X-Forwarded-For
标头的模块。最近的(不稳定的)Apache 版本有mod_remoteip模块,它显然支持代理地址的子网掩码。有一个反向移植到 Apache 2.2和一个Fedora 的 spec 文件;不幸的是,请求在 Fedora 中包含软件包停滞了。
答案2
从快速阅读源代码来看,似乎您无法做到这一点。您可以非常轻松地修改代码以接受任何来源(通过取消第 163 行的检查,这看起来像is_in_array(r->connection->remote_ip, cfg->proxy_ips) == 1
,但这似乎存在安全风险。
有没有办法在运行时询问 Amazon 您所支持的负载均衡器是什么?如果是这样,您可以动态生成配置...
答案3
我刚刚发现 CloudFlare 已经创建了自己的Apache 模块用于做这种事情,并且它确实支持范围的 CIDR 表示法。
IP 地址在源代码中是硬编码的,但由于他们提供了源代码,所以可以很容易地在其中添加您自己的范围。
源代码中的注释表明它源自远程IP地址修改器适用于Apache 2.3(或者 2.5,取决于您查看的是该页面的 URL 还是标题。)