如果要通过多个代理服务器进行通信的情况下,可以使用mod_rpaf进行设置

想要实现的目标和背景

在正在运行的Apache Web服务器环境下,
在Web应用程序端,通过查看REMOTE_ADDR环境变量来进行访问控制;
通过使用Apache的日志(%h)来输出IP地址,然后根据此进行汇总统计,
在环境中进行访问限制(如使用fail2ban等)。

在这种环境下,如果想要在前端添加L7负载均衡器,或者想要添加代理型WAF,会怎样呢?

如果保持原样,REMOTE_ADDR环境变量将成为Apache所看到的最近的客户端,即这些代理服务器的IP地址,这将导致无法正确运行上述访问限制等。因此,需要安装一个中间件来将REMOTE_ADDR替换为客户端IP以解决这个问题。

另外,前提是关于 Apache2.2。听说还有2.4系列的版本,但我不太清楚详情。

mod_rpaf 是什么

原作者是Thomas Eibner开发的Apache模块。
在经过代理服务器的系统中,从X-Forwarded-For头中获取客户端IP并替换为REMOTE_ADDR。
详细信息请参阅以下文章。
https://heartbeats.jp/hbblog/2012/03/mod-rpaf.html
(本文不涉及安装方法和基本用法,请参考该文章。)

顺便提一下,“rpaf”是“反向代理添加转发”的缩写。

另外,原始網站已經無法訪問。
然後,mod_rpaf 已經被多人叉開。
這篇文章中提到的 mod_rpaf 是指上述的 HEARTBEATS 公司部落格中的以下內容。
https://github.com/ttkzw/mod_rpaf-0.6

如果要通过多个代理服务器进行设置

这篇文章的主题。

当只有一个代理服务器中间时,以上提到的HEARTBEATS公司的博客中的设置就足够了。

然而,如果需要经过多个代理服务器,则需要进行一些额外的设置。
具体而言:

    • 経由するプロキシサーバのIPアドレスを RPAFproxy_ips に追加

複数エントリは空白区切りで列挙

RPAFrecursive On の設定を追加

这样做的话,REMOTE_ADDR将从末尾开始逐个查找X-Forwarded-For头中的多个IP地址,并返回未被注册到RPAFproxy_ips中的第一个IP地址。
(如果设置为关闭,将简单地返回X-Forwarded-For最后一个条目)

Please provide the sentence that needs to be paraphrased in Chinese.

Noサーバ等outboundのIPアドレス1クライアントIP192.0.2.102プロキシサーバA10.0.0.203プロキシサーバB172.16.0.304Webサーバ192.168.0.40

假设通过1→2→3→4的路径。
(在上述信息中没有提及,但是假设No2的代理服务器具有全局IP地址,
No2至No4是封闭在私有网络中的。)

首先,如果没有进行任何设置,Web服务器接收到的REMOTE_ADDR 和 X-Forwarded-For 会如下所示。

X-Forwarded-For: 192.0.2.10,10.0.0.20
REMOTE_ADDR: 172.16.0.30 (第三个)

转发之前的 IP 地址:192.0.2.10,10.0.0.20
远程地址:172.16.0.30(第三个)

然后,引入mod_rpaf插件,并将RPAFrecursive设置为Off或不进行设置,情况将如下所示。

X-Forwarded-For: 192.0.2.10,10.0.0.20
REMOTE_ADDR: 10.0.0.20 (第二个IP地址,即X-Forwarded-For的最后一个条目)

当将RPAFrecursive On和RPAFproxy_ips设置为10.0.0.20和172.16.0.30时,会得到以下结果。

X-Forwarded-For: 192.0.2.10,10.0.0.20
REMOTE_ADDR: 192.0.2.10(第一个条目。在X-Forwarded-For中,它是尾部中未包含在RPAFproxy_ips中的地址)

广告
将在 10 秒后关闭
bannerAds