流量防护里能不能加个功能,访问几次不存在的页面直接把ip封了?

流量防护里能不能加个功能,访问几次不存在的页面直接把ip封了

。一般都是扫描器来各种扫的。也不是真实用户

阅读 694
avatarAI BotBETA

是的,这绝对是可以实现的,并且是防御恶意扫描器(如端口扫描或目录爆破工具)的常见做法。真实用户很少会频繁访问不存在的页面(如404错误),而扫描器会大量尝试无效URL来探测漏洞。添加这样的功能能有效减少服务器负载、带宽消耗和安全风险。

如何实现

大多数流量防护系统(如Web服务器、防火墙或专用工具)支持基于访问频率封禁IP。核心思路是:

  1. 监控访问日志:检测对不存在的页面(HTTP 404状态码)的请求。
  2. 设置阈值:定义一个阈值(如1分钟内访问5次404页面),超过则触发封禁。
  3. 执行封禁:通过防火墙规则(如iptables)或云服务API封禁IP。

以下是几种常见实现方式,选择取决于你的系统环境:

1. 使用 fail2ban(推荐,简单高效)

fail2ban 是一个开源工具,专门用于监控日志并自动封禁恶意IP。它支持Nginx、Apache等Web服务器。

  • 安装 fail2ban(以Ubuntu为例):

    sudo apt-get update
    sudo apt-get install fail2ban
  • 创建自定义规则

    • 编辑一个新配置文件,例如 /etc/fail2ban/jail.d/nginx-404.conf
    • 添加以下内容:

      [nginx-404]
      enabled = true
      filter = nginx-404
      logpath = /var/log/nginx/access.log  # 确保路径匹配你的Nginx日志
      maxretry = 5  # 允许的最大404错误次数
      findtime = 60  # 时间窗口(秒),例如60秒内
      bantime = 3600  # 封禁时长(秒),例如1小时
      action = iptables-multiport[name=nginx-404, port="http,https", protocol=tcp]
    • 创建过滤器文件 /etc/fail2ban/filter.d/nginx-404.conf

      [Definition]
      failregex = ^<HOST> .* "(GET|POST) /.*" 404 .*$
      ignoreregex =
  • 重启 fail2ban

    sudo systemctl restart fail2ban
  • 测试:使用工具(如curl或扫描器模拟)多次访问不存在的URL,查看fail2ban日志(sudo tail -f /var/log/fail2ban.log)确认封禁。

2. 使用 Nginx 原生模块

如果使用Nginx,你可以结合limit_req模块和自定义脚本:

  • 在 nginx.conf 中添加限流规则

    http {
      limit_req_zone $binary_remote_addr zone=block404:10m rate=5r/m; # 每分钟允许5次请求
      server {
        location / {
          error_page 404 /404.html;
          limit_req zone=block404 burst=10 nodelay;
          # 超过阈值时,可通过脚本封禁IP(需自定义)
        }
      }
    }
  • 添加封禁逻辑:使用lua模块或外部脚本(如Python)监控日志并调用iptables。例如:

    • 写一个Python脚本(block_404.py):

      #!/usr/bin/env python3
      import subprocess
      from collections import defaultdict
      import time
      
      # 监控日志文件,检测404请求
      log_file = '/var/log/nginx/access.log'
      threshold = 5  # 最大错误次数
      window_sec = 60  # 时间窗口(秒)
      
      ip_count = defaultdict(int)
      last_reset = time.time()
      
      with open(log_file, 'r') as f:
        for line in f:
          if ' 404 ' in line:
            ip = line.split()[0]  # 假设日志格式中IP是第一个字段
            current_time = time.time()
            if current_time - last_reset > window_sec:
              ip_count.clear()
              last_reset = current_time
            ip_count[ip] += 1
            if ip_count[ip] >= threshold:
              # 封禁IP(使用iptables)
              subprocess.run(['iptables', '-A', 'INPUT', '-s', ip, '-j', 'DROP'])
              print(f"Blocked IP: {ip}")
    • 设置cron任务定期运行脚本(如每分钟一次)。

3. 使用云服务(如Cloudflare)

如果使用CDN/云防护(如Cloudflare),无需手动编码:

  • 在Cloudflare仪表板中,转到 Security > WAF > Custom Rules
  • 创建新规则:

    • Rule Name: Block 404 Scanners
    • Field: URI Path
    • Operator: not in (列出所有有效路径,或使用正则如.*匹配任意)
    • Action: Block
    • Add filter: 设置Rate Limiting,例如 "When requests exceed 5 per minute"。
  • 保存后,Cloudflare会自动处理封禁。

注意事项

  • 阈值设置:起始建议设置为5-10次/分钟,避免误封真实用户(例如用户输错URL)。测试后调整。
  • 误封风险:添加白名单机制(如忽略公司IP或已知用户),或使用CAPTCHA挑战代替直接封禁。
  • 日志和监控:确保日志轮转(如logrotate)并监控封禁列表(fail2ban的fail2ban-client status nginx-404)。
  • 性能影响:在高流量场景,fail2ban或自定义脚本可能增加负载;考虑使用硬件防火墙或云方案优化。
  • 法律合规:在封禁IP前,检查本地法规(如GDPR),避免过度拦截。

如果你提供更多细节(如当前使用的Web服务器或防护工具),我可以给出更针对性的代码示例!

1 个回答

AMH流量防护列表有『入侵安全防护』、『流量防护』
点流量防护按钮,进入就有『恶意扫描』选项,勾选开启即可,可以预警提示或是自动拦截,

数据是依据于「分析异常」列表的流量频率与识别,频率那些可以在「分析异常」页调整。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题