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

用 NGINX 还原真实客户端 IP ngx_mail_realip_module

一、模块作用与使用前提

  • 作用:解析 TCP 会话第一行的 PROXY 协议头,将客户端 IP/端口写回 NGINX 的内部变量,使后续 ngx_mail_proxy_module、认证模块、日志模块都能获取真实来源。

  • 前提:监听指令中必须启用 proxy_protocol,例如:

    listen 110 proxy_protocol;   # POP3
    listen 143 proxy_protocol;   # IMAP
    listen 25  proxy_protocol;   # SMTP
    

二、核心指令:set_real_ip_from

set_real_ip_from address | CIDR | unix:;
  • address / CIDR:信任的上游代理 IP 或网段,只有来自这些地址的连接才会使用 PROXY 头信息。

  • unix::表示所有 UNIX 域套接字都被信任(仅当前端通过 listen unix:... proxy_protocol 时生效)。

  • 示例

    mail {server {listen 110 proxy_protocol;listen 143 proxy_protocol;listen 25  proxy_protocol;# 仅信任前端 LB 的 IP 段set_real_ip_from 192.168.1.0/24;set_real_ip_from 10.0.0.5;set_real_ip_from 2001:db8::/32;}
    }
    

三、工作流程

  1. TCP 握手后,NGINX 在 listen … proxy_protocol 模式下,先读取一行 PROXY 协议头(如 PROXY TCP4 203.0.113.5 198.51.100.10 54321 110)。
  2. 信任检查:检查源连接的上游代理 IP(此例中为 198.51.100.10)是否在 set_real_ip_from 列表中;
  3. 替换变量:如果信任,则将内部变量 $remote_addr 设置为 203.0.113.5$remote_port 设置为 54321
  4. 继续后续流程:邮件协议解析、认证、转发、日志等都以新地址为准。

四、常见场景与最佳实践

  1. 与 L4 负载均衡器配合

    • 在 NGINX 前置 F5、HAProxy、云厂商内网 LB 等配置 PROXY 协议;
    • 后端 NGINX 用 listen … proxy_protocol + set_real_ip_from lb_ip 恢复客户端 IP。
  2. 保证安全性

    • 严格控制 set_real_ip_from 范围,只信任可信网络或单一 LB 实例,避免客户端伪造 PROXY 头。
    • 若中间有多级代理,可列出所有跳数的 IP。
  3. IPv6 环境支持

    • 既可写单个地址 2001:db8::1,也可写网段 2001:db8::/48
  4. UNIX 域套接字

    • 当邮件代理链路通过 unix:/var/run/nginx.sock proxy_protocol; 时,加入 set_real_ip_from unix:;

五、排障与验证

  1. 日志验证

    • 打开 mail_logerror_log,在转发到后端前后分别记录 $remote_addr,确认地址已被替换。
  2. 抓包检查

    • tcpdump 抓取 110/143/25 端口,观察首行是否有 PROXY …
  3. 拒绝伪造

    • 若要测试拒绝功能,可尝试从非信任 IP 连入,NGINX 应忽略 PROXY 头并仅记录真实连接源。

六、小结

通过简单的 listen … proxy_protocolset_real_ip_from 配置,ngx_mail_realip_module 就能让 NGINX 在邮件代理中完美恢复客户端真实 IP/端口,无缝集成到后续的认证、日志、限流、反垃圾等模块中,为高可用、高安全的邮件网关保驾护航。

相关文章:

  • pikachu靶场通关笔记05 XSS关卡01-反射型GET
  • GitHub开源|AI顶会论文中文翻译PDF合集(gpt-translated-pdf-zh)
  • Chrome/ Edge 浏览器弹出窗口隐藏菜单地址栏
  • 解决微信小程序中 Flex 布局下 margin-right 不生效的问题
  • 迁移学习模型构建指南(Python实现)
  • 【C/C++】高性能网络编程之Reactor模型
  • 5.28本日总结
  • 青少年编程与数学 02-020 C#程序设计基础 09课题、面向对象编程
  • IO 中的阻塞、非阻塞、同步、异步及五种IO模型
  • 如何更新和清理 Go 依赖版本
  • flutter使用html_editor_enhanced: ^2.6.0后,编辑框无法获取焦点,无法操作
  • 4.8.4 利用Spark SQL实现分组排行榜
  • 2021年认证杯SPSSPRO杯数学建模D题(第二阶段)停车的策略全过程文档及程序
  • 手机如何压缩文件为 RAR 格式:详细教程与工具推荐
  • python:selenium爬取网站信息
  • 华为手机用的时间长了,提示手机电池性能下降,需要去换电池吗?平时要怎么用能让电池寿命长久一些?
  • 8卡910B4-32G测试Qwen2.5-VL-72B-instruct模型兼容性
  • 什么是数字化转型,如何系统性重构业务逻辑
  • SD-WAN 与传统网络方案组合应用:降本增效的政务网建设新策略
  • mac 下安装Rust Toolchain(Nightly)
  • 我国政府网站建设的现状/网络营销是做什么的工作
  • 在网站建设工作会议上的讲话/建立公司网站需要多少钱
  • 优化公司网站/沈阳全网推广公司哪家好
  • 上海网站备案号查询/关键词
  • 电子商务网站建设精品课程/泰州百度seo公司
  • 福田做网站公司/seo工程师招聘