本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^
SSHのログが攻撃の痕跡だらけ…あなたのサーバーは大丈夫?
SHでサーバーにログインしてログを確認したら、見知らぬIPアドレスから大量のログイン試行が…!。何とかならんかと探していたらfail2banに行き当たりました。
Fail2banとは?サーバーの頼れる用心棒!
Fail2banは、何度もログインに失敗してくるような怪しいIPアドレスを自動的に検知し、一時的にサーバーへのアクセスを禁止(BAN)してくれる、まるでサーバーの用心棒のようなツールです
【本編】Fail2banの導入から設定までを完全解説
インストール作業は超簡単
基本的にapt-get install fail2banを実行するだけ
# apt-get install fail2ban
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
python3-pyinotify whois
提案パッケージ:
mailx monit sqlite3 python-pyinotify-doc
以下のパッケージが新たにインストールされます:
fail2ban python3-pyinotify whois
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 1 個。
549 kB のアーカイブを取得する必要があります。
この操作後に追加で 2,684 kB のディスク容量が消費されます。
続行しますか? [Y/n]
取得:1 http://deb.debian.org/debian bookworm/main amd64 fail2ban all 1.0.2-2 [451 kB]
取得:2 http://deb.debian.org/debian bookworm/main amd64 python3-pyinotify all 0.9.6-2 [27.4 kB]
取得:3 http://deb.debian.org/debian bookworm/main amd64 whois amd64 5.5.17 [70.8 kB]
549 kB を 1秒 で取得しました (446 kB/s)
以前に未選択のパッケージ fail2ban を選択しています。
(データベースを読み込んでいます ... 現在 52948 個のファイルとディレクトリがインストールされています。)
.../fail2ban_1.0.2-2_all.deb を展開する準備をしています ...
fail2ban (1.0.2-2) を展開しています...
以前に未選択のパッケージ python3-pyinotify を選択しています。
.../python3-pyinotify_0.9.6-2_all.deb を展開する準備をしています ...
python3-pyinotify (0.9.6-2) を展開しています...
以前に未選択のパッケージ whois を選択しています。
.../whois_5.5.17_amd64.deb を展開する準備をしています ...
whois (5.5.17) を展開しています...
whois (5.5.17) を設定しています ...
fail2ban (1.0.2-2) を設定しています ...
Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /lib/systemd/system/fail2ban.service.
python3-pyinotify (0.9.6-2) を設定しています ...
man-db (2.11.2-2) のトリガを処理しています ...
設定ファイルをコピーする
jail.conf を直接編集せず、jail.local という名前でコピーして編集する理由(「元の設定ファイルを汚さず、アップデート時にも自分の設定が消えないようにするためのお作法です」)
# cp jail.conf jail.local
コンフィグを編集(下記はデフォルトのまま)
vi jail.local
# "bantime" is the number of seconds that a host is banned.
bantime = 10m
# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 10m
# "maxretry" is the number of failures before a host get banned.
maxretry = 5
[sshd]
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode = normal
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
とりあえず、設定は変更せずデフォルトで運用してみます。
コンフィグの意味
maxretry = 5
「最大試行回数」のことです。
ここで設定された回数(この場合は5回)だけ認証に失敗すると、アクセス禁止の対象になります。
findtime = 10m
「監視時間」のことです。
maxretryで設定した回数の失敗を、どのくらいの期間内にカウントするかを定義します。この場合は10分間です。
例えば、1回目の失敗から10分以上経ってから5回目の失敗をしても、それはカウントされません。
bantime = 10m
「アクセス禁止時間 (BANする時間)」のことです。
条件(10分以内に5回失敗)を満たしてしまったIPアドレスを、どのくらいの時間ブロックするかを定義します。この場合は10分間です。この時間が経過すると、ブロックは自動的に解除されます。
Fail2banを起動・有効化する
systemctl enable(OS起動時に自動で立ち上がるようにするおまじない)と systemctl start(今すぐ起動するスイッチ)で起動します。
# systemctl enable fail2ban
Synchronizing state of fail2ban.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable fail2ban
スタート
systemctl start fail2ban
もし、この手順が「少し難しい」と感じたら…
コマンド操作や設定ファイルの編集に、もしご不安を感じたとしても、それは決して珍しいことではありません。サーバー管理には専門的な知識が求められる場面もございます。
実は、最近の高性能なレンタルサーバー(VPS)は、こうした専門的な設定の手間を最小限に抑え、誰もが直感的に、そして安全にサーバーを運用できるような工夫が凝らされています。
- 洗練されたコントロールパネル: 黒い画面(CUI)をあまり使わずに、Webブラウザ上で各種設定が完結します。
- 充実したセキュリティ機能: ファイアウォール設定などが標準で、かつ簡単に利用できるようになっています。
- 手厚いサポート体制: 不明な点があれば、専門のスタッフに相談できます。
もし現在のサーバー環境の管理に少しでも負担を感じていらっしゃるなら、より快適な運用が可能なサーバーへの乗り換えを検討されてみてはいかがでしょうか。日々の管理に費やす時間を、本来注力すべきコンテンツ制作やビジネスの成長に充てることは、非常に賢明な投資と言えます。
▼ 初心者の方でも安心して利用できる、人気の国産VPS ▼
- ConoHa VPS: 業界トップクラスの使いやすい管理画面が特長です。サーバーの性能も高く、サイトの表示速度向上にも貢献します。初めてVPSを利用する方に最もおすすめできるサービスの一つです。
- Xserver VPS: 国内シェアNo.1のレンタルサーバー「エックスサーバー」が提供するVPSです。長年の運用実績に裏打ちされた高い安定性と、充実したサポート体制が魅力です。
ちゃんと動いてる?動作確認とログの見方
ステータスの確認
systemctl status fail2ban を実行し、active (running) と緑色で表示されていればOK!
# systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; preset: enabled)
Active: active (running) since Wed 2025-10-15 16:40:04 JST; 15min ago
Docs: man:fail2ban(1)
Main PID: 931890 (fail2ban-server)
Tasks: 5 (limit: 18947)
Memory: 38.2M
CPU: 484ms
CGroup: /system.slice/fail2ban.service
└─931890 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
10月 15 16:40:04 TestDB systemd[1]: Started fail2ban.service - Fail2Ban Service.
10月 15 16:40:05 TestDB fail2ban-server[931890]: 2025-10-15 16:40:05,010 fail2ban.configreader [931890]: WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'
10月 15 16:40:05 TestDB fail2ban-server[931890]: Server ready
ログを確認する
# journalctl -u fail2ban
10月 15 16:40:04 TestDB systemd[1]: Started fail2ban.service - Fail2Ban Service.
10月 15 16:40:05 TestDB fail2ban-server[931890]: 2025-10-15 16:40:05,010 fail2ban.configreader [931890]: WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'
10月 15 16:40:05 TestDB fail2ban-server[931890]: Server ready
テストでわざとパスワードミスって、5回目の認証で

BANされるとこんなログ
2025-10-15 16:59:12,261 fail2ban.filter [931890]: INFO [sshd] Found 192.168.11.10 - 2025-10-15 16:59:02
2025-10-15 16:59:12,262 fail2ban.filter [931890]: INFO [sshd] Found 192.168.11.10 - 2025-10-15 16:59:03
2025-10-15 16:59:12,263 fail2ban.filter [931890]: INFO [sshd] Found 192.168.11.10 - 2025-10-15 16:59:08
2025-10-15 16:59:12,264 fail2ban.filter [931890]: INFO [sshd] Found 192.168.11.10 - 2025-10-15 16:59:11
2025-10-15 16:59:15,895 fail2ban.filter [931890]: INFO [sshd] Found 192.168.11.10 - 2025-10-15 16:59:15
2025-10-15 16:59:16,179 fail2ban.actions [931890]: NOTICE [sshd] Ban 192.168.11.10
ログにこのように Ban という文字が出力されれば、用心棒がしっかり仕事をしてくれている証拠です!
まとめ:Fail2banでサーバーに安心をプラスしよう!
Fail2banを導入することで、ブルートフォース攻撃への不安が軽減され、サーバー管理がより快適になります。
Fail2banは強力ですが、これだけで万全というわけではありません。SSHのポート番号変更や鍵認証方式の導入など、他のセキュリティ対策と組み合わせることで、さらに鉄壁の守りを実現できます。
おまけ:fail2banが作ったiptablesのルールを覗いてみよう!
fail2banがIPアドレスをブロックするとき、実際にサーバーの**ファイアウォール(iptables)**にどのようなルールを追加しているか、気になりませんか?
fail2banは、ブロック対象のサービスごとに専用のチェーン(ルールのグループ)を作ります。たとえば、SSHサービス(sshd)を守るために作られたチェーンは、通常以下のような名前になります。
f2b-sshdチェーンの正体
iptables -nvL
Chain f2b-sshd (1 references)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * ???.???.???.163 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * ???.???.???.167 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * ???.???.???.170 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * ???.???.???.166 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * ???.???.???.169 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * ???.???.???.172 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * ???.???.???.177 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * ???.???.???.174 0.0.0.0/0 reject-with icmp-port-unreachable
見ての通り、fail2banはブロックしたいIP(???.???.???.163など)に対して**REJECT**というアクションを設定しています。
【💡ここがポイント】 REJECTは、パケットを拒否するだけでなく、「あなたからの接続は拒否しましたよ」というお返事(ICMPエラー)を相手に返す動作です。これは攻撃者に対して「このIPにはサーバーがいるけど、接続を閉じてるよ」と存在を教えているようなもので、あまりスマートではありませんし、応答を返す分、リソースも使います。
永続的な「沈黙」を選び取る:DROPへの昇華
fail2banは設定時間でREJECTを解除してしまいますが、私たちは「このIPアドレスはもう永久に相手にしたくない!」と考えます。
そこで、登場するのが**iptablesの最重要チェーンINPUTと、アクションDROP**です。
DROPはREJECTと違い、パケットが来ても完全に無視し、一切応答を返しません。攻撃者から見ると、あたかもそのIPアドレスにサーバーが存在しないかのように見える、究極の沈黙です。
ここではシンプルに、f2b-sshdチェーンに登録されているIPアドレスを抜き出し、INPUTチェーンにDROPルールとして追加します。
ざっくり現在fail2banがブロックしているIPアドレスを抜き出します。
8行目を取得
iptables -nvL |egrep '^ 0' |awk '{print $8}' |sort
0.0.0.0/0
0.0.0.0/0
0.0.0.0/0
10.0.0.0/8
???.???.???.163
???.???.???.166
???.???.???.167
???.???.???.168
???.???.???.169
???.???.???.170
???.???.???.171
???.???.???.172
???.???.???.173
???.???.???.174
???.???.???.175
???.???.???.176
???.???.???.177
(このコマンドで、ブロック対象のIPアドレスがリストアップされます。)
次に、抽出したIPアドレスに対して、INPUTチェーンに永続的なDROPルールを追加します!いらんやつを、INPUT TABLEでDROPします
iptables -A INPUT -s ???.???.???.163 -j DROP
////省略
これで、fail2banの管理を離れても、このIPアドレスからのパケットは認証プロセスにすら到達せず、サーバーの入り口(INPUTチェーン)で即座に**ドロップ(破棄)**されます。
fail2ban で拒否しているIPアドレスもなくなり、ちょっとすっきりしました。
Chain f2b-sshd (1 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
すべてのブロック対象IPが消え、最後に**RETURN**ルールだけが残ります。これは「次のチェーンに進まず、元のINPUTチェーンに戻るよ」という意味です。
これで、IPアドレスの拒否はINPUTチェーンが担当し、fail2banのリストもスッキリ!よりセキュアに、よりクリーンにサーバーを運用できるようになりましたね!
おまけ2:運用管理のためのコマンド
全体的な動作状況
# fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd
Fail2banの現在の全体的な動作状況を示しています。
Number of jail: 1現在、Fail2banが監視・実行しているルール(jail)が1つあることを意味します。Jail list: sshdその実行中のルール(jail)の名前がsshdであることを示しています。
現在のステータスを取得
fail2ban-client status sshd
# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 5
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: ?.?.?.88
Status for the jail: sshdsshdルールの状態です。Filter(検知状況)Currently failed: 0現在(findtimeの期間内)カウントされている失敗回数です。「0」は、直近ではBAN条件(maxretry)に達するほどの連続した攻撃がないことを意味します。Total failed: 5Fail2banが起動してから検知した累計の失敗回数(ログで見つけた回数)です。File list: /var/log/auth.log現在監視しているログファイルが/var/log/auth.logであることを示しています。
Actions(防御状況)Currently banned: 1現在、1件のIPアドレスがBAN(ブロック)されていることを示しています。Total banned: 1Fail2banが起動してからBANした累計の回数(IPの延べ数)です。Banned IP list: ?.?.?.88現在BANされているIPアドレスのリストです。(セキュリティのため一部隠されていますが)末尾が.88のIPがブロックされています。

