IP 与 ASN

IP 段自动监控:黑名单、地理位置与 RPKI 每日检测并推送 Telegram 告警

5 个步骤 9 分钟阅读 21 次阅读 0
本文目录

租用的 IP 段可能在毫无预警的情况下发生变化:某个客户导致一个地址被列入黑名单,某个地理位置数据库把整个地址段划到了别的国家,或者 ROA 变更导致你的宣告变为无效。等几周后再从用户那里得知,代价往往很大。本文搭建一个小型监控脚本:每天将 IP 段中的每个地址与主流 DNS 黑名单比对,将地理位置与预期国家进行对比,校验 RPKI,并在发现变化时发送 Telegram 消息。

Spamhaus 不响应通过 8.8.8.8、1.1.1.1 等大型公共解析器发出的查询(只会返回错误码 127.255.255.254)。请按步骤 1 在服务器上使用自建解析器进行检测。Spamhaus 的免费服务仅限低查询量的非商业用途;如用于商业监控,请注册 Spamhaus 的数据查询服务(DQS)。

步骤 1:自建 DNS 解析器

# Debian / Ubuntu
apt install -y unbound dnsutils jq curl
systemctl enable --now unbound

# Test: a listed test address must return 127.0.0.x through the local resolver
dig +short 2.0.0.127.zen.spamhaus.org @127.0.0.1

测试地址 127.0.0.2 返回 127.0.0.2(及其他结果),即说明黑名单查询工作正常。

步骤 2:了解 DNSBL 查询原理

要检查 203.0.113.10 是否在某个黑名单区域中,先将 IP 的四段数字倒序,再拼接上区域名。没有应答(NXDOMAIN)表示未被收录;返回 127.0.0.0/8 内的地址表示已被收录,最后一段数字表示具体是哪个列表。

dig +short 10.113.0.203.zen.spamhaus.org @127.0.0.1
# 127.0.0.2 / .3       SBL / CSS (spam sources)
# 127.0.0.4 – .7       XBL (exploited hosts, malware)
# 127.0.0.9            DROP (hijacked or criminal ranges)
# 127.0.0.10 / .11     PBL (policy: not expected to send mail directly; not a sign of abuse)
# 127.255.255.x        query error (public resolver, rate limit), not a listing

步骤 3:创建监控脚本

mkdir -p /opt/ipmon
cat > /opt/ipmon/blocks.txt <<'EOF2'
# prefix          expected country   origin ASN
203.0.113.0/24    JP                 AS64500
198.51.100.0/24   KR                 AS64500
EOF2

cat > /opt/ipmon/check.sh <<'EOF2'
#!/bin/bash
# Daily IP block check: DNSBL listings, geolocation and RPKI. Prints problems only.
ZONES="zen.spamhaus.org bl.spamcop.net psbl.surriel.com dnsbl-1.uceprotect.net"
grep -v '^#' /opt/ipmon/blocks.txt | while read -r PREFIX CC ASN; do
  [ -z "$PREFIX" ] && continue
  BASE=${PREFIX%.*}                      # works for /24 blocks: 203.0.113
  IFS=. read -r a b c _ <<< "$PREFIX"
  for d in $(seq 1 254); do
    for z in $ZONES; do
      r=$(dig +short +time=2 +tries=1 "$d.$c.$b.$a.$z" @127.0.0.1 | head -1)
      case "$r" in
        127.255.255.*|"") ;;                                   # error or not listed
        127.0.0.10|127.0.0.11) ;;                              # Spamhaus PBL: policy list, ignore
        127.*) echo "LISTED $BASE.$d on $z ($r)";;
      esac
    done
  done
  # Geolocation of a few sample addresses
  for d in 1 64 128 200 254; do
    got=$(curl -s --max-time 10 "https://ipinfo.io/$BASE.$d/country" | tr -d '[:space:]')
    [ -n "$got" ] && [ "$got" != "$CC" ] && echo "GEO $BASE.$d is $got, expected $CC"
  done
  # RPKI status of the announcement
  st=$(curl -s --max-time 20 "https://stat.ripe.net/data/rpki-validation/data.json?resource=$ASN&prefix=$PREFIX" | jq -r '.data.status')
  [ "$st" != "valid" ] && echo "RPKI $PREFIX from $ASN is $st"
done
EOF2
chmod +x /opt/ipmon/check.sh
/opt/ipmon/check.sh

一切正常时,脚本不会输出任何内容。脚本按 /24 编写,较大的 IP 段请拆分成多行 /24。一个完整的 /24 查询四个区域约需一千次 DNS 查询,耗时几分钟,每天运行一次完全可以接受。

步骤 4:发送 Telegram 告警

按照 Uptime Kuma 监控与 Telegram 告警中的说明创建 Telegram 机器人并获取你的 chat ID。然后用一个小的发送脚本包装检测脚本,只在有发现时才给你发消息:

cat > /opt/ipmon/run.sh <<'EOF2'
#!/bin/bash
TOKEN="123456:ABC-your-bot-token"
CHAT="123456789"
OUT=$(/opt/ipmon/check.sh 2>&1)
if [ -n "$OUT" ]; then
  curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
       --data-urlencode "chat_id=$CHAT" \
       --data-urlencode "text=IP block check $(hostname) $(date +%F):
$OUT" >/dev/null
fi
EOF2
chmod 700 /opt/ipmon/run.sh

# Every day at 07:30
echo '30 7 * * * root /opt/ipmon/run.sh' > /etc/cron.d/ipmon

步骤 5:根据检测结果进行处理

  • 被列入黑名单:找出使用该地址的服务器或客户,消除根源(通常是服务器被入侵或邮件脚本配置不当),然后到该黑名单的网站申请移除(参见 IP 黑名单检测与解除)。
  • 地理位置发生变化:检查你的 geofeed,并向发生变化的数据库提交更正(参见修正 IP 地理位置)。如果 IP 段是租用的,请告知出租方。
  • RPKI 状态不是 valid:检查 ROA 中的 ASN 和最大长度是否正确(参见 ROA 与 RPKI)。无效路由可能在几小时内被许多网络丢弃。

常见问题

所有地址在 Spamhaus 上都显示为已收录

你的查询经过了公共或共享解析器,而 Spamhaus 会屏蔽这类解析器;返回的结果是错误码,并不代表被收录。请确认脚本使用 @127.0.0.1 且 unbound 正在运行,或者改用 DQS 密钥。

为什么忽略 PBL 收录?

Spamhaus PBL 收录的是不应直接向互联网发送邮件的地址段。它是一份策略性列表,并不代表存在滥用行为;确实需要发信的 IP 可以在 Spamhaus 网站上申请从中移除。

可以添加更多黑名单吗?

可以,把区域添加到 ZONES 中即可。添加前请先查看各列表的使用政策:有些列表要求注册后才能进行自动查询,有些列表会因为与你自身行为无关的原因而收录整个地址段。

如果按以上步骤操作后问题仍未解决,请提交工单联系 IMIDC 7×24 技术支持,并附上你的 IP 段、脚本输出,以及报告问题的黑名单或数据库,方便工程师快速定位。

这篇文章有帮助吗?

相关教程