2026年7月6日
2026年7月6日
WordPressの管理画面へのアクセスをIPアドレスで制限する方法(Apache・nginx別)
WordPress の管理画面(/wp-admin/)とログインページ(/wp-login.php)を、自分のオフィスや自宅など決まった IP アドレスからしか開けないようにすると、総当たり攻撃やパスワードの使い回しによる不正ログインの多くを入口で止められます。この記事では、Apache(.htaccess)と nginx のそれぞれで IP 制限をかける手順と、admin-ajax.php の例外やCDN経由の環境など、設定後にサイトが壊れないための注意点、締め出されたときの戻し方までを解説します。
IP制限が向いているサイトと向いていないサイト
IP 制限は、許可した IP 以外からのリクエストを Web サーバーの段階で 403 にするため、WordPress や PHP が動く前に遮断できるのが利点です。プラグインによるログイン試行回数の制限と違い、攻撃が多くてもサーバー負荷がほとんど増えません。
一方で、管理者の接続元 IP が固定されていることが前提です。次のような運用では、そのままでは使いにくくなります。
- 自宅回線が一般的な家庭向けプランで、IP アドレスが定期的に変わる
- 外出先のスマートフォンやカフェの Wi-Fi から更新することがある
- 投稿者や寄稿者など、管理画面を使う人が多く、それぞれの接続元がばらばら
この場合は、固定 IP を持つ VPN を経由させる、IP 制限ではなく Basic 認証や二段階認証を組み合わせる、といった別の方法のほうが現実的です。導入前に「誰が・どこから」管理画面を使うのかを洗い出しておくと、後で締め出されるトラブルを避けられます。
作業前の準備
自分のグローバルIPを調べる
許可するのは、社内 LAN の 192.168.x.x のようなプライベート IP ではなく、インターネット側から見えるグローバル IP です。管理画面を使うネットワークにつないだ状態で、IP 確認サービスを開くか、ターミナルで次を実行して確認します。
curl -s https://ifconfig.me
回線によっては IPv6 で接続していることがあります。IPv4 だけを許可して IPv6 で接続していると弾かれるため、両方を確認しておきます。
戻せる状態にしておく
設定ミスで自分自身が締め出されると、管理画面からは直せません。作業前に次の2点を準備します。
- 編集する
.htaccessまたは nginx の設定ファイルのバックアップを取る - FTP / SFTP、SSH、レンタルサーバーのファイルマネージャーのいずれかで、ファイルを直接編集できることを確認する
Apacheの場合:.htaccessで制限する
Apache 2.4 では Require ip を使います。古い記事に載っている Order / Deny from / Allow from は Apache 2.2 時代の書き方で、2.4 では互換モジュール経由でしか動かず、新旧の書き方を混ぜると意図しない結果になります。2.4 の書き方にそろえてください。
ログインページを制限する
WordPress のルートにある .htaccess に、次のブロックを追加します。追加場所は # BEGIN WordPress 〜 # END WordPress の外側(上側)にしてください。この範囲は WordPress がパーマリンク設定の保存時などに書き換えるため、内側に書くと消えることがあります。
<Files "wp-login.php">
Require ip 203.0.113.10
Require ip 198.51.100.0/24
</Files>
Require ip を複数行書くと「どれか1つに一致すれば許可」になります。/24 のような CIDR 表記で範囲指定もできます。上記の IP はドキュメント用のサンプルなので、自分の IP に置き換えてください。
管理画面ディレクトリを制限する
/wp-admin/ ディレクトリの中に .htaccess を新しく作り(既にある場合は追記し)、次のように書きます。
Require ip 203.0.113.10
<Files "admin-ajax.php">
Require all granted
</Files>
ここで大事なのが admin-ajax.php の例外です。このファイルは名前に admin が付いていますが、お問い合わせフォームの送信、絞り込み検索、「いいね」ボタンなど、訪問者が使う機能の多くがフロント側から呼び出します。例外を入れずに制限すると、管理画面は守れても公開側の機能が 403 で動かなくなります。
500エラーになったとき
.htaccess に Require を書くには、サーバー側で AllowOverride に AuthConfig(または All)が許可されている必要があります。許可されていない環境では、追記した直後にサイト全体が 500 エラーになります。その場合はすぐに追記部分を削除し、サーバーのエラーログを確認してください。レンタルサーバーによっては、コントロールパネルに管理画面の IP 制限機能が用意されているので、そちらを使うほうが安全です。
nginxの場合:locationブロックで制限する
nginx では .htaccess が使えないため、サーバー設定(server ブロック)に allow / deny を書きます。注意したいのは、location = /wp-login.php のように個別の location を作ると、そこで PHP の処理も書かないとファイルが実行されない点です。既存の location ~ \.php$ の設定を参考に、同じ内容を入れてください。
# ログインページ
location = /wp-login.php {
allow 203.0.113.10;
allow 198.51.100.0/24;
deny all;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
# admin-ajax.php は公開側からも使うため制限しない
location = /wp-admin/admin-ajax.php {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
# 管理画面ディレクトリ
location ^~ /wp-admin/ {
allow 203.0.113.10;
allow 198.51.100.0/24;
deny all;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
snippets/fastcgi-php.conf は Debian / Ubuntu 系のパッケージに含まれるファイルで、ソケットのパスも PHP のバージョンや OS によって異なります。自分の環境の既存設定に合わせて書き換えてください。location =(完全一致)は location ^~ より優先されるため、admin-ajax.php だけが制限から外れます。
編集後は、反映前に構文チェックを行います。
sudo nginx -t && sudo systemctl reload nginx
nginx -t でエラーが出た場合は reload せずに修正します。構文エラーのまま再起動すると、サイト全体が止まることがあります。
CDNやリバースプロキシの裏にある場合
Cloudflare などの CDN やロードバランサーを経由している場合、Web サーバーから見える接続元は CDN 側の IP になります。この状態で IP 制限をかけると、全員が弾かれるか、逆に CDN の IP を許可して誰でも通れてしまいます。
Apache なら mod_remoteip、nginx なら ngx_http_realip_module を使い、信頼するプロキシの IP 範囲からのリクエストに限って本来の接続元 IP(X-Forwarded-For などのヘッダー)を採用するよう設定してから IP 制限を入れます。信頼するプロキシを限定せずにヘッダーを採用すると、ヘッダーを偽装するだけで制限を回避できてしまうので注意してください。CDN によっては、CDN 側の機能で特定パスへのアクセスを IP で制限することもできます。
設定後の確認
設定したら、次の順で動作を確かめます。
- 許可した IP の回線から
/wp-login.phpにアクセスし、ログインできること - スマートフォンの Wi-Fi を切ってモバイル回線にするなど、許可していない回線から開いて 403 になること
- お問い合わせフォームや検索など、Ajax を使う公開側の機能がログアウト状態で動くこと
- 投稿の予約公開やプラグインの定期処理(WP-Cron)が止まっていないこと
なお、この制限は xmlrpc.php や REST API(/wp-json/)には及びません。XML-RPC を使っていないなら、同じ方法で xmlrpc.php も制限するか無効化しておくと、ログイン試行の抜け道を減らせます。
締め出されたときの戻し方
IP が変わった、設定を間違えたなどで自分が 403 になった場合は、FTP やファイルマネージャーで追記した部分を削除するか、/wp-admin/.htaccess の名前を一時的に変更すれば解除できます。nginx の場合は SSH で設定ファイルを元に戻し、nginx -t のあとに reload します。WordPress のデータベースやパスワードには一切影響しないので、ファイルを戻すだけで元どおりになります。
IP 制限の可否やコントロールパネルの機能はサーバーごとに異なります(2026年10月現在)。共用レンタルサーバーでは、まずサーバー会社のマニュアルで管理画面の保護機能を確認してから、自分で .htaccess を書くかどうかを判断するのがおすすめです。
まとめ
- IP 制限は、PHP が動く前に Web サーバーで遮断できるため負荷が少なく、不正ログイン対策として効果が高い
- 前提は管理者の接続元 IP が固定されていること。変わる環境では VPN や Basic 認証を検討する
- Apache 2.4 は
Require ip、nginx はallow/deny。nginx では個別 location に PHP 処理も書く admin-ajax.phpは公開側でも使うため、制限から外す- CDN 経由では本来の接続元 IP を正しく取得してから制限する
- 作業前に設定ファイルをバックアップし、FTP や SSH で戻せる状態にしておく