Cloudflare + Nginx 安全加固必备:除了获取真实IP,还能用这些配置防爬虫和CC攻击
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_URLhttps://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中修改日志格式确保记录真实IPlog_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 zoneone:10m rate10r/s; server { location / { limit_req zoneone burst20 nodelay; # ...其他配置 } } }这个配置表示每个真实IP每秒最多10个请求允许突发20个请求nodelay表示不延迟处理突发请求直接拒绝超额请求2.2 多级限流策略针对不同URL路径设置不同的限流策略map $uri $limit_bucket { default global; ~^/api/ api; ~^/admin/ admin; } limit_req_zone $realip_remote_addr zoneglobal:10m rate5r/s; limit_req_zone $realip_remote_addr zoneapi:10m rate20r/s; limit_req_zone $realip_remote_addr zoneadmin:10m rate2r/s; server { location / { limit_req zone$limit_bucket burst10; # ...其他配置 } }这种分层限流可以保护敏感后台如/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联动配置首先安装Fail2banapt 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 challenge1; Path/; return 503; } if ($cookie_challenge) { # 这里可以插入JS挑战或CAPTCHA return 444; } }5. 监控与日志分析防护措施需要配合监控才能发挥最大效果。5.1 关键监控指标指标阈值监控工具请求频率100r/sPrometheus4xx错误率5%Grafana封禁IP数突增Fail2ban爬虫比例30%ELK5.2 日志分析命令示例查找高频访问IPawk {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 zoneglobal:10m rate10r/s; limit_req_zone $realip_remote_addr zoneapi:10m rate30r/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 zoneglobal burst20 nodelay; # 正常请求处理 } location /api/ { limit_req zoneapi burst50; # API处理 } # 动态挑战 location /challenge { if ($cookie_challenge_passed) { return 204; } return 503; } } }这套配置在实际项目中可以有效防御高频CC攻击恶意爬虫扫描特定地区攻击自动化工具滥用防护策略需要根据实际流量特点不断调整优化。建议先设置较宽松的限制观察正常流量模式后再逐步收紧规则。