2026年9月13日
2026年9月13日
WordPressで特定のIPアドレスをブロックする方法|.htaccess・Nginx・ファイアウォール
ログイン画面への総当たり攻撃やスパムコメントが、決まった IP アドレスから繰り返し届くことがあります。このようなときは、その IP アドレスからのアクセスを Web サーバーで拒否すると、WordPress(PHP)が動く前に止められるため、サーバーの負担も減らせます。
この記事では、特定の IP アドレスをブロックする方法を、Apache の .htaccess、Nginx、Linux のファイアウォール(ufw)の順に説明します。逆に「自分の IP アドレス以外は管理画面に入れない」ようにしたい場合は、「WordPressのwp-adminディレクトリを保護する方法」を参照してください。
作業の前に
.htaccessや Nginx の設定ファイルを編集する前に、元のファイルをコピーしておきます。書き間違えるとサイト全体が 500 エラーになることがあります。- 自分の IP アドレスをブロックしないよう、ブラウザーで「IP アドレス 確認」と検索するなどして、自分の現在の IP アドレスを確かめておきます。
- この記事の IP アドレス(
203.0.113.10、198.51.100.0/24、2001:db8::/32)は説明用の例です。実際にブロックする IP アドレスに置き換えてください。
手順1: ブロックする IP アドレスを調べる
まず、アクセスログから問題のアクセスを送っている IP アドレスを調べます。ログの場所は環境によって異なります。
| 環境 | アクセスログの場所(標準) |
|---|---|
| Ubuntu / Debian の Apache | /var/log/apache2/access.log |
| RHEL / AlmaLinux / Rocky Linux の Apache | /var/log/httpd/access_log |
| Nginx | /var/log/nginx/access.log |
レンタルサーバーでは、管理画面からアクセスログをダウンロードできることが多いので、サーバー会社の案内を確認してください。
wp-login.php に POST しているアクセスを IP アドレスごとに数える例です(Ubuntu の Apache の場合)。
sudo grep "POST /wp-login.php" /var/log/apache2/access.log \
| awk '{print $1}' | sort | uniq -c | sort -rn | head -20
左の数字が回数、右が IP アドレスです。回数が多い IP アドレスがブロックの候補になります。
手順2: Apache の .htaccess でブロックする
現在の Apache(2.4)では、アクセス制御に Require ディレクティブを使います。WordPress のルート(wp-config.php があるディレクトリ)にある .htaccess を開き、先頭(# BEGIN WordPress の行より上)に次を追加します。
<RequireAll>
Require all granted
Require not ip 203.0.113.10
Require not ip 198.51.100.0/24
Require not ip 2001:db8::/32
</RequireAll>
Require all grantedで全員を許可したうえで、Require not ipに書いた IP アドレスだけを除外します。Require not ipは単独では使えず、このようにRequireAllの中に書く必要があります。198.51.100.0/24のように書くと、198.51.100.0〜198.51.100.255の範囲をまとめて指定できます。IPv6 も同じ形で書けます。
# BEGIN WordPress から # END WordPress の間は、パーマリンク設定を保存したときなどに WordPress が書き換えるため、その間には書かないでください。
古い書き方(Order / Deny)について
Order Deny,Allow と Deny from は Apache 2.2 の書き方です。Apache 2.4 では mod_access_compat モジュールがある場合だけ動きます。Apache の公式ドキュメントでは、古い書き方と Require を混ぜて使わないよう案内されています。新しく書く場合は上の Require の形を使ってください。
.htaccess が効かない場合
.htaccess の Require は、サーバー側の設定で AllowOverride に AuthConfig(または All)が許可されている場合に使えます。許可されていないと、500 エラーになったり、書いた内容が無視されたりします。VPS などで自分で Apache を管理している場合は、.htaccess ではなくバーチャルホストの設定(<Directory> の中)に同じ内容を書く方法もあります。設定ファイルを変えたら、構文を確認してから再読み込みします。
sudo apachectl configtest
sudo systemctl reload apache2 # RHEL 系は httpd
手順3: Nginx でブロックする
Nginx には .htaccess がないため、サイトの設定ファイル(server ブロック)に deny を書きます。
server {
# ...既存の設定...
deny 203.0.113.10;
deny 198.51.100.0/24;
deny 2001:db8::/32;
}
server ブロックに書くとサイト全体に効きます。location = /wp-login.php { ... } の中に書けばログイン画面だけに効きますが、その location に PHP の処理(fastcgi_pass など)も書く必要があります。
設定を変えたら、構文を確認してから再読み込みします。
sudo nginx -t
sudo systemctl reload nginx
手順4: ファイアウォール(ufw)でブロックする
ブロックしたい IP アドレスが多い場合や、Web 以外の通信も止めたい場合は、OS のファイアウォールで拒否する方法もあります。Ubuntu の ufw の例です。
sudo ufw insert 1 deny from 203.0.113.10 to any
sudo ufw status numbered
ufw は上のルールから順に照合し、最初に一致したルールを使います。ufw deny from … を末尾に追加すると、先にある「80・443 番ポートを許可する」ルールに一致してブロックされないことがあるため、insert 1 で先頭に入れています。解除するときは sudo ufw status numbered で番号を確認し、sudo ufw delete 番号 で削除します。
手順5: ブロックできたか確認する
ブロックした IP アドレスからのアクセスは、Apache・Nginx では 403 Forbidden になります。アクセスログを見て、その IP アドレスのアクセスのステータスが 403 になっているか確認します。
sudo tail -f /var/log/apache2/access.log | grep "203.0.113.10"
あわせて、自分のブラウザーでサイトとログイン画面がふだんどおり表示されることも確認してください。ufw でブロックした場合は、接続そのものが拒否されるため、アクセスログには記録されません。
CDN やプロキシを使っている場合の注意
Cloudflare などの CDN やロードバランサーを経由している場合、Web サーバーから見えるアクセス元はCDN やプロキシの IP アドレスになります。この状態で訪問者の IP アドレスを Require not ip や deny に書いても、ブロックされません。また、CDN の IP アドレスをブロックすると、サイト全体が見られなくなります。
この場合は次のどちらかで対応します。
- CDN 側でブロックする: Cloudflare なら IP アクセスルールなど、CDN の管理画面の機能で拒否します。
- Web サーバーに本当のアクセス元を教える: Apache は
mod_remoteip(RemoteIPHeaderとRemoteIPTrustedProxy)、Nginx はreal_ip_headerとset_real_ip_fromで、信頼するプロキシから届いたヘッダーの IP アドレスをアクセス元として扱うよう設定します。信頼するプロキシの範囲を正しく指定しないと、ヘッダーを偽装されるおそれがあります。
プラグインでブロックする方法
Wordfence などのセキュリティプラグインにも、IP アドレスや IP アドレスの範囲を指定してブロックする機能があります。管理画面から操作できるのが利点ですが、判定は WordPress(PHP)が読み込まれてから行われるため、サーバーの負担を減らす効果は Web サーバーやファイアウォールでのブロックより小さくなります。具体的な操作は各プラグインの公式ドキュメントで確認してください。
注意点
- IP アドレスは変わる: 攻撃元は IP アドレスを変えて続けることが多く、IP アドレスのブロックだけでは防ぎきれません。強いパスワード、2段階認証、ログイン画面への IP 制限などと組み合わせて使います。
- 広い範囲をブロックしない:
/16など広い範囲を指定すると、同じプロバイダーの一般の利用者まで閉め出すことがあります。 - 一覧を整理する: ブロックしたまま放置すると、IP アドレスが別の利用者に割り当て直されたときに正当なアクセスを拒否してしまいます。追加した日と理由をコメント(
#で始まる行)で残し、定期的に見直します。 - ログイン画面への攻撃が多い場合は、「WordPressのログインページをIPアドレスで制限する方法」の方法も検討してください。自分が 403 になってしまった場合は「IP制限による403エラーの解決方法」を参照してください。
まとめ
- アクセスログから、問題のアクセスを送っている IP アドレスを調べます。
- Apache 2.4 では
.htaccessの先頭にRequireAllとRequire not ipを書きます。Order/Denyは古い書き方です。 - Nginx では
serverブロックにdenyを書き、nginx -tで確認してから再読み込みします。 - ufw では
insert 1で先頭にルールを入れます。 - CDN やプロキシの背後では、CDN 側でブロックするか、本当のアクセス元を Web サーバーに伝える設定が必要です。