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で定期的に実行して自動追加を実現しています。