fail2banコマンドでブルートフォース攻撃を自動ブロックする方法|SSHの不正アクセス対策とトラブルシュートも

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, セキュリティ > fail2banコマンドでブルートフォース攻撃を自動ブロックする方法|SSHの不正アクセス対策とトラブルシュートも
「サーバーに不審なログイン試行が来ているけど、どう防げばいいんだろう」
「/var/log/secure を見たら知らないIPから何千回もSSHを叩かれていた」

Linuxサーバーを公開した瞬間から、世界中のボットが自動でパスワードを試し続けます。
こうしたブルートフォース攻撃を自動でブロックするのが fail2ban です。

この記事では、fail2ban の仕組みから始まり、SSHの不正アクセスを遮断する実際の設定手順、よくあるトラブルの対処まで、RHEL 9.4 / Rocky Linux 9 / Ubuntu 24.04 LTS での動作確認済みの内容を解説します。

この記事のポイント

・fail2ban は認証失敗ログを監視し、閾値超過IPをfirewalldでブロックする
・設定は jail.local で行い、jail.conf は直接編集しない
・maxretry・findtime・bantime の3つが制御の核心
・ban状態の確認は fail2ban-client status sshd で即座に確認できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

fail2ban とは何か? なぜ必要なのか

Linuxサーバーをインターネットに公開すると、数分以内に SSHポート(22番)への接続試行が始まります。
これはスキャンボットと呼ばれる自動プログラムで、世界中のIPから24時間休まず動いています。

手動でIPをブロックしていては追いつきません。
fail2ban は、この作業を自動化するセキュリティツールです。

動作の仕組み:

ログ監視(filter):指定したログファイルを tail -F のようにリアルタイムで監視する
パターンマッチ(failregex):認証失敗メッセージを正規表現で検出する
カウント(findtime 内の失敗回数):一定時間内に閾値(maxretry)を超えたIPを記録する
アクション実行(action):閾値超過IPをfirewalldやiptablesでブロックする

コンポーネント 役割
jail 監視する対象(SSHd・Apache等)の設定単位
filter 失敗パターンを検出する正規表現定義
action ブロック方法(firewalld・iptables・メール通知)
bantime ブロック継続時間(秒)、-1 で永続BAN
findtime 失敗をカウントする時間枠(秒)
maxretry findtime 内で許容する最大失敗回数

fail2ban のインストール手順

1. RHEL 9 / Rocky Linux 9 へのインストール

RHEL 9 系では、fail2ban は EPEL リポジトリに含まれています。

# EPEL リポジトリを有効化する # dnf install epel-release -y # fail2ban をインストールする # dnf install fail2ban -y # インストールされたバージョンを確認する # fail2ban-client --version Fail2Ban v1.0.2

2. Ubuntu 24.04 LTS へのインストール

Ubuntu では apt でそのまま取得できます。

# パッケージリストを更新する # apt update # fail2ban をインストールする # apt install fail2ban -y # バージョン確認 # fail2ban-client --version Fail2Ban v1.0.2

3. サービスを有効化して起動する

# fail2ban をシステム起動時に自動起動する設定 # systemctl enable fail2ban # fail2ban を今すぐ起動する # systemctl start fail2ban # 動作状態を確認する # systemctl status fail2ban * fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; preset: disabled) Active: active (running) since Sat 2026-05-03 09:12:34 JST; 2min 15s ago Docs: man:fail2ban(1) Main PID: 12345 (fail2ban-server) Tasks: 5 (limit: 23123) Memory: 28.3 MB CPU: 1.245s CGroup: /system.slice/fail2ban.service └─12345 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

systemctl の詳しい使い方は systemctlコマンドでLinuxのサービスを管理する方法 も参照してください。

基本設定:jail.local を作成する

fail2ban の設定は /etc/fail2ban/jail.conf に書かれていますが、このファイルは直接編集しません。
パッケージ更新で上書きされるためです。
代わりに /etc/fail2ban/jail.local を作成し、上書きしたい項目だけを記述します。

1. jail.local を作成する

# jail.conf を元に jail.local を作成する(方法1: ゼロから作成) # cat /etc/fail2ban/jail.conf | grep -v "^#" | grep -v "^$" > /etc/fail2ban/jail.local # または推奨方法:シンプルに必要な設定だけ記述する # vi /etc/fail2ban/jail.local

2. 基本設定(DEFAULT セクション)

[DEFAULT] # 自分自身のIPをBAN対象から除外する(スペース区切りで複数指定可) ignoreip = 127.0.0.1/8 ::1 203.0.113.10 # BANを継続する時間(秒)。-1 で永続BAN bantime = 3600 # この時間内(秒)に失敗した回数をカウントする findtime = 600 # findtime 内にこの回数を超えたらBAN対象にする maxretry = 5 # バックエンドの選択。auto が推奨(systemd環境では systemd が自動選択される) backend = auto # メール送信先(action でmail* を使う場合) destemail = root@localhost # アクションの指定(firewalldを使う場合) banaction = firewallcmd-ipset banaction_allports = firewallcmd-allports [sshd] enabled = true port = ssh logpath = %(sshd_log)s backend = %(sshd_backend)s maxretry = 3 bantime = 86400

設定値の目安:

bantime = 3600:1時間BAN。通常の設定
bantime = 86400:24時間BAN。SSH等の重要サービスに推奨
bantime = -1:永続BAN。信頼できるIP管理が必要なため慎重に
maxretry = 3:3回失敗でBAN。SSHは少なめに設定が鉄則
findtime = 600:10分以内の失敗をカウント

3. 設定を反映して再起動する

# fail2ban を再起動して設定を反映する # systemctl restart fail2ban # または設定ファイルの再読み込み(サービスを止めずに反映) # fail2ban-client reload

fail2ban の動作確認

1. jail の状態を確認する

# 有効な jail 一覧を表示する # fail2ban-client status Status |- Number of jail: 1 `- Jail list: sshd # sshd jail の詳細を表示する # fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 47 | `- File list: /var/log/secure `- Actions |- Currently banned: 1 |- Total banned: 3 `- Banned IP list: 192.0.2.45

各フィールドの意味:

Currently failed:現在監視中(findtime 内)の失敗カウント
Total failed:fail2ban 起動以来の累計失敗数
Currently banned:現在BAN中のIP数
Banned IP list:BAN中IPアドレスの一覧

2. fail2ban のログを確認する

# fail2ban のログをリアルタイムで監視する # tail -f /var/log/fail2ban.log 2026-05-03 09:15:43,231 fail2ban.filter [12345]: INFO [sshd] Found 192.0.2.45 - 2026-05-03 09:15:43 2026-05-03 09:16:01,892 fail2ban.filter [12345]: INFO [sshd] Found 192.0.2.45 - 2026-05-03 09:16:01 2026-05-03 09:16:22,104 fail2ban.filter [12345]: INFO [sshd] Found 192.0.2.45 - 2026-05-03 09:16:22 2026-05-03 09:16:22,831 fail2ban.actions [12345]: NOTICE [sshd] Ban 192.0.2.45

3. BAN 済みIPを手動で解除する

誤って自分のIPをBANしてしまった場合などに使います。

# BAN 中のIPを手動で解除する # fail2ban-client set sshd unbanip 192.0.2.45 # 解除後に状態を確認する # fail2ban-client status sshd

ポートの確認は Linux ポート確認の全コマンド も合わせて参照すると、ブロック前後のポート状態を確認できます。

応用設定:セキュリティを強化する

1. 繰り返し攻撃者を永続BANする(recidive jail)

bantime 中に再度検出されたIPを永続BANする仕組みが recidive(再犯)jail です。

[recidive] enabled = true logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s bantime = 604800 ; 7日間BAN findtime = 86400 ; 24時間以内に maxretry = 5 ; 5回BANされたら永続BANへ

2. 複数サービスの保護設定例

# Apache への不審なアクセスをブロックする [apache-auth] enabled = true port = http,https logpath = %(apache_error_log)s maxretry = 6 # Postfix(SMTP認証失敗)をブロックする [postfix-sasl] enabled = true port = smtp,465,submission logpath = %(postfix_log)s backend = %(postfix_backend)s maxretry = 5

Postfix の設定については Postfix の基本設定の解説 も参照してください。

3. 許可IPを一時的に追加する(ignoreip)

# 実行中の fail2ban に一時的にIPを除外追加する(再起動で消える) # fail2ban-client set sshd addignoreip 198.51.100.0/24 # 現在の ignoreip 設定を確認する # fail2ban-client get sshd ignoreip

4. カスタムフィルタを作成する

独自サービスのログを監視したい場合は、/etc/fail2ban/filter.d/ にフィルタファイルを作成します。

# カスタムフィルタファイルを作成する(例:独自アプリ) # vi /etc/fail2ban/filter.d/myapp.conf [Definition] # 認証失敗パターンの正規表現 failregex = ^%(__prefix_line)sAuthentication failed for .* from $ ^%(__prefix_line)sInvalid user .* from $ # 除外パターン(誤検知を防ぐ) ignoreregex = # フィルタのテスト(実際のログに対してマッチするか確認) # fail2ban-regex /var/log/myapp.log /etc/fail2ban/filter.d/myapp.conf

トラブルシュート・よくあるエラー対処

1. 「ERROR No file(s) found for glob」エラー

ログファイルのパスが間違っている場合に発生します。

# エラーの確認 # journalctl -u fail2ban --since "10 minutes ago" ERROR No file(s) found for glob /var/log/secure # 対処:ログファイルの実際のパスを確認する # ls -la /var/log/auth.log # Ubuntu の場合 # ls -la /var/log/secure # RHEL/CentOS の場合 # fail2ban.log でも確認できる # grep "ERROR" /var/log/fail2ban.log | tail -20

対処方法:jail.local の logpath をシステムの実際のログパスに合わせて修正します。
Ubuntu 系は /var/log/auth.log、RHEL 系は /var/log/secure が正しいパスです。

2. ban しているはずなのに繋がる

# firewalld の fail2ban チェーンを確認する # firewall-cmd --direct --get-all-rules | grep fail2ban ipv4 filter f2b-sshd 0 -s 192.0.2.45/32 -j REJECT --reject-with icmp-port-unreachable # iptables で確認する(firewalld を使っていない場合) # iptables -n -L f2b-sshd Chain f2b-sshd (1 references) target prot opt source destination REJECT all -- 192.0.2.45 0.0.0.0/0 reject-with icmp-port-unreachable RETURN all -- 0.0.0.0/0 0.0.0.0/0

BANされているはずなのに接続できる場合は、firewalld が正しく動作しているか確認してください。

3. 自分のIPが間違えてBAN された

# 自分のIPを確認する(BAN されている場合は別端末から実行) # who am i tomohiro pts/0 2026-05-03 09:30 (203.0.113.10) # BAN を解除する # fail2ban-client set sshd unbanip 203.0.113.10 # 今後のために ignoreip に追加する(jail.local を編集) # vi /etc/fail2ban/jail.local # ignoreip = 127.0.0.1/8 ::1 203.0.113.10 # 再起動して設定を反映する # systemctl restart fail2ban

予防策:
ignoreip に自分のIPを事前に登録しておく
maxretry を 5 以上にして、タイプミスの余裕を持たせる
・コンソール(KVM/IPMI)からのアクセス手段を事前に確保しておく

4. fail2ban 起動時に「Can't find 'sshd' jail」エラー

# エラー確認 # systemctl status fail2ban fail2ban.service: Main process exited, code=exited, status=255/EXCEPTION # ログを確認する # cat /var/log/fail2ban.log | grep "ERROR" ERROR No section: 'sshd' # 原因:jail.conf に sshd セクションが存在するか確認する # grep -n "\[sshd\]" /etc/fail2ban/jail.conf

SELinux 環境での注意点

RHEL 9 / Rocky Linux 9 は SELinux が有効のため、fail2ban が正しく動作しないケースがあります。

# SELinux の audit ログで fail2ban 関連の拒否を確認する # ausearch -m avc -ts recent | grep fail2ban # fail2ban に関連する SELinux 拒否がある場合、ポリシーを追加する # ausearch -m avc -ts recent | audit2allow -M fail2ban-local # semodule -i fail2ban-local.pp # SELinux の状態確認 # getenforce Enforcing

SELinux の監査ログ分析については ausearchコマンドでLinuxの監査ログを検索・分析する方法 も参照してください。

fail2ban の動作テスト(実際に試してみる)

設定が正しいかをテストする方法を紹介します。

1. フィルタが正しく動作するかテストする

# 実際のログファイルに対して sshd フィルタをテストする # fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf Running tests ============= Use failregex filter file : sshd, basedir: /etc/fail2ban Use log file : /var/log/secure Use encoding : UTF-8 Results ======= Failregex: 143 total |- #) [# of hits] regular expression | 1) [143] ... Date template hits: |- [# of hits] date format | [143] ExYear-Month-Day{T}00:00:00(?:Z|[+-]...) server kernel: ... Success, the total number of match is 143

2. 設定ファイルの構文を検証する

# 設定ファイルの構文エラーを確認する(起動前の確認に有効) # fail2ban-client -t OK: configuration test is successful

本記事のまとめ

やりたいこと コマンド
fail2ban を起動する systemctl start fail2ban
sshd jail の状態確認 fail2ban-client status sshd
特定IPのBAN解除 fail2ban-client set sshd unbanip 192.0.2.45
フィルタの動作テスト fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf
設定ファイルの構文確認 fail2ban-client -t
設定の再読み込み fail2ban-client reload
ログのリアルタイム確認 tail -f /var/log/fail2ban.log
一時的なIP除外追加 fail2ban-client set sshd addignoreip 198.51.100.0/24
fail2ban を正しく設定することで、SSH へのブルートフォース攻撃を大幅に抑制できます。
まずは maxretry=3bantime=86400 のSSH保護から始めて、慣れたら Apache や Postfix にも拡張していきましょう。

次のステップ:
Linux DNS 設定の基本 で名前解決の仕組みも合わせて理解する
・firewalldによるゾーン管理も併用すると多層防御が完成する

「セキュリティを意識したLinux運用」ができるエンジニアになりたいなら

fail2banでSSH不正アクセスを自動遮断できると、夜中に攻撃を受けても安心して眠れます。
ネットの古い情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。