返回列表 发布新帖
查看: 42|回复: 0

【脚本分享】自动检测并封禁恶意爬虫(基于 Nginx 日志)

发表于 2025-6-18 15:06:39 | 查看全部 |阅读模式

这里或许是互联网从业者的最后一片净土,随客社区期待您的加入!

您需要 登录 才可以下载或查看,没有账号?立即注册

×
随着越来越多的网站上线,不少站长发现,“带宽用得飞快,访问记录全是非人类”——这些基本都是恶意爬虫在搞鬼。
本篇分享一个我自己平时在服务器用的小脚本,用来“分析 Nginx access.log,自动找出高频 IP 并通过防火墙封禁”。部署简单、效果立竿见影。

脚本原理简介:
统计一分钟内请求数最多的 IP
排除常见搜索引擎蜘蛛
超过阈值的 IP 自动封禁(firewalld)

脚本内容(适配 CentOS 7/8、Nginx 日志默认格式)
  1. #!/bin/bash

  2. # 配置项
  3. LOG_FILE="/www/wwwlogs/yourdomain.com_access.log"
  4. WHITELIST="baidu|google|bing|yisouspider|sogou"
  5. THRESHOLD=100        # 每分钟请求次数阈值
  6. BAN_TIME=3600        # 封禁时长,单位秒
  7. TMP_FILE="/tmp/bad_ips.txt"

  8. # 统计最近1分钟的访问记录
  9. tail -n 10000 "$LOG_FILE" | grep "$(date +"%d/%b/%Y:%H:%M" -d "1 minute ago")" | awk '{print $1}' | sort | uniq -c | sort -nr > "$TMP_FILE"

  10. while read line; do
  11.     count=$(echo $line | awk '{print $1}')
  12.     ip=$(echo $line | awk '{print $2}')

  13.     # 排除常见搜索引擎
  14.     UA=$(grep "$ip" "$LOG_FILE" | tail -n 1 | grep -Eio "$WHITELIST")
  15.     if [[ -n "$UA" ]]; then
  16.         continue
  17.     fi

  18.     if [[ $count -gt $THRESHOLD ]]; then
  19.         echo "发现恶意IP:$ip,请求数:$count,已封禁"
  20.         firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='$ip' reject"
  21.     fi
  22. done < "$TMP_FILE"

  23. # 重载防火墙规则
  24. firewall-cmd --reload
复制代码

使用方式:
1. 将上述脚本保存为 `/usr/local/bin/ban_bad_bot.sh`
2. 赋予执行权限:
  1. chmod +x /usr/local/bin/ban_bad_bot.sh
复制代码
3. 添加定时任务(每分钟执行一次):
  1. crontab -e
复制代码
添加:
  1. * * * * * /usr/local/bin/ban_bad_bot.sh >> /var/log/ban_bot.log 2>&1
复制代码

效果参考:
脚本会自动根据日志检测“异常高频访问的 IP”,并通过 `firewalld` 添加拒绝访问规则。你可以在:
  1. firewall-cmd --list-all
复制代码
看到已经封禁的 IP。

温馨提醒:
如果你用的是 “宝塔面板”,也可以把该脚本加入“计划任务”中,设为每分钟执行一次。
不推荐在高峰期将阈值设置过低,避免误封正常用户。
封禁方式也可以换成 `iptables` 或 `fail2ban` 配合使用。

总结
这是一个简单实用的小脚本,适合中小网站定时防护用。你也可以在日志中加入 UA 筛选、路径过滤等进一步优化。
如果你还用过更高级的方法,比如接入 WAF、结合 CDN 限频,也欢迎在评论区交流。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2001-2025 Suike Tech All Rights Reserved. 随客交流社区 (备案号:津ICP备19010126号) |Processed in 0.108695 second(s), 7 queries , Gzip On, MemCached On.
关灯 在本版发帖返回顶部
快速回复 返回顶部 返回列表