Fail2Banを使って不正なアクセスを遮断する(全自動)

スポンサーリンク

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
修正:末尾の「–all」は「ハイフン2つ」が正しい表記ですが、1つ足りず「-all」となっていたのをコメントでご指摘頂いたので修正しました。ありがとうございました!(2021/12/27)

Comment

  1. 何も考えず yum update し、ver9あたりから 11になり、
    気が付いたら機能してなくて 中を見たら複雑になってて困り果てていました。

    とても参考になりました。
    アクションでメール飛ばすあたりがまるで違い、こんなんわかるかー!って感じで。

    ひとまず元の動作を取り戻し yum.conf にも除外を書いて一安心です。ありがとうございました。

    あ、一箇所記載ミスが。最下部の「すべてのbanを解除」ですが、「–all」のようです。重箱の隅をつつくようですみません。

    • --(ハイフン2つ)がまとめられてる…orz

    • 設定が煮詰まると何年も触らない事があるのでビックリしますよね(笑)
      まるきり変わってるのに、過去の設定を何とか活用しようとして無駄な遠回りをしたりとか。
      ご指摘ありがとうございました!

タイトルとURLをコピーしました