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

Nginx在CDN加速或使用SLB代理后获取真实IP并实现并发访问限制(限流)

当用户访问网站时,在使用CDN或SLB的情况下,访问链路通常是这样的:

用户浏览器 → CDN节点/SLB节点 → 源服务器

在这种情况下,源服务器接收到的请求来源IP实际上是CDN或SLB节点的IP,而不是用户的真实IP。如果我们直接基于这个IP进行限流,就会出现以下问题:

  1. 限制了CDN/SLB节点而非真实用户
  2. 无法对真实的恶意用户进行有效拦截
  3. 限流策略失效

二、普通限流配置

在没有CDN/SLB的简单场景下,我们可以直接基于$binary_remote_addr进行限流:

## 以用户IP地址作为Key,每个IP地址最多有50个并发连接 limit_conn_zone $binary_remote_addr zone=TotalConnLimitZone:10m; limit_conn TotalConnLimitZone 50; limit_conn_log_level notice; ## 以用户IP地址作为Key,每个IP地址每秒处理10个请求 limit_req_zone $binary_remote_addr zone=ConnLimitZone:10m rate=10r/s; limit_req_log_level notice; ## 具体服务器配置 server { listen 80; location ~ \.php$ { ## 最多5个排队,由于每秒处理10个请求+5个排队, ## 你一秒最多发送15个请求过来,再多就直接返回503错误给你了 limit_req zone=ConnLimitZone burst=5 nodelay; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; } }

这种方式适用于用户直接访问源服务器的场景,但对于经过CDN/SLB代理的情况则不再适用。

三、CDN/SLB模式下的限流解决方案

1. 理解X-Forwarded-For头部

当CDN/SLB代理服务器将用户请求转发到后端服务器时,会在HTTP头中加入记录:

X-Forwarded-For: 用户IP, 代理服务器1-IP, 代理服务器2-IP, ...

经过多层代理后,用户的真实IP在第一个位置,后面会跟一串中间代理服务器的IP地址。

2. 获取真实IP的配置

http { ## 获取原始用户的真实IP地址 map $http_x_forwarded_for $clientRealIp { default $remote_addr; ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr; } ## 设置IP白名单,对内部的IP不限制 map $clientRealIp $limit { default $clientRealIp; xx.xx.xx.xx ""; } ## 以真实IP为单位,限制请求数,并返回429状态; limit_req_status 429; limit_req_zone $limit zone=ConnLimitZone:20m rate=5r/s; limit_req_log_level notice; ## 以真实IP为单位,限制该IP的并发连接数,并返回429状态; limit_conn_status 429; limit_conn_zone $limit zone=TotalConnLimitZone:20m; limit_conn TotalConnLimitZone 100; limit_conn_log_level notice; ## 以访问域名为单位,限制总并发链接数; limit_conn_zone $server_name zone=SumConnLimitZone:20m; } ## 具体Server配置 server { listen 80; location ~ \.php$ { ## 限制总并发连接数 limit_conn SumConnLimitZone 10000; ## 最多5个排队,由于每秒处理10个请求+5个排队, ## 你一秒最多发送15个请求过来,再多就直接返回429错误给你了 limit_req zone=ConnLimitZone burst=5 nodelay; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; } }

3. 配置说明

  1. map指令:用于从X-Forwarded-For头部提取用户真实IP
  2. 白名单机制:对特定IP(如内部服务器)不进行限流
  3. 三层限流策略
    • 基于真实IP的请求频率限制
    • 基于真实IP的并发连接数限制
    • 基于域名的总并发连接数限制

四、验证方法

1. 白名单测试

对于白名单内的服务器进行压测,应该全部通过。

2. 非白名单测试

对于不在白名单内的IP,最多允许通过10+5个请求,其余部分应该返回429错误。

3. 压测工具

CentOS一般自带siege压测工具:

yum -yinstallsiege# 使用方法siege -c3-r10-b https://xxxx.xx.com/api/xxxx# -c 3 表示3个用户# -r 10 表示访问10次# 以上表示:3个用户,每个用户访问10次请求,共计30次

五、调试技巧:Echo模块

为了验证配置是否正确,可以使用Nginx的echo模块进行调试:

1. 集成Echo模块

cd/usr/local/src# 下载echo模块并解压wgethttps://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gztarzxvf v0.61.tar.gz# 下载nginx并解压wgethttp://nginx.org/download/nginx-1.12.2.tar.gztar-xzvf nginx-1.12.2.tar.gzcdnginx-1.12.2/# 查看当前nginx的编译参数/usr/local/nginx/sbin/nginx -V# 在旧的编译参数基础上新增【--add-module=/echo模块的解压路径】参数,开始编译./configure --prefix=/usr/local/nginx/nginx --add-module=/usr/local/src/echo-nginx-module-0.61# make编译make-j2# 平滑升级nginxmv/usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.oldcp-f objs/nginx /usr/local/nginx/sbin/makeupgrade

2. Echo使用示例

server { listen 80; server_name yourdomain.com; ## 以下新增规则: ## 当用户访问 /ip 的时候,我们输出 $clientRealIp 和 $limit 变量, ## 看看这个变量值是不是真的 用户源IP 地址 location /ip { echo $clientRealIp; echo $limit; } }

通过访问http://xxx.xxx.cn/ip可以验证获取到的IP是否为用户真实IP。

六、最佳实践建议

  1. 合理设置限流参数:根据业务实际情况调整请求频率和并发连接数限制
  2. 维护白名单:将内部服务器、合作伙伴服务器等加入白名单
  3. 监控告警:建立完善的监控体系,及时发现异常流量
  4. 渐进式部署:先在测试环境验证,再逐步推广到生产环境
  5. 定期评估:根据业务发展定期评估和调整限流策略

结语

通过合理配置Nginx的限流模块,即使在复杂的CDN/SLB架构下,我们也能有效识别用户真实IP并实施精准的访问控制。这不仅能够保护服务器免受恶意攻击,还能确保正常用户的访问体验。在实际应用中,需要根据具体的业务场景和安全要求来调整相关参数,以达到最佳的防护效果。

http://www.cnnetsun.cn/news/105894.html

相关文章:

  • 开源免费!InternetTest 网络检测工具,打开即 Pro 版
  • 物以类聚,人以群分的KNN算法(上)
  • 如何快速掌握Obsidian剪藏工具:新手用户的完整操作指南
  • 【2025护网】面试及经验分享(非常详细),零基础入门到精通,看这一篇就够了
  • 【数据库】金仓数据库:不止于兼容,更致力于成为企业的增长引擎
  • 【开题答辩全过程】以 基于javaweb的高校招生管理系统设计与实现为例,包含答辩的问题和答案
  • 【阿里淘天大模型面试揭秘】:17个核心问题及独家解答,助你轻松通关终面!
  • JavaScript DOM 原生部分(二):元素内容修改
  • 风能太阳能供电的路灯智能控制系统(论文+源码)
  • 没有测试用例,怎么才能确保测试全面?
  • Jmeter分布式测试必踩坑,全部帮你排雷
  • 13.常见的异常类有哪些?
  • 【Q#量子编程效率革命】:揭秘VSCode重构工具的5大核心技巧
  • 为什么你的Buildx构建总失败?一文看懂构建上下文陷阱(90%的人都忽略了)
  • 【VSCode Jupyter量子模拟内核深度解析】:掌握高效量子计算开发的5大核心技巧
  • OpenBoard输入法:安卓平台智能输入终极解决方案
  • 终极方案:如何用SUSFS4KSU模块实现完美内核级Root隐藏
  • 完整Blender插件清单:从建模到渲染的终极工具指南
  • 【VSCode量子编程效率革命】:批量提交作业的5大核心技巧与实战指南
  • 2026破局:以营销自动化成熟度Macom模型为鞍,驰骋增长新赛道!
  • RookieAI_yolov8:基于YOLOv8的计算机视觉辅助系统技术解析
  • 网络安全专业全方位解析,这个专业能学明白,就业绝对是王者。从零基础入门到高薪就业,收藏这篇就够了!
  • 【量子编程进阶之路】:为什么顶级工程师都在用VSCode运行QML模型?
  • 32、打造家庭与小型办公网络安全防护体系
  • AI智能体:完整课程(初级)
  • 震惊!大模型在AIOps中竟有6大“死穴“!小白程序员避坑必看,从工具到智能要素的蜕变之路!
  • GSE宏编译器:魔兽世界玩家的技能循环自动化神器
  • DeeplxFile:突破文件翻译限制的终极解决方案
  • 针对机械设备行业一体化项目制管理解决方案
  • 别再问资质认证怎么查了!看这家公司如何用“大模型搜索”帮客户7天拿下高新认证