自动爬虫IP黑名单定时更新拦截抓取:零基础服务器配置教程
自动爬虫IP黑名单定时更新拦截抓取的核心思路是:通过脚本定期从可信黑名单源下载恶意IP列表,自动添加至系统防火墙规则(如iptables),实现实时阻断恶意爬虫。
本文面向零基础用户,提供一套可直接部署的方案,只需按步骤执行即可搭建自动更新拦截系统。
适用场景与准备条件
这套方案适合以下场景:网站被恶意爬虫频繁抓取或采集、服务器日志中出现大量异常请求IP、希望降低资源消耗和带宽开销。
准备条件包括:一台运行Linux(本文以CentOS 7/8为例)的服务器、root权限或sudo权限、可以正常访问外网以下载IP列表。
安装必要工具并创建ipset集合
首先确保服务器已安装ipset和iptables。
运行以下命令安装依赖:
yum install -y ipset iptables-services
接着创建一个名为blacklist的ipset哈希集合,用于存储IP地址:
ipset create blacklist hash:ip
*注:如果服务器已启用firewalld,建议先停止并禁用firewalld,改用iptables。
* 随后让iptables引用该集合,添加一条规则丢弃来源IP在blacklist中的所有数据包:
iptables -I INPUT -m set --match-set blacklist src -j DROP
iptables-save > /etc/sysconfig/iptables
完成以上步骤后,系统已具备拦截黑名单IP的基础能力。
编写自动更新脚本并配置定时任务
创建一个脚本文件,例如/usr/local/bin/update_blacklist.sh,内容如下(注意替换实际下载URL):
#!/bin/bash
# 自动爬虫IP黑名单定时更新拦截抓取脚本
URL="https://raw.githubusercontent.com/firehol/blocklist-ipsets/master/firehol_level1.netset"
IP_FILE="/tmp/blacklist_ips.txt"
# 下载IP列表
curl -sS "$URL" -o "$IP_FILE" || exit 1
# 清空ipset集合并重新添加
ipset flush blacklist
while read -r line; do
# 过滤注释行和空行
[[ "$line" =~ ^# ]] && continue
[ -z "$line" ] && continue
ipset add blacklist "$line" 2>/dev/null
done < "$IP_FILE"
赋予执行权限:chmod +x /usr/local/bin/update_blacklist.sh。
首次运行测试:bash /usr/local/bin/update_blacklist.sh,然后用ipset list blacklist查看是否添加成功。
确认无误后,用crontab设置定时任务(每隔6小时更新一次):
crontab -e
0 */6 * * * /usr/local/bin/update_blacklist.sh >/dev/null 2>&1
保存退出。
至此,系统会自动每6小时下载最新恶意IP列表并更新拦截规则。
避坑指南:常见问题与注意事项
- 下载源失效或超时:脚本中建议添加多个备用源,或在下载失败时发送报警邮件。可用
curl --connect-timeout 10限制连接超时。 - ipset集合容量不足:默认hash:ip集合最多可容纳65536个IP,若黑名单IP过多,创建时指定更大容量:
ipset create blacklist hash:ip maxelem 1000000。 - iptables规则重启丢失:务必执行
iptables-save > /etc/sysconfig/iptables;如果使用systemd管理iptables,还需确保服务已启用。 - 白名单误伤:如果误将自有IP或CDN节点IP加入黑名单,需手动从ipset中删除:
ipset del blacklist。
效果验证与日志排查
运行以下命令查看当前黑名单数量:
ipset list blacklist | wc -l
常见问题解答
问:自动爬虫IP黑名单定时更新拦截抓取会影响正常访客吗?
答:公开黑名单源收录的通常是已确认的恶意IP或爬虫IP,误伤概率较低。
但建议定期检查,如有误封手动移除,并可使用白名单机制。
问:如何更换黑名单源?
答:只需修改脚本中的URL变量。
推荐使用知名社区维护的列表(如firehol、blocklist.de),不要使用来源不明的列表。
问:服务器重启后ipset集合会丢失吗?
答:默认ipset集合不会持久化。
建议将iptables规则保存的同时,在开机自启脚本中重新创建集合并添加IP,或使用ipset save > /etc/ipset.conf并配置rc.local恢复。
问:本方案适合云服务器吗?
答:适合。
云服务器大多支持iptables,只需确保安全组规则放行所需端口即可。
本方案与云厂商的安全组不冲突,可同时使用。