IP 與 ASN

IP 段自動監控:黑名單、地理位置與 RPKI 每日檢測並推送 Telegram 告警

5 個步驟 9 分鐘閱讀 51 次閱讀 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 段、指令碼輸出,以及報告問題的黑名單或資料庫,方便工程師快速定位。

這篇文章有幫助嗎?

相關教程