IP・ASN

IP ブロックのブラックリスト・位置情報・RPKI を自動監視:Telegram 通知付きスクリプト

5 ステップ 10 分で読めます 42 回閲覧 0
目次

レンタルした IP ブロックの状態は、予告なく変わることがあります。1 人の顧客が原因でアドレスがブラックリストに載る、位置情報データベースがレンジを別の国に移す、ROA の変更でアナウンスが invalid になる、といったケースです。数週間後にユーザーから知らされるのでは、損失が大きくなります。この記事では、ブロック内のすべてのアドレスを毎日主要な DNS ブラックリストで確認し、位置情報を想定の国と比較し、RPKI を検証して、変化があれば Telegram にメッセージを送る小さな監視スクリプトを作成します。

Spamhaus は、8.8.8.8 や 1.1.1.1 などの大規模なパブリックリゾルバー経由の問い合わせには応答しません(代わりにエラーコード 127.255.255.254 が返ります)。ステップ1のように、サーバー上の自前のリゾルバーでチェックを実行してください。Spamhaus の無料サービスは少量かつ非商用の利用が対象です。商用で監視する場合は、Spamhaus の Data Query Service(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 をブラックリストのゾーンで確認するには、オクテットを逆順に並べてゾーン名を付け加えます。応答がない(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 ブロック向けに書かれているため、より大きなブロックは /24 ごとの行に分けてください。/24 全体を 4 つのゾーンで確認すると約 1,000 件の DNS 問い合わせになり、数分かかりますが、1 日 1 回であれば問題ありません。

ステップ4:Telegram にアラートを送信

Uptime Kuma による監視と Telegram 通知の手順に従って Telegram ボットを作成し、チャット 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:検出結果への対応

  • ブラックリスト掲載:そのアドレスを使っているサーバーや顧客を特定して原因(多くは侵害されたサーバーや設定ミスのあるメール送信スクリプト)を止め、そのうえでブラックリストの Web サイトから削除を申請します(IP ブラックリストの確認と解除を参照)。
  • 位置情報の変化:geofeed を確認し、変化があったデータベースに修正を申請します(IP 位置情報の修正を参照)。リースしているブロックの場合は、貸し手に連絡してください。
  • RPKI が valid でない:ROA に正しい ASN と最大プレフィックス長が記載されているか確認します(ROA と RPKIを参照)。invalid な経路は、数時間以内に多くのネットワークで破棄される可能性があります。

よくある質問

すべてのアドレスが Spamhaus に掲載と表示される

問い合わせがパブリックまたは共有のリゾルバーを経由しており、Spamhaus にブロックされています。返ってきているのは掲載ではなくエラーです。unbound を起動した状態で、スクリプトが @127.0.0.1 を使っていることを確認するか、DQS キーを使用してください。

PBL への掲載を無視するのはなぜですか?

Spamhaus PBL は、インターネットへ直接メールを送ることが想定されていないレンジを掲載するリストです。ポリシー上のリストであり、不正利用の兆候ではありません。実際にメールを送信する IP は、Spamhaus の Web サイトから PBL の掲載を解除できます。

ブラックリストを追加できますか?

はい、ZONES にゾーンを追加してください。事前に各リストの利用ポリシーを確認しましょう。自動照会に登録が必要なリストや、お客様自身の行動とは無関係な理由でレンジ全体を掲載するリストもあります。

上記の手順で解決しない場合は、サポートチケットを送信して IMIDC の 24 時間 365 日対応テクニカルサポートへご連絡ください。IP ブロック、スクリプトの出力、問題を報告しているブラックリストまたはデータベースを添えていただくと、より迅速に調査できます。

この回答はお役に立ちましたか?

関連チュートリアル