インターネット上にWebサーバーを公開すると、ものの数分で世界中から自動スキャンやブルートフォースアタック(総当たり攻撃)の嵐に見舞われます。
アクセス元のIPアドレスが固定されていれば接続元を絞れますが、「自宅や出先からリモートアクセスして作業する」場合、ファイアウォールの門を広く開けざるを得ません。
この記事では、そんな環境でもサーバーを鉄壁に守るため、UFW(ファイアウォール)とFail2ban(ログ監視型自動遮断ツール)を組み合わせ、不審者を検知した瞬間に「すべてのポートから永久追放(永久BAN)」する強力なネットワーク保護の設定手順を解説します。
動作環境
- OS: Ubuntu 24.04 LTS
さっくりとした手順
- UFWの設定: 必要最低限のポート(SSH/Web)のみを許可
- Fail2banのインストール
- Fail2banの設定: UFWと連携し、不審なスキャンを一撃で永久BANする設定を追加
UFWの設定(SSHとWeb通信のみを有効化)
まずは不要なポートをすべて閉じ、必要な通信だけを通す基本的な防壁を作ります。
SSH接続の許可(過度な接続を制限)
単なる許可(allow)ではなく、短時間の連続アクセスを制限する limit を使うことで、ブルートフォースアタックの速度を鈍らせます。
sudo ufw limit proto tcp from any to any port 22
Web通信(HTTP / HTTPS)の許可
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
UFWのログレベルを「中」に引き上げる
Ubuntuのデフォルト(low)では、UFWが自動で弾いた不審なアクセスのログが残りません。これではFail2banが検知できないため、ログレベルを medium に引き上げます。
sudo ufw logging medium
UFWを有効化して反映
※ この作業は何度やっても心臓に悪い作業です。
- 別のターミナルを開けてロックアウトされないようにする
- リモートコンソールできる環境にいる
を確実に確認してから作業を行います。
sudo ufw enable
注意:
Command may disrupt existing ssh connections. Proceed with operation (y|n)?と聞かれたら、落ち着いてyを入力して続けます。
設定の確認
sudo ufw status verbose
以下のように、状態が「アクティブ(ロギング: on (medium))」になり、ルールが適用されていることを確認します。
状態: アクティブ
ロギング: on (medium)
Default: deny (incoming), allow (outgoing), deny (routed)
To Action From
-- ------ ----
22/tcp LIMIT Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
22/tcp (v6) LIMIT Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
- 必須チェック:
- ここで一度別ウィンドウを開き、サーバーへ新しいSSH接続ができるか必ずテストしてください。問題なければ
sudo rebootで再起動し、再起動後も接続できることを確認します。
- ここで一度別ウィンドウを開き、サーバーへ新しいSSH接続ができるか必ずテストしてください。問題なければ
Fail2banのインストール
ログを監視して自動でブロックする必須ツールです。
sudo aptitude update && sudo aptitude install fail2ban
筆者の好みでaptitudeを用いています。
起動確認
systemctl status fail2ban.service
active (running) と表示されていればOKです。
3. Fail2banの設定(一撃永久BANの罠を張る)
① ufw-aggressive フィルターの作成
UFWの拒否ログ([UFW BLOCK])をFail2banに認識させるための判定ルールを作成します。
※Ubuntu 24.04環境の仕様に合わせ、フィルターファイル名は ufw-aggressive.confとします。
sudo tee /etc/fail2ban/filter.d/ufw-aggressive.conf > /dev/null << 'EOF'
[Definition]
failregex = \[UFW BLOCK\].+SRC=<HOST> DST
ignoreregex =
EOF
jail.local の作成・編集
Fail2banの挙動を定義するローカル設定ファイルを作成します。
以下のファイルを教義・信仰に沿ったエディタで編集します。
/etc/fail2ban/jail.local
[ufw]
enabled = true
filter = ufw-aggressive
action = iptables-allports
logpath = /var/log/ufw.log
maxretry = 1
bantime = -1
# ignoreipには、自分自身のローカルホストと、巻き添えを防ぎたい大手検索エンジン(Googlebotなど)のIP帯を指定します
ignoreip = 127.0.0.0/8 ::1 66.249.64.0/19
[sshd]
enabled = true
filter = sshd
mode = normal
port = 22
protocol = tcp
logpath = /var/log/auth.log
maxretry = 3
bantime = -1
ignoreip = 127.0.0.0/8 ::1
# ignoreipには、自分自身のローカルホストと、ある程度回線が固定されているIP帯を指定します。
この設定の「強さ」のポイント
bantime = -1:- 一度捕まった攻撃者は永久にBAN(解除なし)。
maxretry = 1(ufwセクション):- 許可していないポートへ1回でもスキャンを仕掛けてきたら即アウト。
action = iptables-allports:- 特定のポートだけでなく、すべてのポートからの通信を完全遮断します。
ignoreip = ... 66.249.64.0/19:maxretry = 1は強力すぎるため、Webサイトを巡回するGoogleのクローラー(Googlebot)を誤って永久追放しないよう、あらかじめホワイトリストで保護しています。
設定の反映と効果確認
設定が完了したら、Fail2banに読み込ませます。
sudo fail2ban-client reload
防御効果の確認
設定してわずか数分〜数十分。ログファイル(/var/log/fail2ban.log)を覗いてみると、その効果は一目瞭然です。
2026-05-17 07:14:26,476 fail2ban.filter [1720]: INFO [ufw] Found xxx.xxx.xxx.xxx
2026-05-17 07:14:26,623 fail2ban.actions [1720]: NOTICE [ufw] Ban xxx.xxx.xxx.xxx
2026-05-17 07:14:44,198 fail2ban.filter [1720]: INFO [ufw] Found yyy.yyy.yyy.yyy
2026-05-17 07:14:44,647 fail2ban.actions [1720]: NOTICE [ufw] Ban yyy.yyy.yyy.yyy
世界中から飛んでくる不審なアタックやスキャンを、Fail2banが次々と検知し、その場で息の根を止めて(Ban)くれているのが分かります。
現在の捕獲状況は、以下のコマンドでリアルタイムに確認できます。
sudo fail2ban-client status ufw
インターネットの荒波に晒されているサーバーであれば、10分も経たないうちに数十〜100以上の悪質なIPアドレスが Banned IP list: に積み上がっていきます。
もしうっかり味方や自分をBANしてしまったら?
万が一、設定ミスなどで必要なIPをBANしてしまった場合は、以下のコマンドで個別に救出(BAN解除)が可能です。
sudo fail2ban-client set ufw unbanip <解除したいIPアドレス>
まとめ
固定IPを持たない環境であっても、「UFWで怪しい動きを検知し、Fail2banですべてのポートを即座に塞ぐ」という二段構えを構築することで、驚くほど強固なサーバーへと進化させることができます。
筆者はかれこれ4年ほどvps運用を続けている中、重篤な攻撃に晒されていないのは基本であるこのufwとfail2banのおかげ。
休息も慈悲も与えぬ。何があってもだ。
No rest, no mercy. No matter what.
のレベルで攻撃者にいかなる躊躇も容赦もしないのがVPSサーバの基本です。







