Fail2Ban
Fail2Banはログを監視し、おかしなアクセスがあったらBAN、指定時間を過ぎたらUNBANを自動で実行してくれるツールです。
Fail2Ban自体に遮断する機能はありませんが、iptablesやfirewalldと連携して遮断と解除を自動でやってくれるので非常に楽ちんです。
Fail2Banがログを監査 > しきい値を超えたIPを発見 > BAN(iptablesやfirewalldで遮断) > 指定時間経過でBAN解除 という流れです。
[recidive]というルールも標準で用意されており、再検知した場合はより厳しい条件でのBANも可能です。
インストールはパッケージ管理ツールなどで導入するだけなので省略し、実際の設定方法などを見ていきます。
定義さてれいるフィルタ(監視対象)
デフォルトで対応しているサービスは以下のディレクトリにあるxxx.confで確認できます。
/etc/fail2ban/filter.d/
有名どころの多くは定義されており、一般的な設定であればそのまま使えますが、対象のサービスが無い場合やログの形式を大幅に変更している場合、除外したいURLがある場合などはフィルタの修正が必要です。
3proxy.conf apache-auth.conf apache-badbots.conf apache-botsearch.conf apache-common.conf apache-fakegooglebot.conf apache-modsecurity.conf apache-nohome.conf apache-noscript.conf apache-overflows.conf apache-pass.conf apache-shellshock.conf apache-wplogin.conf assp.conf asterisk.conf botsearch-common.conf common.conf counter-strike.conf courier-auth.conf courier-smtp.conf cyrus-imap.conf directadmin.conf dovecot.conf dropbear.conf drupal-auth.conf ejabberd-auth.conf exim-common.conf exim-spam.conf exim.conf freeswitch.conf froxlor-auth.conf groupoffice.conf gssftpd.conf guacamole.conf haproxy-http-auth.conf horde.conf ignorecommands kerio.conf lighttpd-auth.conf mongodb-auth.conf monit.conf murmur.conf mysqld-auth.conf nagios.conf named-refused.conf nginx-botsearch.conf nginx-http-auth.conf nginx-limit-req.conf nsd.conf openhab.conf openwebmail.conf oracleims.conf pam-generic.conf perdition.conf php-url-fopen.conf portsentry.conf postfix-rbl.conf postfix-sasl.conf postfix.conf proftpd.conf pure-ftpd.conf qmail.conf recidive.conf roundcube-auth.conf screensharingd.conf selinux-common.conf selinux-ssh.conf sendmail-auth.conf sendmail-reject.conf sieve.conf slapd.conf sogo-auth.conf solid-pop3d.conf squid.conf squirrelmail.conf sshd-ddos.conf sshd.conf stunnel.conf suhosin.conf tine20.conf uwimap-auth.conf vsftpd.conf webmin-auth.conf wuftpd.conf xinetd-fail.conf
定義されているアクション
アクションは検知した時の動きを定義しています。
フィルタより修正する機会は少ないですが、例えばiptablesでREJECTをDROPに変更したい場合などはこれらを修正します。
/etc/fail2ban/action.d/
Fail2BanはBANもUNBANも自動で行ってくれますが、例えば「iptables-multiport.conf」の内容を確認してみると、ルールの追加と削除のコマンドがそのまま書いてあります。
BAN時には「-I」オプションでルールを追加し、
actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
UNBAN時には「-D」オプションでルールを削除しています。
actionunban = <iptables> -D f2b-<name> -s <ip> -j <blocktype>
Fail2Banの基本的な設定(jail.local)
/etc/fail2ban/ にある jail.conf という設定ファイルでもFail2Banの設定が行えますが、基本的にFail2Banの設定ファイルのうち、拡張子が「.conf」のものはFail2Banのアップデート時に上書きされる可能性があります(フィルタやアクションも同じです)
このため、拡張子「.local」のファイルを作成しますが全て書く必要はなく、「変更箇所だけ」そこに記述していきます。
[]で囲われた名称がセクション(JAILルール名)で、続いて記述するとそのセクションの設定が行えます。
[DEFAULT] セクション
Fail2Banの基本的な挙動を指定します。
各設定はセクションごとに指定したもので上書きされますので、未指定の場合の動きなどをここで指定します。
BANしないホスト
banしないホストは「IPアドレス」か「CIDR」形式で記述します。
複数記述する場合は半角スペース区切りです。
自分がバンされてしまうとサーバへアクセスできなくなるので、自分のホストも忘れずに登録しておくのと、サーバー自身も登録しておかないと自縄自縛になりますので注意します。
[DEFAULT] # banしないホスト ignoreip = 127.0.0.1/8 192.168.2.0/24
BANする時間や監視スパン
サービスごとに必ず指定するなら設定不要です。
未指定の場合はこの値が適用されます。
「findtime」内に、「maxretry」回数のログ行が出現した場合、「bantime」の時間BANするという意味です。
ログイン失敗などはほぼ即座にBANしてもいいと思いますが、DDOS防御などは普通のアクセスまでBANされないように、実際の状況に合わせて調整していく必要があります。
# バンする時間(秒) # デフォルト600(10分) bantime = 97542 # 監視スパン # デフォルト600(10分) findtime = 600 # リトライ回数 # デフォルト5 maxretry = 2
アクションとメール通知
BAN時にメール通知する設定です。
# アラートメールの通知先 destemail = webmaster@aimix.jp # アラートメールの送信元 sender = no-reply@aimix.jp # BANが発動した時のアクション #「%(action_)s」:BANのみ(デフォルト) #「%(action_mw)s」:BANしてWhois情報を含めてメール通知 #「%(action_mwl)s」:BANしてWhois情報とログ情報をメール通知 action = %(action_mwl)s
メール通知を有効にしておくとBANされた際に以下のような件名で通知してくれます。
[Fail2Ban] apache-ddos: banned 123.123.123.123 from aimix.jp
BANのみ(メール通知なし)
action = %(action_)s
メール通知する
action = %(action_m)s
メール通知する(Whois情報も含める)
「whois」や「jwhois」がインストールされている場合に有効です。
whoisがインストールされていない場合でもエラーにはなりませんが、メールに「missing whois program」と記載されます。
action = %(action_mw)s
メールに含まれるWhoisの一部を抜粋すると以下のような感じです。
Here is more information about 123.123.123.123 : [Querying whois.apnic.net] [whois.apnic.net] % [whois.apnic.net] % Whois data copyright terms % Information related to '123.123.123.0 - 123.123.123.123' % Abuse contact for '123.123.123.0 - 123.123.123.123' is 'cybersecurity_abuse@example.com.ph' inetnum: 123.123.123.0 - 123.123.123.123 netname: GLBB_IP_BLOCK descr: NETWORK ASSIGNED IP ADDRESS descr: Pakati descr: Philippines country: PH
メール通知する(Whois情報と対象ログの一部を含める)
ここまでメールに含めると、メールを見るだけで何が起こったのか把握できるので便利です。
action = %(action_mwl)s
遮断を受け持つサービス
BANが発動したときに、どのサービスで遮断するかを指定します。
実際の挙動は /etc/fail2ban/action.d/ にある「xxx.conf」に記述されています。
以下はiptablesで遮断する場合の例です。
# デフォルトiptables-multiport # iptablesでログを出したいのでiptables-multiport-logをデフォルトにする banaction = iptables-multiport-log banaction_allports = iptables-allports
[recidive] セクション
[recidive] セクションはBANしたターゲットが解除後に再び引っかかった場合、さらに長期BANをするための設定のため、Fail2Banのログを対象にします。
「findtime」内に「maxretry」以上引っかかった場合、さらに「bantime」の間banするという意味です。
[recidive] enabled = 1 filter = recidive logpath = /var/log/fail2ban.log bantime = 604800 ; 1 week findtime = 86400 ; 1 day maxretry = 4
メール通知が有効な場合は以下のような件名で通知されます。
[Fail2Ban] recidive: banned 123.123.123.123 from aimix.jp
対象サービスごとのセクションと設定
以降の「jail.local」には監視対象とするサービスの設定を追加していきます。
[]で指定するセクション名は /etc/fail2ban/filter.d/ にあるフィルタ名を指定します。
以下のような感じで追記していきますが、指定しなかったオプションは「jail.conf」のものが使用されますので、見比べながら設定していくと良いと思います。
# apacheに対するDDoS攻撃 [apache-ddos] enabled = 1 port = http,https filter = apache-ddos logpath = /var/log/httpd/*access_log banaction = iptables-multiport-log maxretry = 10 findtime = 3 bantime = 720 backend = polling # apacheの認証失敗で遮断 [apache-auth] enabled = 1 port = http,https banaction = iptables-multiport-log maxretry = 3 findtime = 600 bantime = 600 backend = polling
各項目を見ていきます。
enabled =
設定を有効にする場合は「1」または「true」、無効にする場合は「0」または「false」を指定します。
port =
対象のポートを指定します。
httpdの場合は「http」と「https」を指定するか、ポート番号で「80」と「443」を指定してもOKです。
ニーモニックで指定する場合
port = http,https
ポート番号で指定する場合
port = 80,443
jail.confだと以下のようにすべてのポートが対象になっています。
port = 0:65535
filter =
ログから対象行を抽出するためのフィルタを指定します。
指定するフィルタは /etc/fail2ban/filter.d/ にあり、apache-ddos.conf の場合は以下のように指定します。
filter = apache-ddos
logpath =
ログのパスやファイル名は環境によって異なる場合があるため、必要に応じてここで指定します。
「logpath」を指定する場合は後述する「backend」を「polling」にしないと監査してくれないので注意が必要です。
logpath = /var/log/httpd/*access_log
デフォルトで参照するログは /etc/fail2ban/ 内の「paths-」で始まる.confファイルにありますので、指定されているログと異なるパスやファイル名の場合は上記で指定が必要です。
稼働中のFail2Banが参照しているログは「fail2ban-client status セクション名」コマンドで確認できます。
例えば「apachhe-ddos」を確認してみると、
fail2ban-client status apache-ddos
以下のように /var/log/httpd/access_log と /var/log/httpd/ssl_access_log を参照しているのがわかります(logpathのファイル名をワイルドカードで指定しているため)
Status for the jail: apache-ddos |- Filter | |- Currently failed: 1 | |- Total failed: 69391 | `- File list: /var/log/httpd/access_log /var/log/httpd/ssl_access_log `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:
動作確認でBANされない場合は、上記のログパスが合っているか確認してみましょう。
banaction =
BANのアクションを指定します。
/etc/fail2ban/action.d/ の設定ファイル名がそうで、「iptables-multiport.conf」の場合は「iptables-multiport」を指定します。
banaction = iptables-multiport-log
maxretry / findtime
「findtime」内に「maxretry」回の出現があるとBANします。
普段失敗する可能性の低いサービスは「findtime」を長く、「maxretry」を小さくすると、少しの失敗でBANされます。
apacheなどのddos検知では「画像」や「css」、「js」などの同時に読み込まれる細かなファイルは、ログに出力しないようにするか、フィルタで除外しないとあっという間にBANされてしまうので注意が必要です。
bantime =
BANする時間を指定します。
この時間をすぎるとiptablesの場合はルールが削除され、再びアクセスできるようになります。
BANされたホストはFail2Banのログに残っており、再び検知すると [recidive] の設定によって、より厳しいBANが行われます。
ログイン失敗のようなアクセスはいきなり厳しいBANでも良いと思います。
秒単位で指定するので、12分の場合は「720」と指定します。
bantime = 720
backend =
systemd環境ではログ収集をjournaldが受け持っており、未指定の場合はsystemdになります。
これだと「logpath=」でログを指定しても監査できないため、「backend = polling」として一定期間おきにログを見に行くようにしておきます。
backend = polling
action =
jail.localで定義したデフォルトのBANアクションをサービスによって異なるものにしたい場合はここで指定します。
指定しない場合はjail.localで指定したアクションが実行されます。
# BANのみ action = %(action_)s # BANとメール通知 action = %(action_m)s # BANとメール通知(whois情報を含める) action = %(action_mw)s # BANとメール通知(whois情報とサービスのログも含める) action = %(action_mwl)s
ignoreip =
jail.localで定義したBANの対象にしないホストを上書きしたい場合に記述します。
追加でなく上書きされる点に注意してください。
# banしないホスト ignoreip = 127.0.0.1/8 192.168.2.0/24
フィルタの修正
/etc/fail2ban/filter.d/ 以下にフィルタがあり、検出する条件などが記載されたファイルがあります。
除外する条件の追加(ignoreregex)
フィルタ内の定義のうち「ignoreregex」は除外する条件が記述されています。
1行につき1つの除外条件を記述しますので、複数の条件がある場合は以下のように追加していきます。
先頭の半角スペースは無視されるのでインデントとして使えます。
ignoreregex = 条件1 条件2 条件3
条件は正規表現で記述するので、以下は指定拡張子を除外しています。
ignoreregex = \.(?i)(js|css|woff|eot|ttf|ico|txt|xml|swf|xlsx?|docx?|pptx?)
指定ディレクトリを除外する場合
ignoreregex = \.(?i)(jpe?g|gif|png|bmp|pdf|js|css|woff|eot|ttf|ico|txt|xml|swf|xlsx?|docx?|pptx?) \/dir1.* \/dir1\/dir.* \/dir2\/.*
failにする条件の追加(failregex)
基本的に「ignoreregex」と同じ書式で、複数の条件を指定する場合に1行に1つ記述するのも同じなので省略します。
最初から複数の条件が記述されている「apache-auth.conf」などを参考にすると良いかもしれません。
除外する「ignoreregex」の方が優先されるので、この「failregex」で対象になるログ行を漏れなく網羅しておき、その中で除外する条件を「ignoreregex」で書く感じで良いです。
フィルタの追加(独自のフィルタとJAILルール)
DoS攻撃の検知と遮断っぽいフィルタを追加してみます。
Webアプリケーションであればapacheのフィルタが近いので、apache-xxx.conf をコピーして流用すると比較的楽に新しいフィルタが作成できます。
フィルタの作成
以下のようにフィルタファイルを作成します。
/etc/fail2ban/filter.d/apache-ddos.conf
中身は以下のような感じで、すべての行を対象にしますが、拡張子がjpgとかみたいな画像は除外しています。
[Definition] failregex = <HOST>.*"(HEAD|GET|POST).* ignoreregex = \.(?i)(jpe?g|gif|png|bmp|svg|pdf|js|css|woff|woff2|eot|ttf|ico|txt|xml|swf|xlsx?|docx?|pptx?)
あまりにシンプルすぎると余計なアクセスまで検知してしまうので、除外する表現を実際の使用環境に合わせて追記しておきます。
[Definition] failregex = <HOST>.*"(HEAD|GET|POST).* ignoreregex = \.(?i)(jpe?g|gif|png|bmp|svg|pdf|js|css|woff|woff2|eot|ttf|ico|txt|xml|swf|xlsx?|docx?|pptx?) \/wp-admin.* \/test1\/test.*
fail2ban-regexで動作テスト
フィルタが正しく動作するか、ログファイルと、作成したフィルタファイルを指定して確認します。
fail2ban-regex [対象ログファイル] [フィルタファイル]
実際の実行例は以下のような感じです。
fail2ban-regex /var/log/httpd/access_log /etc/fail2ban/filter.d/apache-ddos.conf
jail.localにルールを追記
以下のファイルに作成したJAILルールを登録します。
/etc/fail2ban/jail.local
[]で指定するセクション(JAILルール名)や、filterなどは作成したフィルタファイルと同じ名称にしておきます。
他の設定と異なるのは「port」や「logpath」などで、どれくらいでBANするかは実際に運用しながら調整していきます。
[apache-ddos] enabled = 1 port = http,https filter = apache-ddos logpath = /var/log/httpd/*access_log banaction = iptables-multiport-log maxretry = 20 findtime = 3 bantime = 600 backend = polling
動作確認
fail2ban再起動で反映と確認をします。
追加したのは「apache-ddos」というJAILルールなので、以下のようにしてステータスを確認します。
fail2ban-client status apache-ddos
メール通知も最初のうちは有効にしておいて、必要なアクセスまでBANされてないかチェックした方が良いです。
jail.local の「ignoreip」で自分のIPを遮断しないように追記しておき、それ以外の端末のブラウザから「F5」連打してBANされるか確認します。
設定ミスで自分のBANが解除されない状況になると困るので、最初のうちは「bantime」は短めにしておいた方が良いかもしれません。
fail2ban-regex(テストツール)
fail2banがログのホスト名を認識しているか確認
fail2banがホスト名部分を認識しているかチェックする場合は以下のように実行します。
fail2ban-regex [ログファイル] "<HOST>"
apacheのログファイルの例
fail2ban-regex /var/log/httpd/access_log "<HOST>"
正しく認識している場合はログの行数と同じ結果が返ってきます。
0件の場合はログのパスが違うか、ログファイルが標準的な
Results ======= Failregex: 49 total |- #) [# of hits] regular expression | 1) [49] <HOST> `-
フィルタのfailregexのテスト
ログファイルを指定してフィルタのfailregexテストする場合は以下のようにします。
とりあえずテストしてみるなら /etc/fail2ban/filter.d/ 以下にあるフィルタの xxx.conf から抜き出して試すのが良いです。
fail2ban-regex [ログファイル] "[failregexの表現]"
フィルタの xxx.conf で以下のように指定していた場合の例です。
[failregexの表現] はダブルコーテーションで囲う必要があるため、以下のように表現内に「”」が含まれている場合は、
failregex = <HOST>.*"(HEAD|GET|POST).*
以下のように「\」でエスケープする必要があります。
fail2ban-regex /var/log/httpd/access_log "<HOST>.*\"(HEAD|GET|POST).*"
フィルタのfailregexとignoreregexのテスト
除外する条件も加えてテストする場合は、以下のように末尾に除外条件の [ignoreregexの表現] を加えて実行します。
これも “” で囲う必要があるため、表現内に ” がある場合は \” としてエスケープしておきます。
fail2ban-regex [ログファイル] "[failregexの表現]" "[ignoreregexの表現]"
apacheのaccess_logは接続してきたホスト名(またはIP)は必ず出てくるので [failregexの表現] を “<HOST>” とするとすべての行が一致します。
これに加えて除外条件の [ignoreregexの表現] を “TEST” にしてみます(TESTという文字列を含む行を除外)
正規表現が使えますが、全体を表現する必要はなく出現する文字列を指定すればOKです。
fail2ban-regex /var/log/httpd/access_log "<HOST>" "TEST"
テスト用の全部で55行のログです。
実行結果はこんな感じです。
Results ======= Failregex: 18 total |- #) [# of hits] regular expression | 1) [18] <HOST> `- Ignoreregex: 37 total |- #) [# of hits] regular expression | 1) [37] TEST `- Date template hits: |- [# of hits] date format | [55] Day(?P<_sep>[-/])MON(?P=_sep)ExYear[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)? `- Lines: 55 lines, 37 ignored, 18 matched, 0 missed [processed in 0.08 sec]
Failregexが18件となっていますが、一致条件の「failregex」から、除外条件の「ignoreregex」を引いて最終的に「failregex」として扱われる件数です。
Failregex: 18 total
以下がignoreregexで除外した件数です。
Ignoreregex: 37 total
ログとフィルタ.confを指定してテスト
以下のような感じで監査対象のログファイルと、フィルタファイル(.conf)を指定してテストできます。
フィルタの修正後などはいきなり適用せず、ここでおかしな動作じゃないか確認しておくと良いです。
fail2ban-regex [対象ログファイル] [フィルタファイル]
実際の実行例は以下のような感じです。
fail2ban-regex /var/log/httpd/access_log /etc/fail2ban/filter.d/apache-ddos.conf
実行結果は以下のような感じです。
Running tests ============= Use failregex filter file : apache-ddos, basedir: /etc/fail2ban Use log file : /var/log/httpd/access_log Use encoding : EUC-JP Results ======= Failregex: 11330 total |- #) [# of hits] regular expression | 1) [11330] <HOST>.*"(HEAD|GET|POST).* `- Ignoreregex: 0 total Date template hits: |- [# of hits] date format | [11332] Day(?P<_sep>[-/])MON(?P=_sep)Year[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)? `- Lines: 11332 lines, 0 ignored, 11330 matched, 2 missed
エラーが出ないか、無視するべき行までFailregexにカウントされてないかなどをチェックしておきます。
その他の設定
iptablesでログを残す
ログを残すアクションもデフォルトで用意されているので、bannactionで指定するだけです。
banaction = iptables-multiport
以下のように変更するだけです。
banaction = iptables-multiport-log
共通の設定なら jail.local の [DEFAULT] セクションで、セクションごとに変更したい場合は各セクションで指定します。
iptablesのログを別ファイルに出力したい場合はrsyslogの設定も必要です。
iptablesでブロックタイプをREJECTからDROPにする
REJECTは拒否したことを相手に伝えますが、拒否したことを伝えると違う手をされるだけなので、DROPで捨ててしまいます。
/etc/fail2ban/action.d/ に iptables-common.local を作成しますが、他の設定と同様に変更する箇所だけ記述すればOKです。
[Init] blocktype = DROP [Init?family=inet6] blocktype = DROP
iptables-common.conf の中を見ると blocktype = REJECT –reject-with icmp6-port-unreachable という行がありますが、これをDROPで上書きするという感じです。
[Init] がIPv4用、[Init?family=inet6] がIPv6用で、修正後はFail2Banを再起動すると反映されます。
IPv4のiptablesは以下のコマンドで、
iptables -nvL
IPv6のip6tablesは以下のコマンドで確認します。
ip6tables -nvL
修正前は以下のように「REJECT」となっていますが、
Chain f2b-fail2ban (1 references) pkts bytes target prot opt in out source destination 0 0 REJECT all -- * * 123.123.123.123 123.123.123.123/0 reject-with icmp-port-unreachable 0 0 REJECT all -- * * 123.123.123.123 123.123.123.123/0 reject-with icmp-
修正後は「DROP」になりました。
Chain f2b-fail2ban (1 references) pkts bytes target prot opt in out source destination 0 0 DROP all -- * * 123.123.123.123 123.123.123.123/0 0 0 DROP all -- * * 123.123.123.123 123.123.123.123/0
fail2ban-clientコマンド
稼働中のFail2Banのステータスを確認したりアンバンしたりと色々できます。
かなり色々できるので、使いそうなコマンドだけ抜粋します。
以下でヘルプが確認できます。
fail2ban-client -h
Fail2Ban設定ファイルのリロード
fail2ban-client reload
JAILルールのリロード
fail2ban-client reload <JAILルール名>
すべてのJAILルールのリロード
fail2ban-client reload --all
稼働中JAILルール一覧
fail2ban-client status
稼働中のJAILルール名が一覧表示されます。
[root@www ~]# fail2ban-client status Status |- Number of jail: 8 `- Jail list: apache-auth, apache-badbots, apache-ddos, apache-nohome, apache-noscript, apache-overflows, apache-wplogin, recidive
稼働中JAILルールのステータス
<JAILルール名>を指定しないと稼働中のJAILルール一覧が表示されるので、名称を忘れた場合はそちらで確認したあと、以下のように指定します。
fail2ban-client status <JAILルール名>
「apache-ddos」の確認例
fail2ban-client status apache-ddos
実行例
Status for the jail: apache-ddos |- Filter | |- Currently failed: 1 | |- Total failed: 17913 | `- File list: /var/log/httpd/access_log `- Actions |- Currently banned: 0 |- Total banned: 2 `- Banned IP list:
各項目の意味は以下のとおりです。
Currently failed:
フィルタにマッチした様子見の状態のIPアドレス数で、検出しているもののBAN条件でないもの。
Total failed:
前日なども含めたフィルタがマッチした合計件数。
File list:
監査対象のログファイルです。
ワイルドカードで指定した場合は複数のログが表示されます。
Currently banned:
現在BAN中のIPアドレス数。
これがある場合、「Banned IP list」にも対象IPがリスト表示されます。
Total banned:
前日なども含めたBANされたIPアドレス数。
Banned IP list:
現在BANされているIPアドレスが表示され、複数ある場合は半角スペース区切りで列挙されます。
手動でのBANと解除
手動BAN
fail2ban-clientコマンドで手動BANしてみます。
fail2ban-client set <JAILルール名> banip <IPアドレス>
その前に現在のBAN状況を確認しておきます。
fail2ban-client status <JAILルール名>
apache-ddosルールを確認する場合は以下です。
fail2ban-client status apache-ddos
「Banned IP list」が空なので、BAN対象はありません。
Status for the jail: apache-ddos |- Filter | |- Currently failed: 1 | |- Total failed: 17537 | `- File list: /var/log/httpd/access_log `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:
123.123.123.123 をBANする場合
fail2ban-client set apache-ddos banip 123.123.123.123
再び以下のコマンドで確認してみると、
fail2ban-client status apache-ddos
「Banned IP list」に「123.123.123.123」が追加されました。
Status for the jail: apache-ddos |- Filter | |- Currently failed: 1 | |- Total failed: 17564 | `- File list: /var/log/httpd/access_log `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 123.123.123.123
BANアクションにiptablesを指定しているので、そちらも確認します。
IPv4の場合
iptables -nvL
IPv6の場合
ip6tables -nvL
「f2b-」で始まるチェインがFail2Banが作成したチェインで、ルールが追加されています。
Chain f2b-apache-ddos (1 references) pkts bytes target prot opt in out source destination 0 0 f2b-apache-ddos-log all -- * * 123.123.123.123 0.0.0.0/0 586K 54M RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
BAN解除
以下のように実行すると解除されます。
fail2ban-client set <JAILルール名> unbanip <IPアドレス>
IPアドレスを複数渡す場合は半角スペースで区切って列挙します。
fail2ban-client set <JAILルール名> unbanip <IPアドレス> <IPアドレス> <IPアドレス>
正しくBAN解除された場合はIPが帰ってきますが、指定したIPがBANされていない場合は以下のようなエルラーが返ってきます。
[root@www ~]# fail2ban-client set apache-ddos unbanip 123.123.123.123 ERROR NOK: ('IP 123.123.123.123 is not banned',)
すべてのBANを解除
Fail2BanでBANしたものすべてが解除されます。
fail2ban-client unban --all
Comment
何も考えず yum update し、ver9あたりから 11になり、
気が付いたら機能してなくて 中を見たら複雑になってて困り果てていました。
とても参考になりました。
アクションでメール飛ばすあたりがまるで違い、こんなんわかるかー!って感じで。
ひとまず元の動作を取り戻し yum.conf にも除外を書いて一安心です。ありがとうございました。
あ、一箇所記載ミスが。最下部の「すべてのbanを解除」ですが、「–all」のようです。重箱の隅をつつくようですみません。
--(ハイフン2つ)がまとめられてる…orz
設定が煮詰まると何年も触らない事があるのでビックリしますよね(笑)
まるきり変わってるのに、過去の設定を何とか活用しようとして無駄な遠回りをしたりとか。
ご指摘ありがとうございました!