「/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 で即座に確認できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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
基本設定: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
応用設定:セキュリティを強化する
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
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
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
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
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 |
まずは
maxretry=3、bantime=86400 のSSH保護から始めて、慣れたら Apache や Postfix にも拡張していきましょう。次のステップ:
・Linux DNS 設定の基本 で名前解決の仕組みも合わせて理解する
・firewalldによるゾーン管理も併用すると多層防御が完成する
「セキュリティを意識したLinux運用」ができるエンジニアになりたいなら
fail2banでSSH不正アクセスを自動遮断できると、夜中に攻撃を受けても安心して眠れます。
ネットの古い情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:pvs・vgs・lvsコマンドでLVM構成を確認する方法|ディスク容量とPV・VG・LV一覧を把握する
- 前のページへ:timedatectlコマンドでLinuxのタイムゾーンと時刻を設定する方法|NTP有効化から確認手順まで
- この記事の属するカテゴリ:Linuxtips・セキュリティへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます