美文网首页
nginx ---POST_READ阶段(7.7更新)

nginx ---POST_READ阶段(7.7更新)

作者: 温岭夹糕 | 来源:发表于2020-06-06 19:25 被阅读0次

对应文档地址: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

相关文章

网友评论

      本文标题:nginx ---POST_READ阶段(7.7更新)

      本文链接:https://www.haomeiwen.com/subject/xhxkzhtx.html