首页 › 指南

黑名单监控:脚本、API 与 Webhook 告警

发布于 2026-11-03 / 更新于 2026-11-03 / 作者 Yuki Nakazawa

黑名单监控是指按计划在多个 DNS 黑名单(DNSBL)中查询您的发信 IP 和域名,并且只在结果发生变化时发出告警。在被列入的当下就发现问题,而不是等客户反映邮件被退回才知道,就能在损害扩大之前查明原因并申请解除。

实际可行的方法有两种:自己运行一个小型的 dig 加 cron 脚本,或者通过 API 和 Webhook 把检查交给服务来完成。无论哪种方式,有两个细节决定监控结果是否可信:通过公共解析器发出的查询会被 Spamhaus 等名单拒绝,并产生误导性的应答;而错误码绝不能被计为列入。

本文引用的名单运营方规则,依据的是其截至 2026 年 11 月的官方页面。政策会变化,依赖某套配置之前请先确认。关于 DNSBL 工作原理的背景知识,请参阅什么是 DNSBL(RBL)。

免费检查您的域名或 IP 地址是否被列入约 345 个黑名单中的任何一个。

确定监控对象和要查询的名单

首先列出您真正需要监控的对象。

查询格式由 RFC 5782 定义。对于 IPv4,将八位组倒序后加上名单的区域名,因此在某份名单上查询 192.0.2.99 时,写作 99.2.0.192 后接区域名。对于 IPv6,地址写成 32 个十六进制半字节并倒序排列。域名则直接加在区域名前面。被列入的条目会返回 A 记录,按惯例位于 127.0.0.0/8 范围内;未被列入的则返回 NXDOMAIN。RFC 还指出,名单应发布说明列入原因的 TXT 记录。

请同时监控多份名单,而不是只看一份,因为各收件方使用的名单并不相同。每个返回码的含义因运营方而异;我们的DNSBL 返回码指南介绍了常见的返回码。

为什么公共解析器会给出错误的应答

自建监控中一个常见的错误,是通过 Google Public DNS(8.8.8.8)或 Cloudflare(1.1.1.1)等公共解析器发送查询。Spamhaus 官方的 DNSBL 使用 FAQ 解释了这样做的后果:

该 FAQ 的首要建议是自行运行 DNS 解析器。对于必须使用公共解析器的用户,Spamhaus 推荐其 Data Query Service(DQS);免费范围请查看其条款。FAQ 还建议使用 dig txt whoami.fastly.net 查看您实际使用的是哪个解析器。

RFC 5782 还提供了一个内置的健全性检查:IPv4 名单必须包含 127.0.0.2 的条目,且不得包含 127.0.0.1,客户端应定期检查这些测试条目,以确认名单正常运行。在 Spamhaus 的示例中,2.0.0.127.zen.spamhaus.org 返回 127.0.0.10、127.0.0.4 和 127.0.0.2,而 1.0.0.127.zen.spamhaus.org 返回 NXDOMAIN。监控程序应首先进行这项测试,如果失败,则丢弃本次运行的结果。

方案 1:dig 加 cron 脚本

下面是一个最简脚本,用于在 Spamhaus ZEN 和 SpamCop(bl.spamcop.net,SpamCop 的文档说明被列入的 IP 会应答 127.0.0.2)中检查一个 IPv4 地址。请替换成您自己的地址和区域名。

#!/bin/sh
# 查询自己的递归解析器(例如同一主机上的 unbound),绝不使用公共解析器
RESOLVER=127.0.0.1
IP=192.0.2.10
ZONES="zen.spamhaus.org bl.spamcop.net"
REV=$(echo "$IP" | awk -F. '{print $4"."$3"."$2"."$1}')

q() {
  out=$(dig +time=3 +tries=1 @"$RESOLVER" "$1" A) || { echo ERR; return; }
  case "$out" in
    *"status: NOERROR"*) a=$(printf '%s\n' "$out" | awk '$4=="A"{print $5}'); echo "${a:-NX}" ;;
    *"status: NXDOMAIN"*) echo NX ;;
    *) echo ERR ;;
  esac
}

for Z in $ZONES; do
  # 如果 127.0.0.2 测试条目没有解析为列入代码,则不信任本次运行结果
  case "$(q "2.0.0.127.$Z")" in
    127.255.255.*|NX|ERR) echo "$Z ERROR test-entry"; continue ;;
    127.*) ;;
    *) echo "$Z ERROR test-entry"; continue ;;
  esac
  A=$(q "$REV.$Z")
  case "$A" in
    NX)            echo "$Z CLEAN" ;;
    ERR)           echo "$Z ERROR no-answer" ;;
    127.255.255.*) echo "$Z ERROR $A" ;;
    127.*)         echo "$Z LISTED $A" ;;
    *)             echo "$Z ERROR unexpected $A" ;;
  esac
done

脚本的处理逻辑:

然后让 cron 把每次运行的结果与上一次比较,只在有变化时发送邮件:

# Example: run hourly, send mail only when the output differs from the last run
0 * * * * /usr/local/bin/dnsbl-watch.sh > /var/tmp/dnsbl.now 2>&1; cmp -s /var/tmp/dnsbl.now /var/tmp/dnsbl.prev || mail -s "DNSBL status changed" you@example.com < /var/tmp/dnsbl.now; mv /var/tmp/dnsbl.now /var/tmp/dnsbl.prev

每小时一次的间隔只是示例。Spamhaus 为低查询量的非商业用途提供免费访问,超过其查询量阈值的客户端需要使用付费方案;随着监控 IP 数量的增加,请查看各名单的条款。FAQ 还建议把命令多试几次,确认结果保持一致。

方案 2:DNSBL Checker 批量 API 与 Webhook

如果您不想自己维护解析器和各名单的解析规则,可以让服务来执行检查。下面介绍本站的 v1 API,内容仅限于服务器端实现实际支持的功能。参考文档位于 /en/api-docs,密钥在会员页面 /account 上签发。注册只需一个电子邮件地址,登录时使用通过邮件发送的链接。

认证与限制

批量检查

向 POST /api/v1/batch 发送由域名或 IP 地址组成的 targets 数组:

curl -X POST https://dnsblchecker.com/api/v1/batch \
  -H "X-API-Key: $DNSBL_API_KEY" -H "Content-Type: application/json" \
  -d '{"targets":["example.com"]}'

如果有任何目标仍需检查,响应为 202,并附带 batch_id。每隔几秒轮询一次 GET /api/v1/batch/{batch_id},直到 status 变为 done(节选示例;其中的数字和名单名称仅作说明,并非真实结果):

{
  "batch_id": 1, "status": "done", "created": "2026-11-03 09:10:41", "count": 1, "pending": 0,
  "results": [
    {
      "target": "example.com", "type": "domain",
      "status": "done", "verdict": "listed",
      "checked_at": "2026-11-03 09:12",
      "lists_checked": 80, "listed_count": 1, "error_count": 4,
      "listed_on": [
        { "list": "ZapBL RHSBL", "zone": "rhsbl.zapbl.net", "response": "127.0.0.2" }
      ]
    }
  ]
}

Webhook 监控

通过 POST /api/v1/monitors 注册 target 和 callback_url。此后,每个已注册的目标每天都会在不使用缓存的情况下检查一次(首次检查在注册后约一天内运行),并且只在首次检查(monitor.initial)时,以及判定结果在 listed 与 clean 之间切换(monitor.status_changed)时,向您的 URL 发送 JSON 格式的 POST。

curl -X POST https://dnsblchecker.com/api/v1/monitors \
  -H "X-API-Key: $DNSBL_API_KEY" -H "Content-Type: application/json" \
  -d '{"target":"example.com","callback_url":"https://your-app.example/hooks/dnsbl"}'
import hmac, hashlib
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
ok = hmac.compare_digest(expected, request.headers.get("X-DNSBL-Signature", ""))

告警设计:频率、多份名单与误报

只有在几个月后大家仍会阅读告警,监控才有意义。频繁触发的告警很快就会被忽视。

频率

多份名单

误报和暂时性应答

检测到列入后该怎么做

  1. 确认列入。在运营方自己的查询页面上检查,记下名单名称、时间以及显示的原因。
  2. 先消除原因。排查被盗用的账户、被滥用的网页表单、被感染的机器、邮件列表维护不善,以及反向解析(PTR)或 HELO 名称不一致等问题。在原因仍然存在时申请解除,通常会导致再次被列入。
  3. 按照该名单的解除流程办理。是否解除由各名单运营方决定,提交申请并不代表一定会被解除。如果 IP 不在您的控制之下(例如共享主机),请联系主机商或 ISP。
  4. 让监控确认结果。收件方也会运行自己的过滤器,因此在判定结果恢复为 clean 之后,也请继续关注投递情况。

如果只想临时查一下某个 IP 或域名,请使用黑名单检测工具。如果追查原因或处理申请超出了您的能力范围,可以向我们咨询。邮件被退回时的完整排查步骤,请参阅邮件因黑名单被拦截。

如果您不想自行处理

我们可为您介绍承接解除申请、咨询和建议的服务商(JPY 50,000 起)。是否解除由各黑名单运营方决定,无法作出承诺。

寻求帮助

本站可能会从所列服务商处获得介绍费。 About

常见问题

我通过 8.8.8.8 查询,没有发现列入,这样就没问题了吗?

不一定。Spamhaus 的 FAQ 指出,通过 Google Public DNS 等免费开放解析器查询,大多数情况下会得到“未列入”(NXDOMAIN)的回复,因此被列入的 IP 可能看起来是干净的。请从您自己的解析器查询,或使用运营方的查询页面。

收到 127.255.255.254,是说明我被列入了吗?

不是。这是通过公共或开放解析器查询时返回的错误码,Spamhaus 声明它并不表示对象已被列入。请将其记录为错误,不要发送列入告警。

可以每天调用批量 API 来代替监控吗?

批量检查可能返回最多 30 天前保存的结果,因此不一定是当天的状态。请查看 checked_at,或者使用每天都会重新检查的 Webhook 监控(POST /api/v1/monitors)。

告警一触发就应该申请解除吗?

请先消除原因。在问题仍然存在时提出申请,通常会导致再次被列入。决定权始终在名单运营方。

参考的官方页面

本文中的事实已在发布时对照以下官方页面进行核实。相关政策和行为可能随时变更,恕不另行通知,在依赖重要信息之前,请先查看官方页面。

相关指南

DNSBL 返回码详解:127.0.0.2、127.255.255.x 与 NXDOMAIN

如何解读 DNSBL 返回码:RFC 5782 中 127.0.0.2 的含义,Spamhaus、SpamCop 和 UCEPROTECT 的返回码,错误码,以及 NXDOMAIN 与 SERVFAIL 的区别。

Spamhaus 解封指南:如何将 IP 或域名移出黑名单

被 Spamhaus 列入黑名单?了解您在哪个列表上(ZEN、PBL、XBL、CSS、SBL、DBL)、返回码的含义,以及每个列表对应的正确移除途径。

邮件被列入黑名单?如何读懂退信并移出黑名单

邮件被黑名单拦截?读懂退信代码,按正确顺序排查原因,判断哪些黑名单真正有影响,并以正确的方式申请移除。

全部指南 →