Spamhaus DROPリストを利用した ipset によるスパム対策
不眠症による早起きで、暇なんでまとめた(笑)
●はじめに
サーバをインターネットに公開していると、常に海外からの不正アクセスやスパムメールの試行が行われています。
特に SMTP (port25) はボットネットや踏み台サーバからの接続が多く、メールサーバ管理者にとって大きな負担となります。
そこで有効なのが Spamhaus の DROP/EDROP リストを活用したフィルタリングです。
このリストは「正規用途が一切ない、完全に不正利用されているネットレンジ」だけを収録しており、誤判定のリスクが極めて低いのが特徴です。
これを ipset に取り込み、iptables と組み合わせることで効率的にスパム元を遮断できます。
MTAのDB参照にて拒否することを併用しますが、LOGが汚れがちになるのでリストに登録分はあらかじめルーターやホストでDROPする内容です。
●ipset と Spamhaus DROP リスト
・iptables はルールが多くなると管理や処理が重くなる
・ipset を使うと「大量のIPレンジ」を一つの集合として扱えるため、効率的なフィルタリングが可能
・Spamhaus DROPリストは数千?数万の不正レンジを提供しており、これを ipset にまとめるのが最適
●実装手順
- ipset作成
sudo ipset create spamhaus_drop hash:net family inet hashsize 1024 maxelem 65536
- 自動取得スクリプト作成
/usr/local/bin/update_spamhaus_ipset.sh
#!/bin/bash
IPSET_NAME=“spamhaus_drop”
ipsetが存在しない場合は作成
if ! ipset list -n | grep -q “^${IPSET_NAME}$”; then
ipset create ${IPSET_NAME} hash:net family inet hashsize 1024 maxelem 65536
fi
TMPFILE=$(mktemp)
Spamhaus DROP/EDROPリストを取得
curl -s https://www.spamhaus.org/drop/drop.txt -o $TMPFILE
curl -s https://www.spamhaus.org/drop/edrop.txt » $TMPFILE
ipsetをクリアして更新
ipset flush ${IPSET_NAME}
grep -E “^[0-9]” $TMPFILE | awk ‘{print $1}’ | while read net; do
ipset add ${IPSET_NAME} $net
done
rm -f $TMPFILE
- iptables で適用(SMTP専用)
(INPUTチェインで制限する場合の例)
sudo iptables -I INPUT -p tcp --dport 25 -m set --match-set spamhaus_drop src -j DROP
- 定期更新
cronでupdate_spamhaus_ipset.shを定期実行
●運用のポイント
・まずは port25(SMTP)限定で適用するのがおすすめ→ 誤ブロックのリスクがほぼなく、効果をすぐ実感できる
・問題がなければ全INPUT(又はFORWARD)にも展開可能
・誤ってブロックされた場合は個別解除可能
●まとめ
・Spamhaus DROPリストは世界的に信頼性が高く、誤判定の少ないブロックリスト
・ipset と組み合わせることでサーバ負荷を抑えつつ効率的にスパム元を遮断可能
・国別ブロックと比較して副作用が少なく、シンプルに運用できる
実際の運用上でのパケットDROP数を張り付けます。
ポート25のみでなく、サーバー宛すべてに適用しています。
昨日の夕方以降に何故か集中攻撃を受けて、ほんの二時間程度の間に400件以上来ていたけど、スパムメールは一切届いていません。
Chain FORWARD
num pkts bytes target prot opt in out source destination
1 438 25660 DROP all -- * * 0.0.0.0/0 192.168.1.1 match-set spamhaus_drop src
スクリプトでDLしているSpamhaus DROPリストの更新はブラックリストDBより少し遅れるのでその分は漏れてきますが、下記のようにsendmailでのDB参照で弾くため、スパムメールが届くことは滅多にありません。
これにより、メールアドレスの公開も問題なくなります。
Oct 2 04:57:17 pacific sm-mta[893]: STARTTLS=server, relay=[112.192.188.218], version=TLSv1, verify=NOT, cipher=ECDHE-RSA-AES256-SHA, bits=256/256
Oct 2 04:57:18 pacific sm-mta[893]: 591JvG60000893: ruleset=check_rcpt, arg1=null@sky.0t0.jp, relay=[112.192.188.218], reject=550 5.7.1 null@sky.0t0.jp… Rejected: 112.192.188.218 listed at sbl.spamhaus.org
Oct 2 04:57:18 pacific sm-mta[893]: 591JvG60000893: lost input channel from [112.192.188.218] to MTA after rcpt
Oct 2 04:57:18 pacific sm-mta[893]: 591JvG60000893: from=takeoshota1995@cuiki.com, size=0, class=0, nrcpts=0, proto=ESMTPS, daemon=MTA, relay=[112.192.188.218]
Oct 2 05:02:41 pacific sm-mta[1050]: STARTTLS=server, relay=[42.179.166.157], version=TLSv1.2, verify=NOT, cipher=ECDHE-RSA-AES256-GCM-SHA384, bits=256/256
Oct 2 05:02:42 pacific sm-mta[1050]: 591K2dnq001050: ruleset=check_rcpt, arg1=null@sky.0t0.jp, relay=[42.179.166.157], reject=550 5.7.1 null@sky.0t0.jp… Rejected: 42.179.166.157 listed at sbl.spamhaus.org
Oct 2 05:02:42 pacific sm-mta[1050]: 591K2dnq001050: lost input channel from [42.179.166.157] to MTA after rcpt
Oct 2 05:02:42 pacific sm-mta[1050]: 591K2dnq001050: from=yukiirie@ktjie.com, size=0, class=0, nrcpts=0, proto=ESMTPS, daemon=MTA, relay=[42.179.166.157]
上記LOG中、宛先の null@sky.0t0.jp は、サイトで公開している実在する有効なメールアドレスです。
sbl.spamhaus.org参照により、550応答を返しています。