专栏首页YP小站Nginx 之 realip模块 使用详解

Nginx 之 realip模块 使用详解

realip 功能介绍

用途:当本机 Nginx 处于反向代理后端时可以获取到用户的真实IP地址

使用realip 功能需要 Nginx 添加 ngx_http_realip_module 模块,默认情况下是不被编译,如果需要添加,请在编译时添加 --with-http_realip_module 选项开启它。

realip 作用域

set_real_ip_fromreal_ip_headerreal_ip_recursive 都可以用于 httpserverlocation 区域配置。

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;

参考链接

  • https://cloud.tencent.com/developer/article/1521273
  • https://www.cnblogs.com/amyzhu/p/9610056.html

本文分享自微信公众号 - YP小站(ypxiaozhan),作者:YP小站

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 生产环境中helm v2升级v3版本遇到的疑难杂症

    Helm V3 与 V2 版本架构变化较大,数据迁移也比较麻烦,官方为了解决数据迁移问题,提供一个 helm-2to3 工具,本文基于 helm-2to3 工具...

    YP小站
  • Kubernetes Node资源预留

    Kubernetes 的节点可以按照 Capacity 调度。默认情况下 pod 能够使用节点全部可用容量。这是个问题,因为节点自己通常运行了不少驱动 OS 和...

    YP小站
  • AlertManager 钉钉报警

    https://github.com/yangpeng14/alertmanager-dingtalk-hook

    YP小站
  • php获取用户真实IP和防刷机制

    X-Forwarded-For(XFF):  是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段, 格式:c...

    smy
  • nginx之ngx_http_realip_module使用详解

    realip模块的作用是:当本机的nginx处于一个反向代理的后端时获取到真实的用户IP。

    随心助手
  • HTTP 规范中的那些暗坑

    HTTP 协议可以说是开发者最熟悉的一个网络协议,「简单易懂」和「易于扩展」两个特点让它成为应用最广泛的应用层协议。

    卤代烃
  • Go是如何实现protobuf的编解码的(2): 源码

    上一篇文章Go是如何实现protobuf的编解码的(1):原理 中已经指出了Go语言数据和Protobuf数据的编解码是由包github.com/golang/...

    大彬
  • 腾讯云防火墙全新升级,“三道墙”助力企业云安全防控更高效

    在云的时代,伴随更多企业客户转向公有云,基于云原生的防火墙技术逐步取代传统防火墙,成为守护企业云端安全的关键基础设施。近日,腾讯安全战略级新品——SaaS化云防...

    腾讯安全
  • LeetCode - 001

    Given an array of integers, return indices of the two numbers such that they add...

    咸鱼学Python
  • 【leetcode算法-搜索插入位置】

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    用户5640963

扫码关注云+社区

领取腾讯云代金券