1. 项目背景与核心需求
在Web服务架构中,Nginx作为反向代理服务器被广泛使用。当网站启用CDN服务后,所有客户端请求都会先经过CDN节点,这使得Nginx默认获取到的客户端IP实际上是CDN节点的IP地址而非真实用户IP。这种场景下,传统的IP黑名单机制就会失效。
最近在维护一个日均PV超过300万的电商平台时,我们就遇到了恶意爬虫通过CDN节点发起高频请求的问题。由于无法获取真实客户端IP,常规的封禁措施完全不起作用。经过排查发现,这些恶意请求的特征是User-Agent中包含"Python-urllib/3.11"等爬虫标识,但直接封禁这些UA又会误伤正常API调用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 关键技术原理解析
2.1 HTTP头部传递机制
当请求经过CDN时,标准的X-Forwarded-For头部会被追加客户端真实IP。例如:
code复制X-Forwarded-For: 客户端真实IP, CDN节点IP
多层代理情况下会形成IP链:
code复制X-Forwarded-For: 客户端IP, 代理1IP, 代理2IP, ...
2.2 Nginx的realip模块
Nginx的ngx_http_realip_module模块可以重写$remote_addr变量。启用该模块后:
nginx复制set_real_ip_from CDN_IP_RANGE;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
set_real_ip_from指定可信代理IP段real_ip_header定义IP来源头部real_ip_recursive启用递归解析
3. 完整实施方案
3.1 环境准备与验证
首先确认Nginx编译时包含realip模块:
bash复制nginx -V 2>&1 | grep -o realip_module
测试当前获取的IP信息:
nginx复制location /ipinfo {
return 200 "$remote_addr\n$http_x_forwarded_for";
}
3.2 基础配置模板
nginx复制http {
# 定义CDN IP段(以Cloudflare为例)
geo $realip_trusted {
default 0;
103.21.244.0/22 1;
104.16.0.0/13 1;
# 其他CDN IP段...
}
server {
set_real_ip_from $realip_trusted;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
location / {
# 获取真实IP后可用于访问控制
if ($remote_addr = "1.2.3.4") {
return 403;
}
# 正常业务逻辑...
}
}
}
3.3 动态黑名单管理
结合map实现批量封禁:
nginx复制map $remote_addr $blocked_ip {
default 0;
"1.2.3.4" 1;
"5.6.7.8" 1;
# 其他黑名单IP...
}
server {
if ($blocked_ip) {
return 444; # 静默关闭连接
}
}
4. 高级防护策略
4.1 频率限制模块
nginx复制limit_req_zone $remote_addr zone=api_limit:10m rate=10r/s;
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
# 业务逻辑...
}
4.2 综合防护方案
nginx复制geo $abuse_check {
default 0;
# 异常User-Agent
~*(python|curl|wget) 1;
# 敏感路径探测
~*(admin|wp-login) 1;
}
map $remote_addr$abuse_check $block_rule {
default 0;
"~*1.2.3.41" 1; # IP+行为双重匹配
}
server {
if ($block_rule) {
access_log /var/log/nginx/block.log;
return 444;
}
}
5. 运维实践要点
5.1 日志记录规范
建议日志格式包含:
nginx复制log_format main '$remote_addr - $realip_remote_addr [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
5.2 常见问题排查
-
IP获取不正确
- 检查CDN是否正确传递XFF头部
- 验证real_ip_recursive设置
- 测试直接访问是否绕过CDN
-
封禁失效
- 确认Nginx配置重载生效
- 检查IP匹配规则是否被覆盖
- 验证防火墙规则优先级
-
性能影响
- 大量正则匹配会增大CPU负载
- 建议将静态规则放在map外层
- 复杂检查建议使用Lua脚本
6. 安全加固建议
- 定期审计CDN IP段变化
- 对管理接口实施二次认证
- 敏感操作增加验证码防护
- 关键API启用签名校验
- 配置WAF规则协同防护
在实际生产环境中,我们通过这套方案成功将恶意请求降低了92%。一个特别要注意的细节是:当使用多个CDN服务商时,必须确保所有CDN的IP段都在set_real_ip_from中声明,否则会出现部分IP无法正确解析的情况。
