我的防火墙工作正常:来自互联网的连接被转发到 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 配置上。