从转发的连接中读取“源 IP”

从转发的连接中读取“源 IP”

我的防火墙工作正常:来自互联网的连接被转发到 NGINX 服务器,然后进行相应分配,并且应用服务器(内部日志除外)正常工作。

我面临的问题与我们的应用程序服务器接收的 IP 有关:它们不是“客户端 IP”,而是当前的 NGINX IP。

考虑这个网络:客户端 IP 1、防火墙 IP 2、NGINX IP 3、Web 服务器 IP 4。

在防火墙处我们看到数据包被转发到 NGINX,但在 NGINX 处tcpdump我们看到来自自己的 NGINX IP 3 而不是原始源 IP 1 的传入连接。

关键在于,在 Web 服务器日志中,我们看到输入连接为 IP 3,而预期为 IP 1。

是防火墙或 NGINX 配置错误吗?有什么解决方法吗?

当前配置(/etc/nginx/sites-enabled/app.domain.com):

...
location ^~ / {
proxy_pass      http://10.0.0.11;
proxy_set_header        Host                    $host;
proxy_set_header        X-Real-IP               $remote_addr;
proxy_set_header        X-Forwarded-For         $proxy_add_x_forwarded_for;
proxy_set_header        X-Forwarded-Proto       $scheme;
}
...

答案1

这是正常操作。当 nginx 是反向代理时,它会打开到最终目标的连接,并从客户端代理到应用程序服务器。源 IP 不能是 nginx IP 地址以外的任何 IP 地址,否则 TCP 连接将不起作用。

您需要设置应用程序服务器以使用X-Real-IP标头中指定的 IP 地址,而不是来自 TCP 连接的 IP 地址。

答案2

这种情况的解决方案是更改 c# 代码,如下所示。没有对防火墙或 nginx 进行任何更改。

var userIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

先前失败的尝试:

var userIP = Request.ServerVariables["X_FORWARDED_FOR"];
var userIP = Request.ServerVariables["X-REAL-IP"];
var userIP = Request.ServerVariables["REMOTE_ADDR"];
var userIP = Request.UserHostAddress;

感谢所有贡献者帮助澄清问题不是出在防火墙也不是出在 nginx 配置上。

相关内容