IP黑名单定期检测脚本,查询RBL黑名单自动标记问题IP
服务器 IP 被 RBL(实时黑名单)收录后,发往企业邮箱的邮件容易被拒收,部分对外服务也可能受影响。
本文提供一套可复制的 IP 黑名单定期检测脚本,通过解析 RBL 查询结果自动标记问题 IP,并支持定时运行。
你只需要一台 Linux 服务器,按下面步骤操作即可完成部署。
准备工作:确认工具和 RBL 列表
脚本主要依赖 dig 命令,用于执行 DNS 查询。
先确认是否安装:
dig -v
如果提示找不到命令,安装 dnsutils(Debian/Ubuntu)或 bind-utils(CentOS/Rocky):
# Debian/Ubuntu
sudo apt update && sudo apt install dnsutils -y
# CentOS/Rocky
sudo yum install bind-utils -y
RBL 查询的本质是“反转 IP + 黑名单域名”的 DNS 查询。
例如要查 1.2.3.4 是否在 zen.spamhaus.org 中,需要查询 4.3.2.1.zen.spamhaus.org 的 A 记录。能解析出 IP 说明被列入黑名单,查询无记录则代表正常。
常用公共 RBL 列表建议先整理成文件,方便脚本读取:
cat > /etc/rbl_list.txt <
编写 RBL 检测脚本并自动标记
脚本逻辑分为三步:读取 RBL 列表 → 反向拼接域名 → 执行 DNS 查询并记录结果。
下面创建一个可直接运行的脚本:
sudo tee /usr/local/bin/check_rbl.sh > /dev/null <<'EOF'
#!/bin/bash
# 用法: ./check_rbl.sh
IP=$1
if [[ ! $IP =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "IP 格式不对,示例: $0 8.8.8.8"
exit 1
fi
# 反转 IP: 1.2.3.4 -> 4.3.2.1
REV_IP=$(echo $IP | awk -F. '{print $4"."$3"."$2"."$1}')
LOG=/var/log/rbl_check.log
# 清空本次检查临时文件
: > /tmp/rbl_result.txt
while read RBL; do
[ -z "$RBL" ] && continue
QUERY="$REV_IP.$RBL"
RESULT=$(dig +short +time=3 +tries=2 "$QUERY" A)
if [ -n "$RESULT" ]; then
echo "$IP 被 $RBL 收录,回指记录: $RESULT" | tee -a /tmp/rbl_result.txt
else
echo "$IP 在 $RBL 正常" >> /tmp/rbl_result.txt
fi
done < /etc/rbl_list.txt
# 如果发现问题 IP,写入日志并标记文件
if grep -q "被.*收录" /tmp/rbl_result.txt; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检测到问题 IP: $IP" >> $LOG
# 标记操作:这里将问题 IP 追加到黑名单标记文件
echo "$IP" >> /var/log/problem_ips.txt
sort -u /var/log/problem_ips.txt -o /var/log/problem_ips.txt
fi
EOF
sudo chmod +x /usr/local/bin/check_rbl.sh
运行脚本检测单个 IP:
sudo /usr/local/bin/check_rbl.sh 你的服务器IP
查看结果文件:cat /var/log/rbl_check.log。所有被 RBL 收录的 IP 都会进入 /var/log/problem_ips.txt,
这就是“自动标记问题 IP”的最终落点。 你可以用这个文件对接告警,
或在防火墙中额外限制这些 IP。
配置 crontab 定期检查
编辑当前用户的 crontab:
crontab -e
添加下面两行,每 6 小时检测一次,并将输出写入日志:
0 */6 * * * /usr/local/bin/check_rbl.sh 你的服务器IP >> /var/log/rbl_cron.log 2>&1
10 */6 * * * /usr/local/bin/check_rbl.sh 第二台服务器IP >> /var/log/rbl_cron.log 2>&1
保存后,可以用以下命令查看定时任务是否生效:
crontab -l
容易踩的坑和解决建议
查询结果 127.0.0.2 这类地址是什么意思? 这是 RBL 的标准回指地址,不代表 IP 归属,只代表“被收录”。
不同回指值对应不同原因,例如 127.0.0.4 可能表示发垃圾邮件,具体要查 RBL 的官方文档。
误报和被限流:热门 RBL(如 Spamhaus)对查询频率有限制。
同一个 IP 不要频繁重复查询,否则可能被临时屏蔽,返回超时或 SERVFAIL。
所以脚本里设置了 +time=3 +tries=2,缩短等待时间。
如果大量 IP 要检测,建议在脚本中增加随机延时:
sleep $((RANDOM % 10))
RBL 查询超时不代表干净:当 dig 超时或返回 SERVFAIL,脚本会当作“无记录”处理。
建议把超时结果单独记录,避免误判。
可以在循环中判断 $? 退出码,但初版脚本默认已能满足大多数日常检查需求。
不要只依赖一个 RBL 列表:不同 RBL 的侧重点不同,建议至少使用 3-5 个主流列表。
被某个列表收录并不绝对代表服务器有问题,可能是历史记录或共享 IP 遗留,需要到 RBL 官网查询具体原因并提交移除申请。
验证检测脚本是否工作正常
先手动执行一次,观察输出:
sudo /usr/local/bin/check_rbl.sh 8.8.8.8
cat /tmp/rbl_result.txt
8.8.8.8 是 Google DNS,通常不会被收录,应该看到每个 RBL 都是“正常”。
如果全部显示正常,说明脚本工具链没有问题。
再用一个已知被列出的 IP 测试,或者用 127.0.0.1 测试本地回环,多数 RBL 不会收录它。
要确认脚本的“问题标记”逻辑,可以临时在 /etc/rbl_list.txt 加入一个测试域名,比如 test.rbl.example,然后查询 4.3.2.1.test.rbl.example,无论返回什么都会触发标记,但注意改完要删掉。
确认定时执行情况:
tail -f /var/log/rbl_cron.log
看到脚本正常输出,problem_ips.txt 和 rbl_check.log 按预期更新,说明 IP 黑名单定期检测脚本已经完全跑通。
后续可以把标记 IP 接入监控告警或自动封禁策略,形成更完整的响应链路。