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が正常に動作しているか確認するには、以下のコマンドを実行します。
# サービスの状態を確認
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 で確認 |
backend = systemd + python3-systemd の組み合わせが最も安定します。systemd journalはほぼ全てのLinuxディストリビューションで利用可能です。