web-dev-qa-db-ja.com

fail2banでの最大禁止時間

私は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を使用しています。

4
ewcz

これは厳密にはfail2ban関連の問題ではなく、カーネルのnetfilterコードのバグです。つまり、お使いのバージョンのipsetにはtimeoutパラメータの整数オーバーフローがあるため、32ビット整数を超えると予測できない動作が見られます。

マルチコードではこのコードを使用せず、タイムアウトを追跡するために独自のデバイスに依存しているため、これは表示されません。

これは、netfilterコードのこの問題のパッチへの リンク です。

3
Peter Zhabin