私はfail2ban/firewalld
を使用して、ボットのようなNginx
サーバーへのアクセスを制限しています。通常、対応する刑務所の構成は次のようになります。
[nginx-botsearch]
#banaction = iptables-multiport
enabled = true
filter = nginx-botsearch
logpath = /var/log/nginx*/*access*.log
maxretry = 3
bantime = 3600
これは期待どおりに機能します(禁止はデフォルトでfirewallcmd-ipset
になります)。つまり、iptables -L
コマンドはINPUT_direct
チェーンのエントリを表示します。
REJECT tcp -- anywhere anywhere multiport dports http,https match-set fail2ban-nginx-botsearch src reject-with icmp-port-unreachable
fail2ban-nginx-botsearch
の対応するipset
を使用します。
しかし、bantime
を増やすと、奇妙な動作に気づきました。 bantime <= 4294967
ではすべてが期待どおりに機能します。 bantime = 4294968
を設定してfail2ban
サービスをリロードすると、iptables
出力のエントリが失われ(ipsetが作成されません)、実際、たとえばab
ユーティリティは、禁止が強制されていないことを示しています。興味深いことに、banaction = iptables-multiport
の使用は、「大規模な」禁止時間でも機能します。この動作の理由は何でしょうか? CentOS7でfail2banv0.9.7を使用しています。
これは厳密にはfail2ban
関連の問題ではなく、カーネルのnetfilter
コードのバグです。つまり、お使いのバージョンのipset
にはtimeout
パラメータの整数オーバーフローがあるため、32ビット整数を超えると予測できない動作が見られます。
マルチコードではこのコードを使用せず、タイムアウトを追跡するために独自のデバイスに依存しているため、これは表示されません。
これは、netfilterコードのこの問題のパッチへの リンク です。