2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

メールサーバーを運用していると知らないうちにSpamhausなどのブラックリストに登録されることがあります。
そうなった場合、「メールが送られてないのではないか!」といったお問い合わせにつながります。
いつブラックリストに登録されるか不安で怯える夜を過ごしてしまわぬよう、ブラックリストに登録されているかのスクリプトを作成することで、安心して夜も眠りにつけます。

本記事では、IPアドレスとドメインがブラックリストに登録されていないかをチェックするシェルスクリプトを紹介します。
このスクリプトを作成することで、ブラックリストに登録されたことを検知し、ブラックリスト解除の申請を迅速に行える、といった対応が可能になります。

Spamhausとは

Spamhausは、スパムメール対策のブラックリストを提供する非営利組織です。

リスト名 用途
ZEN IPアドレスのブラックリスト(SBL + CSS + XBL + PBLの統合)
DBL ドメインのブラックリスト

チェックの仕組み

DNSBLは、DNSを利用してブラックリストを照会します。

IPアドレスの場合:

IPアドレス: 192.0.2.1
↓ オクテットを逆順に変換
クエリ: 1.2.0.192.zen.spamhaus.org

ドメインの場合:

ドメイン: example.com
↓ そのまま末尾に追加
クエリ: example.com.dbl.spamhaus.org

スクリプト

#!/bin/bash
#
# Spamhaus ブラックリストチェックスクリプト
#
# 終了コード:
#   0: 正常(ブラックリスト未登録)
#   1: 異常(ブラックリスト登録あり)

#=============================================================================
# 設定 - 環境に合わせて編集してください
#=============================================================================

# チェック対象のIPアドレス(実際のメールサーバーのIPに置き換えてください)
CHECK_IPS=(
    "MAIL_SERVER_1:192.0.2.1"
    "MAIL_SERVER_2:198.51.100.1"
)

# チェック対象のドメイン(実際の送信ドメインに置き換えてください)
CHECK_DOMAINS=(
    "MAIN_DOMAIN:example.com"
    "NOTICE_DOMAIN:mail.example.net"
)

#=============================================================================
# 関数
#=============================================================================

# IPアドレスを逆順に変換
reverse_ip() {
    echo "$1" | awk -F. '{print $4"."$3"."$2"."$1}'
}

# IPアドレスのチェック
check_ip() {
    local name=$1
    local ip=$2
    local reversed=$(reverse_ip "$ip")
    local result=$(dig +short "${reversed}.zen.spamhaus.org")

    if [ -z "$result" ]; then
        echo "[IP] ${name} (${ip}): OK"
        return 0
    else
        echo "[IP] ${name} (${ip}): NG (${result})"
        return 1
    fi
}

# ドメインのチェック
check_domain() {
    local name=$1
    local domain=$2
    local result=$(dig +short "${domain}.dbl.spamhaus.org")

    if [ -z "$result" ]; then
        echo "[Domain] ${name} (${domain}): OK"
        return 0
    elif [[ "$result" =~ ^127\.0\.1\.[0-9]+$ ]]; then
        echo "[Domain] ${name} (${domain}): NG (${result})"
        return 1
    else
        echo "[Domain] ${name} (${domain}): OK"
        return 0
    fi
}

#=============================================================================
# メイン処理
#=============================================================================

ERROR="FALSE"

echo "=== Spamhaus Blacklist Check ==="
echo "Date: $(date '+%Y-%m-%d %H:%M:%S')"
echo ""

# IPチェック
for entry in "${CHECK_IPS[@]}"; do
    name="${entry%%:*}"
    ip="${entry##*:}"
    if ! check_ip "$name" "$ip"; then
        ERROR="TRUE"
    fi
done

# ドメインチェック
for entry in "${CHECK_DOMAINS[@]}"; do
    name="${entry%%:*}"
    domain="${entry##*:}"
    if ! check_domain "$name" "$domain"; then
        ERROR="TRUE"
    fi
done

echo ""
if [ "$ERROR" = "TRUE" ]; then
    echo "Result: FAILED"
    echo "対処: https://www.spamhaus.org/lookup/ で詳細確認・削除申請"
    exit 1
else
    echo "Result: OK"
    exit 0
fi

使い方

1. スクリプトの設定

CHECK_IPSCHECK_DOMAINS を自分の環境に合わせて編集します。

# 実際のメールサーバーIPに置き換え
CHECK_IPS=(
    "本番サーバー:203.0.113.10"
    "バックアップ:203.0.113.11"
)

# 実際の送信ドメインに置き換え
CHECK_DOMAINS=(
    "メイン:yourcompany.co.jp"
    "通知用:notify.yourcompany.co.jp"
)

2. 実行結果の例

正常時: 下記のように、「OK」と表示されます。

=== Spamhaus Blacklist Check ===
Date: 2025-01-15 10:30:00

[IP] MAIL_SERVER_1 (192.0.2.1): OK
[IP] MAIL_SERVER_2 (198.51.100.1): OK
[Domain] MAIN_DOMAIN (example.com): OK

Result: OK

異常時: 「FAILED」と表示されます。この場合、速やかにSpamhausに解除申請を出すのがよいかと思います。

[IP] MAIL_SERVER_1 (192.0.2.1): NG (127.0.0.2)

Result: FAILED
対処: https://www.spamhaus.org/lookup/ で詳細確認・削除申請

応答の意味

  • 応答なし(NXDOMAIN) → ブラックリスト未登録(正常)
  • 127.0.0.X が返る → IPがブラックリスト登録済み
  • 127.0.1.X が返る → ドメインがブラックリスト登録済み

ZEN(IP)やDBL(ドメイン)の主な返却コードは下記を参照ください。
https://www.spamhaus.org/faqs/dnsbl-usage/#200
https://www.spamhaus.org/faqs/domain-blocklist/#291

cronでの定期実行(例)

# 毎時チェック
0 * * * * /path/to/blacklist_check.sh

まとめ

ブラックリストへの登録はメール到達率に直結する死活問題となっており、本スクリプトをcronで定期実行することで、登録を早期に検知し、迅速に対処できます。
「送ったはずのメールが届かない」というトラブルを未然に防ぐため、ぜひ活用してみてください。

参考リンク

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?