CentOS 7でfail2banが動作しない。

postfix-sasl向けにfail2banを導入していたのですが、failedは検知してくれてるのに全然Banできてなかったので原因を調べました。私の環境ではfirewalldとipsetを使ってBanしています。
/etc/fail2ban/jail.local はこんな感じ。

[DEFAULT]
bantime = -1
findtime = 600
maxretry = 5
backend = systemd
banaction = firewallcmd-ipset

[sshd]
enabled = true

[postfix-sasl]
enabled = true
logpath = /var/log/mail/maillog

[sshd-ddos]
enabled = true

/var/log/fail2ban.logには特に情報がありませんでした。
DEFAULTのbanactionにfirewallcmd-ipsetを設定しているので、firewallcmd-ipsetの動作を見直せば動くかなぁ。

/etc/fail2ban/action.d/firewallcmd-ipset.confはこんな感じ。

[Definition]

actionstart = ipset create fail2ban-<name> hash:ip timeout <bantime>
              firewall-cmd --direct --add-rule ipv4 filter <chain> 0 -p <protocol> -m multiport --dports <port> -m set --match-set fail2ban-<name> src -j <blocktype>

actionstop = firewall-cmd --direct --remove-rule ipv4 filter <chain> 0 -p <protocol> -m multiport --dports <port> -m set --match-set fail2ban-<name> src -j <blocktype>
             ipset flush fail2ban-<name>
             ipset destroy fail2ban-<name>

actionban = ipset add fail2ban-<name> <ip> timeout <bantime> -exist

actionunban = ipset del fail2ban-<name> <ip> -exist

firewall-cmd —reloadがないですね。そりゃ動かんわ。 (2019/10/30追記)ドキュメント読む限り、reloadがないのが原因ではなかったのですが、じゃあなんで動かなかったのかがわからない…。 (参考:Documentation - HowTo - Reload firewalld | firewalld)bantimeをデフォルト値にしても動作しませんでした。

/etc/fail2ban/action.d/firewallcmd-ipset.localで設定を上書きします。bantimeいらないなぁとか色々考えた結果以下で運用することにしました。

[Definition]
actionstart = ipset create fail2ban-<name> hash:ip
              firewall-cmd --permanent --direct --add-rule ipv4 filter <chain> 0 -m set --match-set fail2ban-<name> src -j <blocktype>
              firewall-cmd --reload

actionstop = firewall-cmd --permanent --direct --remove-rule ipv4 filter <chain> 0 -m set --match-set fail2ban-<name> src -j <blocktype>
             firewall-cmd --reload
             ipset flush fail2ban-<name>
             ipset destroy fail2ban-<name>

actionban = ipset add fail2ban-<name> <ip> -exist

[Init]
blocktype = DROP

無事Banされるようになりました。

Status for the jail: postfix-sasl
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- Journal matches:  _SYSTEMD_UNIT=postfix.service
`- Actions
   |- Currently banned: 9
   |- Total banned:     9
   `- Banned IP list:   大体中国