SSH

Fail2Banが起動しない?原因別トラブルシューティングガイド

Fail2Ban SSH トラブルシューティング

Fail2Banが起動しない?
原因別トラブルシューティングガイド

Fail2Banをインストールしたのにサービスが起動しない――そんなトラブルに遭遇したことはありませんか?
この記事では、Fail2Banが「failed」になる主要な原因と解決方法を、実際のエラーログ付きで解説します。

こんな人向けの記事です

  • Fail2Banをインストールしたが failed で起動しない
  • Have not found any log file for sshd jail エラーが出る
  • Failed to initialize any backend for Jail 'sshd' と表示される
  • rsyslogが入っていない環境でFail2Banを動かしたい

Fail2Banとは

Fail2Banは、ログファイルを監視して不正なログイン試行を検知し、攻撃元IPを自動的にブロックするセキュリティツールです。

SSHへのブルートフォース攻撃対策として広く使われており、指定回数ログインに失敗したIPアドレスをiptablesやnftablesで一定時間BANします。

Fail2BanはSSH以外にも、Nginx、Apache、Postfixなど様々なサービスの防御に使えます。

まず状態を確認する

Fail2Banが正常に動作しているか確認するには、以下のコマンドを実行します。

# サービスの状態を確認
sudo systemctl status fail2ban

# sshd jailの状態を確認
sudo fail2ban-client status sshd

正常な場合は active (running) と表示されます。問題がある場合は以下のようなエラーが出ます。

× fail2ban.service - Fail2Ban Service
     Active: failed (Result: exit-code) since ...
   Main PID: 1928 (code=exited, status=255/EXCEPTION)

詳細なエラーはjournalctlで確認できます。

sudo journalctl -u fail2ban --no-pager -n 30

原因1: ログファイルが見つからない

最もよくあるエラーがこれです。

ERROR  Failed during configuration: Have not found any log file for sshd jail

Fail2Banのデフォルト設定では、/var/log/auth.log(Debian/Ubuntu)や/var/log/secure(CentOS/RHEL)からSSHのログを読み取ります。

しかし、以下のような場合にログファイルが存在しないことがあります。

  • rsyslogが未インストールまたは停止している(最小構成のVPSで多い)
  • ログローテーションで削除された直後
  • コンテナ環境でsyslogが使われていない

ログファイルの存在を確認しましょう。

# Debian/Ubuntuの場合
ls -la /var/log/auth.log

# CentOS/RHELの場合
ls -la /var/log/secure

原因2: python3-systemdが未インストール

backend = systemd を設定しても、以下のエラーで起動しない場合があります。

RuntimeError("Failed to initialize any backend for Jail 'sshd'")

これは python3-systemd パッケージが不足しているためです。Fail2Banがsystemd journalからログを読むには、このPythonバインディングが必要です。

# Debian/Ubuntu
sudo apt install python3-systemd

# CentOS/RHEL
sudo dnf install python3-systemd
注意
python3-systemdをインストールしないままbackend = systemdを設定すると、Fail2Banは起動直後にクラッシュします。エラーメッセージにはパッケージ名が表示されないため、原因特定に時間がかかることがあります。

原因3: rsyslogが停止・未インストール

VPSの最小構成インストールでは、rsyslogが含まれていないことがあります。

# rsyslogの状態を確認
systemctl is-active rsyslog

# インストールされているか確認
dpkg -l | grep rsyslog

rsyslogがインストールされていない場合、/var/log/auth.logは生成されません。対処法は2つあります。

方法A: rsyslogをインストールする

sudo apt install rsyslog
sudo systemctl enable rsyslog
sudo systemctl start rsyslog

方法B: systemd backendに切り替える(推奨)

rsyslogをインストールせず、systemd journalから直接ログを読む方法です。次のセクションで詳しく解説します。

解決策: systemd backendに切り替える

rsyslogに依存しない最も確実な方法は、Fail2Banのバックエンドをsystemdに変更することです。

手順1: python3-systemdをインストール

sudo apt install python3-systemd

手順2: jail.localを編集

/etc/fail2ban/jail.local を以下のように設定します。

# /etc/fail2ban/jail.local

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3

[sshd]
enabled = true
port = 3715          # 実際のSSHポート番号に変更
filter = sshd
backend = systemd    # ← ここがポイント
maxretry = 3
backend = systemd を指定すると、logpath の設定は不要になります。Fail2Banがsystemd journalから直接SSHのログを読み取ります。

手順3: Fail2Banを再起動

sudo systemctl restart fail2ban

# 状態を確認
sudo systemctl status fail2ban
sudo fail2ban-client status sshd

正常に起動すると、以下のように表示されます。

● fail2ban.service - Fail2Ban Service
     Active: active (running)

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned:  0
   |- Total banned:      0
   `- Banned IP list:

動作確認

Fail2Banが正常に動作しているか確認する方法です。

jailの状態を確認

# 全jailの一覧
sudo fail2ban-client status

# sshd jailの詳細
sudo fail2ban-client status sshd

BANされたIPを確認

# 現在BANされているIP一覧
sudo fail2ban-client status sshd | grep "Banned IP"

# iptablesで確認
sudo iptables -L f2b-sshd -n

手動でBAN/UNBAN

# 特定のIPをBAN
sudo fail2ban-client set sshd banip 192.168.1.100

# BANを解除
sudo fail2ban-client set sshd unbanip 192.168.1.100

設定ファイルリファレンス

設定項目 説明 デフォルト値
bantime BANする時間(秒) 600
findtime この時間内のmaxretry回失敗でBAN(秒) 600
maxretry BANするまでの失敗回数 5
backend ログの読み取り方法 auto
ignoreip BANしないIP(ホワイトリスト) 127.0.0.1/8

backendの種類

backend 説明 必要なもの
auto 自動選択(pyinotify → gamin → polling) ログファイルが必要
systemd systemd journalから読み取り python3-systemd
polling 定期的にログファイルを読み取り ログファイルが必要

まとめ

Fail2Banが起動しない主な原因と対処法をまとめます。

エラー 原因 対処法
Have not found any log file rsyslog未インストールでauth.logが無い rsyslogをインストール or backend=systemd
Failed to initialize any backend python3-systemdが未インストール apt install python3-systemd
起動後すぐにfailed 設定ファイルの構文エラー fail2ban-server -xf --logtarget=STDOUT -vvv で確認
推奨構成: rsyslogの有無に関わらず backend = systemd + python3-systemd の組み合わせが最も安定します。systemd journalはほぼ全てのLinuxディストリビューションで利用可能です。