logo

Nginx反向代理及获取真实的客户端IP地址

2024-08-22

在使用Nginx作为反向代理服务器时,获取客户端的真实IP地址是一个常见的需求。由于经过代理后,请求到达Nginx的实际IP是代理服务器的地址,因此需要通过特定的配置来获取原始请求中的客户端IP。


Nginx提供了$remote_addr变量来获取与服务器直接建立TCP连接的客户端真实IP地址。然而,如果客户端通过多个代理或负载均衡器连接到Nginx,$remote_addr将只反映最后一个代理的IP地址。为了获取经过多个代理的真实客户端IP,可以使用以下配置方法 :


设置real_ip_header和set_real_ip_from指令:


real_ip_header:定义Nginx从哪个HTTP头部获取客户端的真实IP地址。通常设置为X-Forwarded-For或X-Real-IP。

set_real_ip_from:定义受信任的代理服务器的IP地址或IP范围,Nginx将从这些代理转发的请求中获取真实IP。

配置示例:


nginx

http {

    real_ip_header X-Forwarded-For;

    set_real_ip_from  192.0.2.0/24;  # 受信任的代理IP段

    server {

        listen 80;

        server_name yourdomain.com;

        location / {

            proxy_pass http://backend;

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        }

    }

}

上述配置中,proxy_set_header指令用于设置转发请求时的HTTP头,确保后端服务器能够接收到真实的客户端IP地址。


注意事项:


确保代理服务器或负载均衡器已正确设置,能够在请求头中添加或保留X-Forwarded-For或X-Real-IP。

如果使用CDN服务,需要检查CDN配置,确保它不会移除或修改这些HTTP头部。

后端应用获取真实IP:


在Java应用中,可以通过请求头X-Forwarded-For或X-Real-IP获取客户端的真实IP地址。示例代码如下:

java

public String getClientIP(HttpServletRequest request) {

    String ipAddress = request.getHeader("x-forwarded-for");

    if (ipAddress == null) {

        ipAddress = request.getHeader("X-Real-IP");

    }

    return ipAddress;

}

通过这些配置,即使在使用反向代理的情况下,也能够确保获取到客户端的真实IP地址,这对于日志记录、访问控制、速率限制等场景非常重要

文章地址: https://www.nnzv.com/article/113.html
相关阅读: