插件窝 干货文章 讨论Nginx服务器的反爬虫和反DDoS攻击策略

讨论Nginx服务器的反爬虫和反DDoS攻击策略

防护 Nginx limit 限制 744    来源:    2025-04-12

Nginx服务器反爬虫与反DDoS攻击策略

反爬虫策略

1. 基于User-Agent的过滤

# 阻止已知恶意爬虫和扫描器
if ($http_user_agent ~* (Scrapy|Curl|HttpClient|python-requests|Wget|Go-http-client|Java)) {
    return 403;
}

# 允许主流浏览器访问
if ($http_user_agent ~* (Mozilla|Chrome|Safari|Firefox|Edge|Opera)) {
    break;
}

2. 请求频率限制

# 限制单个IP的请求频率
limit_req_zone $binary_remote_addr zone=req_perip:10m rate=10r/s;
limit_req zone=req_perip burst=20 nodelay;

3. 爬虫行为识别

# 阻止连续快速请求
if ($request_method = GET) {
    set $rule_0 1;
}
if ($uri ~* "\.(jpg|png|gif|css|js)$") {
    set $rule_0 0;
}
if ($http_referer = "") {
    set $rule_0 "${rule_0}1";
}
if ($rule_0 = "11") {
    return 403;
}

4. 验证码挑战

# 对可疑请求重定向到验证码页面
location / {
    if ($http_cookie !~* "human=verified") {
        return 302 /captcha.html;
    }
    # 正常处理请求
}

反DDoS攻击策略

1. 连接数限制

# 限制单个IP的连接数
limit_conn_zone $binary_remote_addr zone=conn_perip:10m;
limit_conn conn_perip 20;

2. 带宽限制

# 限制客户端下载速度
limit_rate 100k;
limit_rate_after 1m;

3. 基于地理位置的访问控制

# 使用GeoIP模块限制特定国家访问
geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
    default no;
    CN yes;
    US yes;
    # 其他允许的国家
}

server {
    if ($allowed_country = no) {
        return 403;
    }
}

4. 高级防护配置

# 启用SYN Cookie防护
net.ipv4.tcp_syncookies = 1

# 减少SYN+ACK重试次数
net.ipv4.tcp_synack_retries = 2

# 启用TCP连接追踪
net.netfilter.nf_conntrack_max = 1048576

5. 使用Nginx Plus的DDoS防护

# 高级请求速率限制
limit_req_zone $binary_remote_addr zone=ddos:10m rate=100r/s;
limit_req zone=ddos burst=200 nodelay;

# 连接耗尽防护
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
limit_conn conn_limit 50;

综合防护方案

1. 多层防护架构

客户端 → CDN防护 → WAF防火墙 → Nginx基础防护 → 应用层防护

2. 日志分析与监控

# 详细日志记录
log_format security '$remote_addr - $remote_user [$time_local] '
                   '"$request" $status $body_bytes_sent '
                   '"$http_referer" "$http_user_agent" '
                   '$request_time $upstream_response_time '
                   '$http_x_forwarded_for';

access_log /var/log/nginx/security.log security;

3. 自动化脚本响应

#!/bin/bash
# 自动封禁频繁访问的IP
tail -n 10000 /var/log/nginx/access.log | \
awk '{print $1}' | \
sort | \
uniq -c | \
sort -nr | \
awk '{if($1 > 100) print "iptables -A INPUT -s " $2 " -j DROP"}' | \
sh

最佳实践建议

  1. 分层防护:结合网络层、传输层和应用层防护
  2. 动态调整:根据攻击特征实时调整防护策略
  3. 监控报警:设置异常流量报警机制
  4. 定期更新:保持Nginx和防护规则的最新版本
  5. 测试验证:定期进行压力测试和防护有效性验证
  6. 备份恢复:准备应急恢复方案和备用服务器

以上策略需要根据实际业务需求和安全评估进行调整,过度防护可能影响正常用户访问。