一、分层防御体系架构
二、cc 攻击防御策略
1. 请求频率限制(核心防御)
# 在 http 块中定义限制区域 http { # 定义请求限制区域 limit_req_zone $binary_remote_addr zone=req_perip:10m rate=10r/s; limit_req_status 429; # 自定义限流状态码 # 定义并发连接限制 limit_conn_zone $binary_remote_addr zone=conn_perip:10m; }
2. 关键位置应用限流
server { # 登录接口严格限制 location = /login { limit_req zone=req_perip burst=5 nodelay; limit_conn conn_perip 3; proxy_pass http://backend; } # api 接口限制 location /api/ { limit_req zone=req_perip burst=10; limit_conn conn_perip 5; proxy_pass http://backend; } # 静态资源宽松限制 location ~* \.(js|css|png|jpg)$ { limit_req zone=req_perip burst=20; access_log off; # 减少日志压力 } }
3. 人机验证挑战
location / { # 当请求超过阈值时重定向到验证页面 error_page 429 = @verify; limit_req zone=req_perip burst=15 nodelay; # 正常请求处理 proxy_pass http://backend; } location @verify { # 返回验证码挑战 add_header content-type text/html; return 200 '<html><body> <h1>请验证</h1> <script src="https://challenges.cloudflare.com/turnstile/v0/api.js"></script> <div class="cf-turnstile" data-sitekey="your_site_key"></div> </body></html>'; }
三、ddos 防御策略
1. 连接限制配置
# 全局连接限制 events { worker_connections 4096; # 根据服务器性能调整 } http { # 限制单个ip的连接数 limit_conn_zone $binary_remote_addr zone=conn_limit_perip:10m; limit_conn conn_limit_perip 50; # 限制每个连接的速率 limit_rate 500k; # 全局默认限速 # 限制请求体大小 client_max_body_size 10m; }
2. 慢连接防护
http { # 防止慢速攻击 client_body_timeout 10s; # 请求体超时 client_header_timeout 10s; # 请求头超时 keepalive_timeout 15s; # 保持连接超时 send_timeout 10s; # 发送响应超时 # 关闭不必要的http方法 if ($request_method !~ ^(get|head|post)$ ) { return 444; } }
3. 高级防护模块
# 启用nginx plus或第三方模块 load_module modules/ngx_http_modsecurity_module.so; load_module modules/ngx_http_geoip2_module.so; http { # 使用geoip限制地区访问 geoip2 /usr/share/geoip/geolite2-country.mmdb { $geoip2_country_code country iso_code; } map $geoip2_country_code $allowed_country { default 0; cn 1; # 只允许中国ip us 1; jp 1; } server { # 应用地区限制 if ($allowed_country = 0) { return 403; } # 启用waf modsecurity on; modsecurity_rules_file /etc/nginx/modsec/main.conf; } }
四、nginx 调优增强防御
1. 内核级优化 (sysctl.conf)
# 防止syn洪水攻击 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 4096 # 加快time-wait回收 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 # 连接追踪优化 net.netfilter.nf_conntrack_max = 1000000 net.netfilter.nf_conntrack_tcp_timeout_established = 1200
2. nginx 工作进程优化
# 调整工作进程 worker_processes auto; # 自动匹配cpu核心 worker_rlimit_nofile 65535; # 每个进程最大文件描述符 # 使用多核处理连接 events { use epoll; worker_connections 4096; multi_accept on; }
3. 缓存优化减少后端压力
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m; server { location / { proxy_cache my_cache; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_use_stale error timeout updating; # 缓存锁定防止缓存击穿 proxy_cache_lock on; proxy_cache_lock_timeout 5s; } }
五、云平台集成防御
1. 阿里云/腾讯云集成
# 通过http头传递真实客户端ip real_ip_header x-forwarded-for; set_real_ip_from 100.64.0.0/10; # 云平台内网段 # 启用云平台waf location / { proxy_set_header x-real-ip $remote_addr; proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for; # 云平台特定头 proxy_set_header ali-cdn-real-ip $remote_addr; proxy_set_header qcloud-real-ip $remote_addr; }
2. cloudflare 集成
# 只接受来自cloudflare ip的请求 include /etc/nginx/cloudflare-ips.conf; server { listen 80; server_name yourdomain.com; # 仅允许cloudflare ip访问 allow 103.21.244.0/22; allow 103.22.200.0/22; # ... 其他cloudflare ip段 deny all; location / { proxy_pass http://backend; } }
六、监控与自动化响应
1. 实时监控配置
# 启用状态监控 server { listen 127.0.0.1:8080; location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; } }
2. 自动封禁脚本
#!/bin/bash # 自动封禁高频ip log_path="/var/log/nginx/access.log" threshold=100 # 每分钟请求阈值 ban_time=3600 # 封禁时间(秒) tail -f $log_path | while read line do ip=$(echo $line | awk '{print $1}') count=$(grep $ip $log_path | wc -l) if [ $count -gt $threshold ]; then # 添加到防火墙 iptables -a input -s $ip -j drop # 定时解封 (sleep $ban_time && iptables -d input -s $ip -j drop) & fi done
3. prometheus + grafana 监控面板
# nginx-prometheus-exporter 配置 scrape_configs: - job_name: 'nginx' static_configs: - targets: ['nginx-host:9113'] metrics_path: /metrics
监控指标:
- 请求率
- 活动连接数
- 错误率
- 带宽使用
- 上游响应时间
七、应急响应计划
攻击发生时的处理流程:
1.启用紧急模式:
# 在http块添加 limit_req_zone $binary_remote_addr zone=emergency:10m rate=5r/s; server { location / { limit_req zone=emergency burst=10 nodelay; } }
2.切换至静态维护页面:
location / { root /var/www/emergency; try_files $uri /maintenance.html; }
3.启用云平台ddos防护:
- 阿里云:启用ddos高防ip
- 腾讯云:启用大禹bgp高防
- aws:启用shield advanced
4.分析攻击模式:
# 分析访问日志 awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20 # 实时监控 tail -f access.log | grep -e ' (429|444|503) '
最佳实践总结
- 分层防御:网络层 + nginx层 + 应用层
- 速率限制:基于ip和关键端点
- 连接管理:限制并发和超时
- 自动封禁:实时监控 + 自动响应
- 云平台集成:利用云waf和ddos防护
- 定期演练:每季度进行防御压力测试
关键建议:对于大规模ddos攻击,建议结合云服务商的ddos防护服务(如阿里云高防ip、cloudflare pro),这些服务提供tb级的清洗能力,远超单台nginx服务器的防御能力。
最终部署前,务必进行压力测试:
# 使用wrk进行压力测试 wrk -t12 -c400 -d30s --timeout 10s https://yourdomain.com
根据测试结果调整限流阈值和防护策略,确保在防护攻击的同时不影响正常用户访问。
到此这篇关于nginx中cc攻击与ddos防御的高级策略指南的文章就介绍到这了,更多相关nginx防御cc攻击与ddos内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论