VPSサーバーを立てて数時間後、SSH接続のログを見て驚いた経験ありませんか?
$ Failed login attempt for admin from 103.207.39.xxx on port 42156 using SSH2.
$ Failed login attempt for user from 221.181.185.xxx on port 33891 using SSH2.
こんな感じで、世界中からのBrute Force攻撃が延々と続いている…。
実は、私も最初にConoHaでVPSを立てたとき、この光景に震え上がりました。Lovate開発のためにi5サーバーを立てて、WordPressブログを運用し始めた頃のことです。「これ、このまま放置して大丈夫なの?」って不安になったのを覚えています。
でも、適切な対策を取れば、こういった攻撃は簡単にブロックできるんです。今回は、fail2banとufwを使った実践的なセキュリティ対策をお話しします。

なぜfail2banとufwの組み合わせが最強なのか?
まず、なぜこの2つのツールを組み合わせるのかを説明しますね。
ufw(Uncomplicated Firewall)は、基本的なファイアウォール設定を簡単に行うツールです。「このポートは開ける」「このIPアドレスからは全拒否」といった静的なルールを設定できます。
fail2banは、ログを監視して怪しいアクセスを自動的にブロックする動的防御ツールです。「短時間に何回もSSHログインに失敗したIPアドレスを一時的にブロック」といった賢い対応ができます。
- ufw:基本的な防御壁(静的)
- fail2ban:賢い番人(動的)
この組み合わせによって、基本防御 + 攻撃パターンに応じた臨機応変な対応が可能になります。
実際の攻撃ログから学ぶ:こんな攻撃が来ています
設定方法の前に、実際にどんな攻撃が来ているのかお見せしますね。これは私のサーバーの実際のログです:
Dec 15 03:42:15 server sshd[12345]: Failed password for root from 103.207.39.170 port 55324 ssh2
Dec 15 03:42:17 server sshd[12346]: Failed password for admin from 103.207.39.170 port 55325 ssh2
Dec 15 03:42:19 server sshd[12347]: Failed password for user from 103.207.39.170 port 55326 ssh2
Dec 15 03:42:21 server sshd[12348]: Failed password for test from 103.207.39.170 port 55327 ssh2
よくある攻撃パターン:
- 辞書攻撃:admin, user, test, rootなど一般的なユーザー名で総当たり
- IPローテーション:複数のIPアドレスから順番に攻撃
- 時間分散:検知を避けるため時間を空けて攻撃
⚠️ 放置は危険
「パスワード認証無効にしてるから大丈夫」と思っても、これらの攻撃はサーバーリソースを消費します。また、新しい脆弱性が発見された時のリスクも考慮すべきです。
ステップ1:ufw基本設定(まずは基本の防御壁を作る)
まずはufwで基本的なファイアウォールを設定します。
1-1. ufwインストールと有効化
# Ubuntuの場合(通常プリインストール済み)
sudo apt update
sudo apt install ufw
# CentOS/AlmaLinuxの場合
sudo dnf install ufw
1-2. 基本ポリシーの設定
# デフォルトで全て拒否(超重要!)
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSH接続用ポートを開放(自分が使用中のポートに変更)
sudo ufw allow 22/tcp
# HTTPとHTTPS(Webサーバー運用時)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 例:SSHポートを2222番に変更している場合
sudo ufw allow 2222/tcp
1-3. UFW有効化とステータス確認
# UFW有効化
sudo ufw enable
# 設定確認
sudo ufw status verbose
正常に設定されていれば、こんな表示になります:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
ステップ2:fail2ban詳細設定(賢い番人を配置)
次にfail2banを設定して、動的な攻撃対策を行います。
2-1. fail2banインストール
# Ubuntu/Debian
sudo apt install fail2ban
# CentOS/AlmaLinux
sudo dnf install epel-release
sudo dnf install fail2ban
2-2. 基本設定ファイルの作成
fail2banの設定は/etc/fail2ban/jail.local
ファイルで行います:
sudo nano /etc/fail2ban/jail.local
実際に私が使用している設定:
[DEFAULT]
# 基本設定
bantime = 3600 # 1時間ブロック
findtime = 600 # 10分間の監視時間
maxretry = 5 # 5回失敗でブロック
# 通知設定(メール通知したい場合)
destemail = your-email@example.com
sendername = Fail2Ban
mta = sendmail
# ホワイトリスト(自分のIPアドレスを追加)
ignoreip = 127.0.0.1/8 192.168.1.0/24 YOUR_HOME_IP
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log # Ubuntuの場合
# logpath = /var/log/secure # CentOSの場合
maxretry = 3 # SSHは厳しめに3回で
bantime = 7200 # 2時間ブロック
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 5
2-3. サービス開始と確認
# fail2ban開始・有効化
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
# ステータス確認
sudo systemctl status fail2ban
# jail(監視対象)の確認
sudo fail2ban-client status
成功していれば、以下のような表示になります:
Status
|- Number of jail: 2
`- Jail list: nginx-http-auth, sshd
よくあるトラブルとその解決法
トラブル1:「自分もブロックされちゃった!」
症状:設定後に自分のIPアドレスがブロックされてSSH接続できない
解決法:
# 緊急時:自分のIPアドレスをアンブロック
sudo fail2ban-client set sshd unbanip YOUR_IP_ADDRESS
# 恒久対策:ignoreipに自分のIPを追加
sudo nano /etc/fail2ban/jail.local
# ignoreip = 127.0.0.1/8 192.168.1.0/24 YOUR_HOME_IP を追記
トラブル2:「fail2banが起動しない」
よくある原因と解決法:
# ログファイルのパスが間違っている場合
sudo fail2ban-client status sshd
# → ログパスを確認して修正
# 設定ファイルの文法エラー
sudo fail2ban-client -t
# → エラー箇所を修正
トラブル3:「ブロックしすぎて正常なアクセスまで拒否」
調整のコツ:
# 段階的にパラメータを調整
maxretry = 5 # 最初は緩めに設定
bantime = 1800 # 30分から始める
findtime = 300 # 5分間の監視
# 様子を見て徐々に厳しくする
運用開始後の確認とメンテナンス
設定が完了したら、以下のコマンドで動作を確認しましょう:
# 現在ブロックされているIPアドレス一覧
sudo fail2ban-client status sshd
# リアルタイムでログ監視
sudo tail -f /var/log/fail2ban.log
# ufwのログ確認
sudo tail -f /var/log/ufw.log
- SSH攻撃ログの大幅減少
- fail2ban.logにブロック通知が記録される
- サーバーの負荷が軽減される
まとめ:安心できるサーバー運用のために
今回設定したfail2ban + ufwの組み合わせで、基本的なBrute Force攻撃はほぼ完全にブロックできます。
今回のポイント振り返り:
- ✅ ufwで基本的なファイアウォール設定
- ✅ fail2banで動的な攻撃対策
- ✅ 自分のIPアドレスをホワイトリストに追加
- ✅ 段階的な調整で最適化
次回は「Let’s Encrypt SSL証明書の自動更新とトラブル対処法」について詳しく解説します。セキュリティ対策と合わせて、HTTPS化も完璧にしましょう!