通过 Apache 反向代理保留客户端 IP

通过 Apache 反向代理保留客户端 IP

我们希望在将请求从 Apache 代理到我们的应用程序时保留原始客户端 IP。

我们目前的设置如下:

CLIENT --123.2.3.4--> APACHE --127.0.0.1--> API

但希望它是:

CLIENT --123.2.3.4--> APACHE --123.2.3.4--> API

我知道我们可以在Forwarded-For标题中寻找原始远程地址;但我们的想法是,这不应该是忧虑对于我们的 API 应用程序,API 不需要知道它可能位于代理后面,而是每次都查找 IP 并找到它。

我们已经尝试过mod_proxymod_remoteip但均未成功。

答案1

如果可以的话,我会使用 mod_remoteip,但请注意,您必须将日志格式更改为使用 %a 而不是 %h 才能在日志中查看地址。

此外,答案实际上取决于您的应用程序(反向代理)如何通过 Apache 连接。

从根本上来说,某物必须将此信息传达给您的应用程序。如果您正在使用 mod_php、mod_fcgi、mod_wsgi、mod_proxy_ajp,那么这些已经为您完成了。

另一方面,如果您只是使用 mod_proxy_http,那么您需要确保通过标头(例如 X-Forwarded-For)传入必要的数据,并且使用 ProxyPreserveHost。同样,您需要发送在前端使用的是 http 还是 https,甚至使用的端口。所有这些对于使超链接和 cookie 公式正常工作都非常重要。否则,您必须明确告诉应用程序其前端设置是什么(这可能更简单)。

Apache Tomcat(与许多 J2EE 中间件容器一样)允许您在连接器中设置这种环境细节。

对于 Tomcat 工作负载,我通常会推荐 AJP,因为它非常简单;但如果混合使用 WebSockets(AJP 不支持),那么您必须回退到 HTTP,从而在后端进行配置。这不需要配置应用程序(从 J2EE 意义上来说),只需要配置包含的运行时环境。

某些东西、某些地方和某些人必须支持这种复杂性。应用程序供应商应该真正确保这一点能够奏效。如果说有什么不同的话,那就是随着工作负载转移到容器化环境,干净地支持此类环境变得更加重要。

相关内容