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.txtrbl_check.log 按预期更新,说明 IP 黑名单定期检测脚本已经完全跑通。
后续可以把标记 IP 接入监控告警或自动封禁策略,形成更完整的响应链路。

分享到:
上一篇
IDC业务客户自动化管理面板开发思路
下一篇
IDC业务客户隔离,KVM虚拟机网络隔离
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意