Nginx基础学习之realip模块的使用方法
前言
nginx模块分为两种,官方和第三方,我们通过命令 nginx -v 查看 nginx安装信息,可以看到 下面有关 --with的nginx启动加载的模块信息。
realip模块
用途 :当本机 nginx 处于反向代理后端时可以获取到用户的 真实ip地址 。
使用 : realip 功能需要 nginx 添加 ngx_http_realip_module 模块,默认情况下是不被编译,如果需要添加,请在编译时添加 --with-http_realip_module 选项开启它。
realip 作用域
set_real_ip_from 、 real_ip_header 和 real_ip_recursive 都可以用于 http 、 server 、 location 区域配置。
realip 部分参数解释
- set_real_ip_from :设置反向代理服务器,即信任服务器ip
- real_ip_header x-forwarded-for :用户真实ip存在 x-forwarded-for 请求头中
- real_ip_recursive :
- off :会将 real_ip_header 指定的http头中的最后一个ip作为真实ip
- on :会将 real_ip_header 指定的http头中的最后一个不是信任服务器的ip当成真实ip
http 头中的 x-forwarded-for、x-real-ip、remote address 解释
x-forwarded-for 位于http请求头,是http的扩展 header ,用于表示http请求端 真实ip 。
格式如下:
x-forwarded-for: client, proxy1, proxy2
nginx 代理一般配置为:
proxy_set_header host $host; proxy_set_header x-real-ip $remote_addr; proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
解释:
- x-forwarded-for :nginx追加上去的,但前面部分来源于nginx收到的请求头,这部分内容不是 很可信 。符合ip格式的才可以使用,否则容易引发 xss 或者 sql注入漏洞 。
- remote address :http协议没有ip的概念, remote address 来自于tcp连接,表示与服务端建立tcp连接的设备ip,因此,remote address无法伪造。
- x-real-ip :http代理用于表示与它产生tcp连接的设备ip,可能是其他代理,也可能是真正的请求端。
realip 功能举例说明
下面是一个简单的架构图:
假设一:
1、如果 nginx 没有使用 realip模块 ,第二台 nginx中 x-forwarded-for 请求是 1.1.1.1,但 remote_addr 地址是 2.2.2.2,这时应用服务可以通过 x-forwarded-for 字段获取用户真实ip。不过这里有点风险,如果中间多几层反向代理服务,就无法获取唯一一个用户真实ip。
2、如果 nginx 使用 realip模块 ,并如下设置;nginx 会取 x-forwarded-for 最后一个ip也就是 2.2.2.2 作为真实ip。最后应用服务拿到的地址也是 2.2.2.2,但事实这不是用户ip。
set_real_ip_from 2.2.2.2; set_real_ip_from 2.2.2.3; real_ip_header x-forwarded-for; real_ip_recursive off;
3、如果 nginx 使用 realip模块 ,并如下设置;由于 2.2.2.2 是信任服务器ip,nginx 会继续往前查找,发现 1.1.1.1 不是信任服务器ip,就认为是真实ip。但事实 1.1.1.1 也就是用户ip。最后应用服务也拿到唯一的用户真实ip。
set_real_ip_from 2.2.2.2; set_real_ip_from 2.2.2.3; real_ip_header x-forwarded-for; real_ip_recursive on;
总结
到此这篇关于nginx基础学习之realip模块的使用方法就介绍到这了,更多相关nginx realip模块使用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!