Cloudflare + Nginx 安全加固实战:从真实IP获取到全方位防护体系
当网站接入Cloudflare后,Nginx默认看到的都是Cloudflare的IP地址。虽然大多数教程会教你如何获取真实客户端IP,但很少有人告诉你如何利用这些信息构建完整的安全防护体系。本文将带你从基础配置升级到实战防护,打造多层次的网站安全防线。
1. 真实IP获取的进阶配置
在开始安全防护前,确保真实IP获取配置是最优的。标准的Cloudflare + Nginx配置通常这样设置:
set_real_ip_from 173.245.48.0/20; set_real_ip_from 103.21.244.0/22; # ...其他Cloudflare IP段 real_ip_header CF-Connecting-IP;但实际应用中,我们还可以优化以下几点:
- IP段自动更新:Cloudflare的IP段会定期变更,手动维护不现实。建议使用以下脚本每月自动更新:
#!/bin/bash CF_IPS_URL="https://www.cloudflare.com/ips-v4" CONF_FILE="/etc/nginx/conf.d/cloudflare.conf" echo "# Auto-generated at $(date)" > $CONF_FILE curl -s $CF_IPS_URL | awk '{print "set_real_ip_from " $0 ";"}' >> $CONF_FILE echo "real_ip_header CF-Connecting-IP;" >> $CONF_FILE nginx -t && systemctl reload nginx- 日志格式优化:在nginx.conf中修改日志格式,确保记录真实IP:
log_format main '$remote_addr - $realip_remote_addr [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';提示:使用
$realip_remote_addr变量可以获取到经过Cloudflare代理前的原始客户端IP。
2. 基于真实IP的访问频率控制
获取真实IP后,第一道防线就是限制异常访问频率。Nginx的limit_req模块是防CC攻击的利器。
2.1 基础限流配置
http { limit_req_zone $realip_remote_addr zone=one:10m rate=10r/s; server { location / { limit_req zone=one burst=20 nodelay; # ...其他配置 } } }这个配置表示:
- 每个真实IP每秒最多10个请求
- 允许突发20个请求
nodelay表示不延迟处理突发请求,直接拒绝超额请求
2.2 多级限流策略
针对不同URL路径设置不同的限流策略:
map $uri $limit_bucket { default "global"; ~^/api/ "api"; ~^/admin/ "admin"; } limit_req_zone $realip_remote_addr zone=global:10m rate=5r/s; limit_req_zone $realip_remote_addr zone=api:10m rate=20r/s; limit_req_zone $realip_remote_addr zone=admin:10m rate=2r/s; server { location / { limit_req zone=$limit_bucket burst=10; # ...其他配置 } }这种分层限流可以:
- 保护敏感后台(如/admin)更严格
- 给API接口更高限额
- 普通页面适中限制
3. 智能识别与封禁恶意流量
单纯的限流可能误伤正常用户,我们需要更智能的识别机制。
3.1 区分搜索引擎爬虫与恶意爬虫
map $http_user_agent $is_bad_bot { default 0; ~*(bot|crawl|spider|scan|python|curl|wget) 1; ~*(nmap|nikto|sqlmap) 1; "~*Googlebot" 0; "~*Bingbot" 0; } server { if ($is_bad_bot) { return 403; } }常见恶意爬虫特征:
- 无User-Agent或伪造UA
- 包含扫描工具关键词(nmap、sqlmap等)
- 非常规的爬虫名称
注意:需要定期更新恶意UA列表,避免误封合法爬虫。
3.2 基于地理位置的访问控制
使用ngx_http_geo_module模块:
geo $realip_remote_addr $allowed_country { default no; 1.0.0.0/24 yes; # 示例IP段 # 从MaxMind等数据库导入IP段 } server { if ($allowed_country = no) { return 403; } }可以结合MaxMind的GeoIP数据库实现更精确的地理围栏。
4. 高级防护:动态黑名单与挑战机制
对于更高级的攻击,我们需要动态防御策略。
4.1 Fail2ban联动配置
- 首先安装Fail2ban:
apt install fail2ban # Debian/Ubuntu yum install fail2ban # CentOS/RHEL- 创建Nginx规则配置文件
/etc/fail2ban/filter.d/nginx-cc.conf:
[Definition] failregex = ^<HOST>.*"(GET|POST).*HTTP.*" (404|503) .*$ ignoreregex =- 配置jail.local:
[nginx-cc] enabled = true port = http,https filter = nginx-cc logpath = /var/log/nginx/access.log maxretry = 100 findtime = 60 bantime = 3600这个配置会:
- 监控Nginx日志
- 1分钟内100次请求触发封禁
- 封禁1小时
4.2 人机验证挑战
对于可疑但不确认的流量,可以返回验证挑战:
location / { if ($http_cf_connecting_ip ~* "(123\.123\.123\.123|124\.124\.124\.124)") { add_header Set-Cookie "challenge=1; Path=/"; return 503; } if ($cookie_challenge) { # 这里可以插入JS挑战或CAPTCHA return 444; } }5. 监控与日志分析
防护措施需要配合监控才能发挥最大效果。
5.1 关键监控指标
| 指标 | 阈值 | 监控工具 |
|---|---|---|
| 请求频率 | >100r/s | Prometheus |
| 4xx错误率 | >5% | Grafana |
| 封禁IP数 | 突增 | Fail2ban |
| 爬虫比例 | >30% | ELK |
5.2 日志分析命令示例
查找高频访问IP:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20分析恶意请求模式:
grep -E 'nmap|sqlmap' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c6. 综合配置示例
最后给出一个完整的Nginx配置示例:
http { # Cloudflare真实IP配置 include conf.d/cloudflare.conf; # 限流区域定义 limit_req_zone $realip_remote_addr zone=global:10m rate=10r/s; limit_req_zone $realip_remote_addr zone=api:10m rate=30r/s; # 恶意UA检测 map $http_user_agent $is_bad_bot { default 0; ~*(nmap|sqlmap|scan) 1; } # 地理位置检测 geo $realip_remote_addr $block_country { default 0; include /etc/nginx/block_country.conf; } server { # 基础防护 if ($is_bad_bot) { return 403; } if ($block_country) { return 403; } location / { limit_req zone=global burst=20 nodelay; # 正常请求处理 } location /api/ { limit_req zone=api burst=50; # API处理 } # 动态挑战 location /challenge { if ($cookie_challenge_passed) { return 204; } return 503; } } }这套配置在实际项目中可以有效防御:
- 高频CC攻击
- 恶意爬虫扫描
- 特定地区攻击
- 自动化工具滥用
防护策略需要根据实际流量特点不断调整优化。建议先设置较宽松的限制,观察正常流量模式后再逐步收紧规则。