Postfixでメールサーバを構築していますが、しつこくSMTP Authを試みてくるアドレスが
たくさんあります。
Firewalldのdropで、一つずつアドレスを追加してしましたが、あまりに多くて管理が大変でした。
ipsetでブロックリストが使えることが分かったので、そちらに切り替えました。
まず、ipsetを追加します(以下すべてrootでの実行としています)。
# firewall-cmd --permanent --new-ipset=blocklist --type=hash:ip
ブロックするIPアドレスは、以下のように追加します。
# firewall-cmd --permanent --ipset=blocklist --add-entry=xxx.xxx.xxx.xxx
たくさんのIPアドレスを一括で追加するには、IPアドレスを以下のようなテキストファイルを
作成します(仮にdroplistとします)。
# cat droplist
xxx.xxx.xxx.xxx
yyy.yyy.yyy.yyy
zzz.zzz.zzz.zzz/24
一括登録するには以下のように追加します。
# firewall-cmd --permanent --ipset=blocklist --add-entries-from-file=droplist
拒否するリストに追加するために以下を実行します。
# firewall-cmd --permanent --zone=drop --add-source=ipset:blocklist
設定を有効にするには、以下を実行します。
# firewall-cmd --reload
設定内容を確認するには、以下のコマンドを実行します。
# firewall-cmd --zone=drop --ipset=blocklist --get-entries
これで、しつこい攻撃は拒否できますが、リストにないアドレスからのアクセスは止まりません。
そこで、自動的に新たなアドレス追加するスクリプト(fwadd.sh)を作成しました。
# cat fwadd.sh
#!/bin/bash
cat /var/log/maillog | grep 'authentication failed' | awk '{print $7}' > /var/tmp/mail_authfail.log
sed -i -e "s/\[/ /g" /var/tmp/mail_authfail.log
sed -i -e 's/\]\://g' /var/tmp/mail_authfail.log
cat /var/tmp/mail_authfail.log | awk '{print $2}' | sort | uniq -c | sort -nr > /root/authfail.log
firewall-cmd --permanent --ipset=blocklist --get-entries > droplist
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' authfail.log | awk '{print $1}' | sort | uniq | while read ip; do
if grep -q "$ip" droplist; then
:
else
firewall-cmd --permanent --ipset=blocklist --add-entry=$ip/32
firewall-cmd --reload
fi
done
簡単に解説しますと、maillogから'authentication failed'の存在チェックして、authfail.logを作成します。
次に、ipsetのエントリーをdroplistに作成し、その中にauthlog.logのIPアドレスが存在しなかったら
リストに追加するというものです。これをcronで定期的に実行して自動追加を実現しています。