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 で制限することもできます。

設定後の確認

設定したら、次の順で動作を確かめます。

  1. 許可した IP の回線から /wp-login.php にアクセスし、ログインできること
  2. スマートフォンの Wi-Fi を切ってモバイル回線にするなど、許可していない回線から開いて 403 になること
  3. お問い合わせフォームや検索など、Ajax を使う公開側の機能がログアウト状態で動くこと
  4. 投稿の予約公開やプラグインの定期処理(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 で戻せる状態にしておく

お気軽にご相談ください

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