2026年8月4日

2026年8月4日

WordPressサーバーにufwでファイアウォールを設定する方法|SSH締め出し防止・HTTP/HTTPS許可・ログ確認

ufw(Uncomplicated Firewall)は、Ubuntu・Debian で使われるファイアウォールの設定ツールです。Linux のパケットフィルター(iptables・nftables)のルールを、短いコマンドで設定できます。

この記事では、WordPress を動かしている Ubuntu・Debian のサーバーで、Web とSSH だけを受け付けるファイアウォールを ufw で作る手順を説明します。AlmaLinux・Rocky Linux などでは、標準のツールは firewalld です(違いは ufw と firewalld の比較 を参照してください)。

作るファイアウォールの形

WordPress のサーバーで外から受け付ける必要がある通信は、多くの場合、次の3つだけです。

ポート 用途 許可する相手
22/tcp(変更していればそのポート) SSH できれば管理者の IP だけ
80/tcp HTTP(HTTPS へのリダイレクトと証明書の取得に使う) すべて
443/tcp HTTPS すべて

それ以外の受信はすべて拒否し、サーバーから外への通信(WordPress やプラグインの更新、外部 API への接続)は許可します。

始める前の注意:SSHの締め出し

ufw を有効にした時点で、許可していない通信はすべて遮断されます。SSH を許可する前に有効にすると、自分がサーバーに入れなくなります。

作業の前に、次の2つを確かめておきます。

  • VPS・クラウドの管理画面にある「コンソール」機能(SSH を使わずにサーバーを操作できる画面)の使い方
  • SSH のポート番号(sudo ss -tlnp | grep sshd で、待ち受けているポートが分かります)

手順1:ufwが入っているか確かめる

Ubuntu には ufw が最初から入っています。入っていない場合(Debian など)は、パッケージを入れます。

sudo apt update
sudo apt install ufw

sudo ufw status verbose

Status: inactive と出れば、まだ有効になっていません。

手順2:SSHを先に許可する

sudo ufw allow 22/tcp

SSH のポートを変更している場合は、22 をそのポート番号に置き換えます。

接続元の IP アドレスが決まっている(固定 IP の事務所から管理する)場合は、その IP からだけ許可するとより安全です。203.0.113.10 は自分の IP アドレスに置き換えます。

sudo ufw allow from 203.0.113.10 to any port 22 proto tcp

自宅や外出先など、接続元の IP が変わる場合は、IP で絞らずに許可し、SSH 自体を鍵認証にしておきます(OpenSSHの鍵ペア生成と公開鍵認証の設定手順)。

手順3:既定の動作を決める

sudo ufw default deny incoming
sudo ufw default allow outgoing

受信は拒否、送信は許可にします。この時点ではまだ有効になっていないので、通信は止まりません。

手順4:HTTPとHTTPSを許可する

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Ubuntu の nginx や apache2 のパッケージを入れていれば、ポートをまとめた「アプリケーションプロファイル」も使えます。

sudo ufw app list

# Nginx の場合(80 と 443)
sudo ufw allow 'Nginx Full'

# Apache の場合(80 と 443)
sudo ufw allow 'Apache Full'

ポート番号で許可した場合は、プロファイルでの許可は不要です(どちらか一方で構いません)。

手順5:有効にして確かめる

sudo ufw enable

「既存の SSH 接続が切れるかもしれない」という確認が出るので、y で進めます。有効にしたら、今の SSH 接続は閉じずに、別の端末から新しく SSH で接続できることを確かめます。入れなかった場合は、残しておいた接続で sudo ufw disable を実行して元に戻します。

ルールの一覧を確かめます。

sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
443/tcp (v6)               ALLOW IN    Anywhere (v6)

(v6) の行は IPv6 のルールです。/etc/default/ufw が IPV6=yes(Ubuntu の初期値)になっていれば、IPv4 と IPv6 の両方に同じルールが作られます。

外から実際に開いているポートを確かめるには、別のサーバーから nmap で調べます(nmap の使い方とポートスキャンの基本)。

コマンドで追加・削除したルールは、その場で反映されます。sudo ufw reload が必要なのは、/etc/ufw/ の設定ファイルや /etc/default/ufw を直接編集したときです。

手順6:SSHへの連続した接続を制限する

limit を使うと、同じ IP アドレスから 30 秒間に 6 回以上接続しようとした場合に、その接続を拒否します。パスワードの総当たりを遅らせる効果があります。

sudo ufw limit 22/tcp

すでに allow 22/tcp がある場合は、そのルールが LIMIT に置き換わります。Web のポート(80・443)には limit を使わないでください。1回のページ表示で複数の接続を使うため、普通の訪問者が拒否されることがあります。

ログイン試行の回数で判断して遮断したい場合は、fail2ban を組み合わせます(WordPressのFail2Banでブルートフォースを防ぐ方法)。

データベースのポートは開けない

WordPress とデータベース(MySQL・MariaDB)が同じサーバーにある場合、3306 番ポートを開ける必要はありません。WordPress は、サーバーの中(localhost)でデータベースに接続します。

Web サーバーとデータベースサーバーを分けている場合だけ、データベースサーバー側で、Web サーバーの IP アドレスからの接続だけを許可します。198.51.100.20 は Web サーバーの IP に置き換えます。

sudo ufw allow from 198.51.100.20 to any port 3306 proto tcp

特定のIPアドレスを遮断する

ufw のルールは上から順に照らし合わされ、最初に当てはまったルールが使われます。80/tcp を許可するルールの後ろに遮断のルールを追加しても、Web へのアクセスは許可されたままです。遮断のルールは、insert で先頭に入れます。

sudo ufw insert 1 deny from 192.0.2.0/24
sudo ufw status numbered

不要になったルールは、番号を確かめて削除します。

sudo ufw status numbered
sudo ufw delete 1

削除するルールの内容が表示され、確認が出るので y で進めます。番号は削除するたびに詰め直されるため、複数のルールを消すときは、毎回 status numbered で確かめてから削除します。IP 単位の許可・拒否の書き方は UFWでIPアドレス単位の許可・拒否 でも説明しています。

ログを確かめる

ufw のログは、初期状態では low の水準で記録されます。

# 水準を変える(off / low / medium / high / full)
sudo ufw logging low

# 遮断の記録を見る
sudo grep "UFW BLOCK" /var/log/ufw.log | tail -20

# /var/log/ufw.log がない環境ではカーネルのログから見る
sudo journalctl -k | grep "UFW BLOCK" | tail -20

SRC= が接続元の IP、DPT= が接続しようとしたポートです。medium 以上にすると記録が大幅に増えるので、調査が終わったら low に戻します。

Dockerを使っている場合の注意

Docker の -p 8080:80 のように公開したコンテナのポートは、ufw のルールより先に処理されるため、ufw で拒否していても外から接続できます(Docker の公式ドキュメントにも、ufw と組み合わせるときの注意として書かれています)。

コンテナのポートを外に出す必要がない場合は、-p 127.0.0.1:8080:80 のようにサーバーの中だけで待ち受けるようにし、Nginx などのリバースプロキシ経由で公開します(VPSのファイアウォール設定(UFW):SSHで締め出されない手順とDockerの注意点)。

運用での注意

  • クラウドのファイアウォールとの関係:AWS のセキュリティグループや VPS 事業者のパケットフィルターを使っている場合、そちらでも同じポートを許可する必要があります。両方で許可されていないと通信できません
  • ルールの記録:sudo ufw show added で、自分が追加したルールをコマンドの形で一覧できます。サーバーを作り直すときの手順書として残しておきます
  • CDN を使っている場合:Cloudflare などを経由させているサイトでは、80・443 への接続元は CDN の IP アドレスになります。ufw で訪問者の IP を遮断しても効きません。訪問者の遮断は CDN 側の機能で行います

まとめ

  • 作業の前にコンソールの使い方を確かめ、SSH を許可してから ufw enable する
  • 受信は既定で拒否し、22(SSH)・80・443 だけを許可する。データベースのポートは開けない
  • 遮断のルールは insert 1 で先頭に入れる。コマンドで追加したルールは reload なしで反映される
  • Docker で公開したポートは ufw では止まらないので、127.0.0.1 で待ち受ける

関連記事:

お気軽にご相談ください

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