2026年7月21日

2026年7月21日

VPSのファイアウォール設定(UFW):SSHで締め出されない手順とDockerの注意点

VPS に UFW を設定するときは、「SSH を許可してから有効化する」「事業者側のファイアウォールとの二重設定を把握する」「Docker を使うなら UFW を素通りする経路を塞ぐ」の3点を押さえれば、安全に始められます。この記事では Ubuntu の VPS を例に、WordPress を公開するサーバーで必要なポートだけを開け、設定を誤って接続できなくなったときの復旧方法まで説明します。

UFW(Uncomplicated Firewall)は、Linux のパケットフィルタ(iptables / nftables)を短いコマンドで扱えるようにした管理ツールです。Ubuntu には標準で入っていますが、初期状態では無効になっています。

始める前に:締め出されたときの戻り方を確保する

VPS のファイアウォール設定で最も多い失敗は、SSH の許可を忘れたまま有効化し、自分も接続できなくなることです。作業前に次の2点を確認してください。

  • VPS 事業者の管理画面に、ブラウザから操作できるコンソール(VNC コンソールやシリアルコンソールなど、名称は事業者により異なる)があるか
  • そのコンソールでログインできるユーザーとパスワード、または代替手段があるか(SSH を鍵認証のみにしている場合、コンソールでログインできないことがある)

コンソールに入れれば sudo ufw disable で元に戻せます。あわせて、作業前に VPS のスナップショットを取っておくと安心です。

事業者側のファイアウォールとの関係

多くの VPS やクラウドには、サーバーの外側で通信を絞る機能(パケットフィルタ、セキュリティグループなど)があります。UFW はサーバーの内側の設定なので、両方が有効なら「両方で許可されたポートだけ」が通ります。

この構造を知らないと、「UFW で443番を開けたのに接続できない」という状況で原因を見失います。どちらか一方で管理するか、外側は大まかに・内側は細かくと役割を決めておくと、後から見たときに迷いません。

基本の設定手順

以下は Ubuntu 24.04 LTS を想定した例です(2026年10月現在)。

1. 現在の状態とアプリプロファイルを確認する

sudo ufw status verbose
sudo ufw app list

app list には、インストール済みのパッケージが用意したプロファイル(OpenSSH、Nginx を入れていれば Nginx Full など)が表示されます。プロファイル名を使うと、ポート番号を直接書くより意図が読み取りやすくなります。

2. 既定のルールを決める

sudo ufw default deny incoming
sudo ufw default allow outgoing

外から入ってくる通信は原則拒否し、サーバーから外へ出る通信は許可する、という一般的な方針です。外向きも絞る運用は可能ですが、パッケージ更新や外部 API への接続が止まりやすいため、最初は許可にしておくのが無難です。

3. SSHを許可する(有効化より先に)

sudo ufw limit OpenSSH

allow の代わりに limit を使うと、同じ IP アドレスから短時間に多数の接続があった場合に拒否されます(ufw のマニュアルでは「30秒間に6回以上」と説明されています)。総当たり攻撃の抑制に役立ちますが、正規の自動処理(デプロイツールなど)が頻繁に接続する環境では引っかかることがあります。

SSH を自宅や会社の固定 IP からしか使わないなら、送信元を限定するとより安全です。

sudo ufw allow from 198.51.100.20 to any port 22 proto tcp

SSH のポート番号を22以外に変更している場合は、プロファイル名ではなく実際のポート番号で許可します。Ubuntu 22.10 以降では SSH がソケット起動(ssh.socket)になっており、ポート変更の手順が従来と異なることがあります。ポートを変えるときは「新しいポートを UFW で許可 → SSH の設定変更 → 新しいポートで別ウィンドウから接続確認 → 古いポートを閉じる」の順で進めてください。

4. Webサーバーのポートを許可する

sudo ufw allow 'Nginx Full'
# Apache の場合は sudo ufw allow 'Apache Full'
# プロファイルがない場合は sudo ufw allow 80/tcp と sudo ufw allow 443/tcp

WordPress を公開するだけなら、外から必要なのは基本的に SSH・80番・443番の3つです。MySQL(3306番)は同じサーバー内から接続するので、外に開ける必要はありません。データベースを別サーバーに置く場合も、送信元 IP を Web サーバーに限定して許可します。

5. 有効化して確認する

sudo ufw enable
sudo ufw status numbered

有効化すると、現在の SSH 接続が切れる可能性がある旨の確認が表示されます。今のセッションは閉じずに、別のターミナルから新しく SSH 接続できるかを試してください。新しい接続が通ったことを確かめてから、元のセッションを閉じます。

ルールの削除と変更

sudo ufw status numbered
sudo ufw delete 3

番号指定で削除すると、削除のたびに番号が詰まります。複数削除するときは毎回 status numbered を見直すか、sudo ufw delete allow 8080/tcp のようにルールの内容で指定すると取り違えを防げます。

IPv6とログの確認

VPS に IPv6 アドレスが割り当てられている場合、/etc/default/ufw の IPV6=yes になっているかを確認します。ここが無効だと、IPv4 側だけ絞って IPv6 側は素通し、という状態になりかねません。Ubuntu の既定では有効です。

ログは次のコマンドで有効化できます。

sudo ufw logging low

ブロックした通信は、環境により /var/log/ufw.log またはカーネルログ(journalctl -k)に記録されます。「接続できない」と問い合わせを受けたときに、本当に UFW で止まっているのかを判断する材料になります。ログレベルを上げすぎるとディスクを圧迫するので、普段は low で十分です。

DockerとUFWの落とし穴

Docker はコンテナの公開ポート(-p 8080:80 など)のために iptables のルールを直接追加します。このルールは UFW のルールより先に評価されるため、UFW で拒否していてもコンテナの公開ポートには外部から接続できてしまいます。Docker の公式ドキュメントでも、UFW と併用する際の注意として説明されています。

対策としては次の方法があります。

  • コンテナのポートをローカルだけに公開し、Nginx などのリバースプロキシ経由で外に出す(-p 127.0.0.1:8080:80)
  • Docker が用意している DOCKER-USER チェーンに制限ルールを追加する
  • 事業者側のファイアウォールで、使わないポートを外側から塞ぐ

いちばん簡単で間違いにくいのは1つ目です。Docker Compose でも ports: に "127.0.0.1:8080:80" と書けます。設定後は、自分の PC など外部から nmap などでポートを確認し、想定外のポートが開いていないかを見ておくと安心です。

よくあるつまずき

  • 有効化後にサイトが表示されない:80番・443番の許可漏れ、または事業者側のファイアウォールで止まっている
  • メールが送信できない:メールサーバーを同居させているなら25番・587番などの受信ポートを許可しているか
  • ルールを追加したのに効かない:ufw status に表示されているか、より上の行に拒否ルールがないかを確認する(ルールは上から順に評価される)
  • 有効化したら SSH が切れた:管理画面のコンソールから sudo ufw disable で戻し、SSH の許可を入れてから再度有効化する

UFW は入口を絞る仕組みであり、開けているポートで動くソフトの脆弱性やパスワードの総当たりまでは防げません。SSH の鍵認証化、fail2ban による自動遮断、OS の定期更新と組み合わせて使ってください。

まとめ

  • 作業前に管理画面のコンソールとスナップショットで、締め出されたときの戻り方を確保する
  • default deny incoming にしたら、有効化より先に SSH を許可する
  • WordPress の公開に必要なのは基本的に SSH・80番・443番で、データベースのポートは外に開けない
  • 事業者側のファイアウォールとは「両方で許可されたものだけ通る」関係になる
  • Docker の公開ポートは UFW を素通りするため、127.0.0.1 へのバインドなどで対策する

お気軽にご相談ください

お見積りへ お問い合わせへ
▲