在Amazon ELB后面的mod_rpaf

我已经安装了mod_rpaf以从PHP,Apache日志等中的X-Forwarded-For头获取用户的IP地址。

不幸的是,它看起来像我必须通过RPAFproxy_ips设置明确设置哪些IP头将被尊重。

鉴于ELB没有一个静态的IP,我怎么能告诉mod_rpaf从任何IP,甚至任何10 *接受头。

您可以尝试使用mod_extract_forwarded而不是mod_rpaf – 它支持MEFaccept all (如果使用RHEL / CentOS / other-clone,则该软件包已经在EPEL中)。 mod_extract_forwarded一个缺点是X-Forwarded-ForForwarded-For头域名是硬编码的,并且不像mod_rpaf那样可configuration。

即使在mod_extract_forwarded也不支持IP范围,但是您可以将防火墙configuration为仅允许从某些IP范围直接访问Apache,或者检查mod_rewrite规则中的MEF_RPROXY_ADDR环境variables。


经过一番思考之后,我发现这个mod_extract_forwarded config有问题 – 虽然mod_rpaf不支持多个代理链,只是从X-Forwarded-For头中mod_extract_forwarded最后一个地址, mod_extract_forwarded试图支持这个,并使用最后一个地址不属于受信任的代理列表(因此,如果请求已经通过多个受信任的代理,则将使用实际的客户端地址而不是倒数第二个代理地址)。 不幸的是,使用MEFaccept all意味着mod_extract_forwarded将信任所有的代理,因此,如果ELB代理只是将它们的数据附加到X-Forwarded-For头,而不是完全replace它,客户端可以通过发送具有自己的X-Forwarded-For标题。

但是,我发现了另一个模块来parsingX-Forwarded-For头文件。 最近(不稳定)的Apache版本有mod_remoteip模块,这显然支持代理地址的子网掩码。 有一个Apache 2.2和Fedora规范文件的backport ; 不幸的是, 在Fedora中包含软件包的请求被阻止。

从源头上快速阅读,看起来你不可能。 你可以很容易地破解代码,只是接受任何来源(通过is_in_array(r->connection->remote_ip, cfg->proxy_ips) == 1在163行,看起来像is_in_array(r->connection->remote_ip, cfg->proxy_ips) == 1 ,但这似乎是一个安全风险。

有没有什么办法可以问Amazon,你在运行的负载平衡器是什么? 如果是这样,你可以在飞行中生成configuration…

我刚刚发现,CloudFlare已经创build了自己的Apache模块来完成这种事情,并且它支持范围的CIDR表示法。

IP地址在源代码中是硬编码的,但是由于它们提供了源代码,所以很容易在其中添加自己的范围。

源代码中的一条评论表明它是从mod_remoteip.c派生而来的,它在Apache 2.3中可用(或2.5,取决于您是查看URL还是该页面的标题)。