当前位置: 首页 > news >正文

ngx_http_realip_module 模块概述

一、使用场景

  • 日志记录
    记录真实客户端 IP 而非反向代理的 IP,有助于流量分析和安全审计。
  • 访问控制
    基于真实 IP 实现防火墙规则(allow/deny)或限流,而非误将上游 IP 视为客户端。
  • GeoIP、WAF、限速等功能
    模块化的上游真实 IP 支持与诸如 ngx_http_geoip_modulelimit_req、WAF 插件等配合使用。

二、示例配置

http {# 信任的上游地址列表(CIDR、单 IP 或 unix 域 socket)set_real_ip_from  192.168.1.0/24;set_real_ip_from  10.0.0.0/8;set_real_ip_from  unix:;# 指定从哪个请求头获取真实地址# 常见的有:X-Real-IP、X-Forwarded-For、proxy_protocolreal_ip_header    X-Forwarded-For;# 开启递归模式时,将跳过链中信任的上游,选取第一个非信任地址real_ip_recursive on;server {listen 80;location / {# 此时 $remote_addr 是真实客户端 IPproxy_pass http://backend;}}
}

三、指令详解

1. set_real_ip_from

Syntax:   set_real_ip_from address | CIDR | unix:;
Default:  —;
Context:  http, server, location
  • address | CIDR:IPv4/IPv6 网络或单地址,如 192.168.2.12001:db8::/32
  • unix::信任所有 UNIX 域套接字连接。
  • 用途:指定哪些上游代理地址可信,只有来自这些源的请求头中携带的 IP 才会被视为真实客户端。

注意

  • 支持主机名(1.13.1 起),解析后再进行匹配。
  • IPv6 支持自 1.2.1/1.3.0 起。

2. real_ip_header

Syntax:   real_ip_header field | X-Real-IP | X-Forwarded-For | proxy_protocol;
Default:  real_ip_header X-Real-IP;
Context:  http, server, location
  • field:HTTP 请求头名,常见有 X-Real-IPX-Forwarded-For
  • proxy_protocol:从 PROXY 协议头部获取地址,需先在 listen 中启用 proxy_protocol
  • 端口替换:若头部中同时包含 IP:PORT,则还可替换 $remote_port

3. real_ip_recursive

Syntax:   real_ip_recursive on | off;
Default:  real_ip_recursive off;
Context:  http, server, location
  • off(默认):取请求头最末尾(最后一个)IP,只要发现第一个可信代理,即替换为该代理后面的 IP。
  • on:递归查找,跳过所有可信代理,取第一个非信任地址,适用于多级反代场景。

四、内置变量

变量含义
$realip_remote_addr原始客户端 IP(被替换前的 $remote_addr
$realip_remote_port原始客户端端口(被替换前的 $remote_port

这些变量可用于日志或者后续条件判断,方便同时保留“原始代理IP”与“替换后真实IP”。

五、处理流程

  1. 接收请求
    Nginx 监听到请求,初始 $remote_addr 为 TCP 连接的对端地址。

  2. 匹配可信源
    检查该地址是否在任一 set_real_ip_from 列表中。

  3. 提取头部值
    读取 real_ip_header 指定的头部字段,按逗号拆分(若是 X-Forwarded-For,可能包含多级 IP)。

  4. 选取 IP

    • real_ip_recursive off:取列表末尾(最后一个)IP;
    • real_ip_recursive on:倒序遍历,跳过可信源,取第一个非信任 IP。
  5. 替换地址
    更新 $remote_addr(及可选 $remote_port),并记录旧值至 $realip_remote_addr

  6. 继续其它模块处理
    后续日志、WAF、限速等模块均以新的 $remote_addr 为准。

六、常见注意事项

  • 安全性
    仅信任可信网络或反向代理,避免客户端伪造 X-Forwarded-For 欺骗源 IP。
  • 多级代理
    开启 real_ip_recursive on 以正确获取最初客户端 IP;否则仅能获取到第一级代理前的 IP。
  • PROXY 协议
    使用 proxy_protocol 时,需要在 listen ... proxy_protocol; 中启用,并由上游(如 LVS、HAProxy)发送 PROXY 首部。
  • 端口保留
    若需要真实端口信息,可在头部中附加 <ip>:<port> 格式,并确保 Nginx 版本 ≥1.11.0。

通过 ngx_http_realip_module,可以在 Nginx 层面安全、灵活地恢复原始客户端 IP 和端口,为日志、限流、安全防护等功能提供可靠的基础。

相关文章:

  • 【DeepSeek论文精读】11. 洞察 DeepSeek-V3:扩展挑战和对 AI 架构硬件的思考
  • c++多线程debug
  • 符合Python风格的对象(再谈向量类)
  • Spring Web MVC————入门(3)
  • Go语言--语法基础5--基本数据类型--类型转换
  • Vue 3 中使用 md-editor-v3 的完整实例markdown文本
  • 网络编程套接字(二)
  • 高并发内存池|二、Common
  • 【JavaWeb】JDBC
  • 如何利用内网穿透实现Cursor对私有化部署大模型的跨网络访问实践
  • java中sleep()和wait()暂停线程的区别
  • [Java实战]Spring Boot整合Elasticsearch(二十六)
  • 大模型微调步骤整理
  • 第9章 组件及事件处理
  • Mac 在恢复模式下出现 旋转地球图标 但进度非常缓慢
  • Oracle 内存优化
  • java中的Servlet3.x详解
  • sparkSQL读入csv文件写入mysql
  • 10.8 LangChain三大模块深度实战:从模型交互到企业级Agent工具链全解析
  • 多模态大语言模型arxiv论文略读(八十一)
  • 三件珍贵标本开箱!中国恐龙大展5月26日在沪开幕,明星标本汇聚一堂
  • 上海位居全球40城科技传播能力第六名
  • 官方通报汕头违建豪宅“英之园”将强拆:对有关人员严肃追责问责
  • 跨越三十年友情,61岁余隆和60岁齐默尔曼在上海再度合作
  • 深圳南澳码头工程环评将再次举行听证会,项目与珊瑚最近距离仅80米
  • 埃尔多安:愿在土耳其促成俄乌领导人会晤