【脚本分享】自动检测并封禁恶意爬虫(基于 Nginx 日志)
随着越来越多的网站上线,不少站长发现,“带宽用得飞快,访问记录全是非人类”——这些基本都是恶意爬虫在搞鬼。本篇分享一个我自己平时在服务器用的小脚本,用来“分析 Nginx access.log,自动找出高频 IP 并通过防火墙封禁”。部署简单、效果立竿见影。
脚本原理简介:
统计一分钟内请求数最多的 IP
排除常见搜索引擎蜘蛛
超过阈值的 IP 自动封禁(firewalld)
脚本内容(适配 CentOS 7/8、Nginx 日志默认格式)
#!/bin/bash
# 配置项
LOG_FILE="/www/wwwlogs/yourdomain.com_access.log"
WHITELIST="baidu|google|bing|yisouspider|sogou"
THRESHOLD=100 # 每分钟请求次数阈值
BAN_TIME=3600 # 封禁时长,单位秒
TMP_FILE="/tmp/bad_ips.txt"
# 统计最近1分钟的访问记录
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"
while read line; do
count=$(echo $line | awk '{print $1}')
ip=$(echo $line | awk '{print $2}')
# 排除常见搜索引擎
UA=$(grep "$ip" "$LOG_FILE" | tail -n 1 | grep -Eio "$WHITELIST")
if [[ -n "$UA" ]]; then
continue
fi
if [[ $count -gt $THRESHOLD ]]; then
echo "发现恶意IP:$ip,请求数:$count,已封禁"
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='$ip' reject"
fi
done < "$TMP_FILE"
# 重载防火墙规则
firewall-cmd --reload
使用方式:
1. 将上述脚本保存为 `/usr/local/bin/ban_bad_bot.sh`
2. 赋予执行权限:
chmod +x /usr/local/bin/ban_bad_bot.sh3. 添加定时任务(每分钟执行一次):
crontab -e添加:
* * * * * /usr/local/bin/ban_bad_bot.sh >> /var/log/ban_bot.log 2>&1
效果参考:
脚本会自动根据日志检测“异常高频访问的 IP”,并通过 `firewalld` 添加拒绝访问规则。你可以在:
firewall-cmd --list-all看到已经封禁的 IP。
温馨提醒:
如果你用的是 “宝塔面板”,也可以把该脚本加入“计划任务”中,设为每分钟执行一次。
不推荐在高峰期将阈值设置过低,避免误封正常用户。
封禁方式也可以换成 `iptables` 或 `fail2ban` 配合使用。
总结
这是一个简单实用的小脚本,适合中小网站定时防护用。你也可以在日志中加入 UA 筛选、路径过滤等进一步优化。
如果你还用过更高级的方法,比如接入 WAF、结合 CDN 限频,也欢迎在评论区交流。
页:
[1]