引言
在使用 Nginx 作为负载均衡,反向代理服务器时,后端服务只能看到 Nginx 服务器的地址,不能看到真实的客户端IP,在Nginx 中有一个名为 X-Forward-For
的 Header
,通常用于传递客户端的IP地址,但是这种方式存在一些安全问题,X-Forwarded-For
头信息可以被恶意用户伪造,从而绕过基于IP的访问限制,本文会将详细介绍如何在Nginx中配置,获取真实的客户端IP 地址,防止IP伪造,并确保后端能够获取到真实的客户端IP
X-Forwarded-For
当我们使用Nginx 获取客户端 真实IP地址时,我们一般会使用此方法
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
然后后端可以通过读取 Header 中的 X-Forwarded-For,获取客户端 IP 地址,但是 这个 Header是由客户端直接提供的,而且可能包含多个代理服务器的地址,这种情况可能会导致绕过基于IP地址的访问限制,记录错误的客户端IP地址,影响日志审计以及分析。
解决方法 使用 X-Real-IP
X-Real-IP
是 Nginx 设置的头信息,专门用于传递真实的客户端IP 地址,与X-Forwarded-For
不同的是,X-Real-IP
是由 Nginx 内部生成的,且客户端无法进行修改。
配置教程
在 Nginx 的配置文件中 增加如下配置
proxy_set_header X-Real-IP $remote_addr; # 传递真实的客户端IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 追加转发链
在日志格式中追加 $http_x_forwarded_for
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$http3"';
重启Nginx即可。
原理图
One comment
test