はじめに
メールサーバーを運用していると知らないうちに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_IPS と CHECK_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で定期実行することで、登録を早期に検知し、迅速に対処できます。
「送ったはずのメールが届かない」というトラブルを未然に防ぐため、ぜひ活用してみてください。