对应文档地址:realip模块
参考文章:https://blog.csdn.net/q328730422/article/details/85318516
首先我们需要知道http的头部X-Real-IP和X-Forwarded-For用于存放经过反向代理的真实客户IP
两者的差别是一个是直接赋值,一个是递增如(假设真实IP为1.1.1.1)
X-Real-IP:1.1.1.1
X-Forwarded-For:2.2.2.2,1.1.1.1(2.2.2.2是经过代理的服务器IP)
realIp模块是POST_READ阶段的主要模块
在该模块中可获取用户的真实IP
--with-http_realip_module //用于安装该模块
当原始用户的请求经过代理(squid,proxy)转发之后,nginx接收到的请求的来源地址也就变成了该代理服务器的IP,于是乎nginx 就无法获取用户请求的真实IP地址了。
set_real_ip_from 代理服务器;
#如果请求来自代理服务器那么就执行下面操作
real_ip_header X-Forwarded-For;
# 设置$remote_addr的变量为X-Forwarded-For的最后一个值,或者X-Real-IP的值
real_ip_recursive off;
注意!当real_ip_recursive 为on时,set_real_ip_from中设置的可信地址将被过滤掉!
实验:
nginx配置如下(假设我的真实域名为10.10.10.10)
set_real_ip_from 10.10.10.10;
real_ip_header X-Forwarded-For;
real_ip_recursive off;
location / {
return 200 'realIP is $remote_addr\n';
}
此时不通过浏览器访问改为curl命令访问,即本机发起访问 假设我的真实域名为10.10.10.10
curl 域名/地址 -H 'X-Forwarded-For:1.1.1.1,10.10.10.10';
结果为 X-Forwarded-For的最后一个值即10.10.10.10
若设置 real_ip_recursive on 那么10.10.10.10将会被过滤掉,结果为其前一个即1.1.1.1
拓展:
关于反向代理获取真实ip的实践
假设 客户端访问经过以下顺序:
客户端->服务器A->服务器B
服务器A为服务器B的上游服务器,并反向代理服务器B
若不经过特殊处理 服务B 获取到的客户端IP永远是服务器A的。
服务器B获取真实IP的办法
服务器Anginx配置,即同时将真实IP的头部一并发送过去
location / {
proxy_pass http://服务器B的IP;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
服务器B配置
set_real_ip_from 服务器A;
real_ip_header X-Real-IP;
location / {
return 200 $remote_addr;
}
如何关闭NGINX版本信息
image.png暴露nginx版本信息容易让不怀好意的人找到对应版本的漏洞并发起攻击
解决?使用server_tokens
server_tokens off
image.png
网友评论