10G光クロス×MAP-Eサバイバル。最大の急所「wp-login.php」をVPS中継環境で鉄壁に鍛え上げる【セキュリティ編】

この記事は約12分で読めます。

爆速10GサーバーをVPS経由で安全に世界へ公開した次のステップは、「セキュリティの要塞化」です。

WordPressを公開した瞬間から、世界中のbotや不正アクセスツールは、あなたのサイトの「ある1つのファイル」を24時間365日、ひっきりなしに叩き始めます。 それが、ログイン画面である wp-login.php です。
ここを突破されたらサイトは丸ごと乗っ取られ、違法サイトへの踏み台にされて終わり。まさに最優先で塞ぐべき「最大の急所」です。 しかし、今回の【VPS中継+自宅WordOps】という環境では、普通のIP制限をかけようとすると絶対に大失敗する致命的な罠があります。

今回は、その罠をNginxの知恵で美しくハックし、自分だけが安全にログインできる無敵の要塞を作る手順を解説します!

🚨 普通にやると詰む「VPSの影武者問題」

通常、WordPressのログイン画面をIP制限する場合、Nginxに「このIP以外からのアクセスは拒否(deny all)」と書けば一発で解決します。
しかし、今の私たちの環境は「すべてのアクセスが一旦VPSを通ってから自宅に届く」という構造です。 普通に自宅のWordOps(Nginx)でアクセス元のIPをチェックすると、悪意ある海外の攻撃者のIPではなく、「中継してくれたVPSのIP」として記録されています。

つまり、そのままIP制限をかけると、以下の2択のどちらかという地獄に陥ります。

  1. VPSのIPを許可する ➔ 攻撃者もVPS経由なので、全員ガバガバで通過する
  2. VPSのIPを拒否する ➔ 自分も含めて全人類がサイトにアクセス不能になる

これを解決するために、前回のSSL化編でVPS側に仕込んだ X-Forwarded-For(本当のIPを書き残す伝票) を、自宅のWordOps側で正しく開封して認識させる必要があります。

🛠️ 鉄壁の陣形:WordOps(自宅側)のNginxを設定する

それでは、設定ファイルを書き換えていきましょう。
今回は、ボットの猛攻を水際で防ぐために「中継VPS側」でブロックしつつ、今後すべてのログが正しく残るように「自宅サーバー側」で本物のIPを見破る処理を仕込みます。

ステップ 1:【中継VPS側】Nginxでwp-login.phpアクセスを水際で叩き落とす

まずは、世界中からの攻撃をその場で叩き落とすため、フロントドアである中継VPS側のNginx設定ファイルを開きます。

Bash
sudo nano /etc/nginx/sites-available/test-site.online

(※ tet-site.online はご自身のドメインに置き換えてください)

サーバーブロック(server { ... })の中に、ログイン画面を「あなた専用」にする制限ブロックを追記します。悪意あるアクセスは自宅サーバーに1バイトも転送させず、VPSの段階で403を叩きつけます。

Nginx
# ログイン画面(wp-login.php)へのアクセス制限
location ~ ^/(wp-login\.php) {
    allow 192.168.1.0/24;  # あなたの自宅ローカルネットワーク(VPN接続時など)
    allow 49.250.123.45;   # あなたのスマホや職場の固定回線の「本当のグローバルIP」
    deny all;              # それ以外は世界中すべて、自宅に転送すらさせずにここで遮断!

    # 許可されたクリーンなアクセスだけを自宅サーバーへ転送する
    proxy_pass http://153.156.79.69; # (自宅サーバーのIPアドレス)
    include proxy_params;
}

設定が書き終わったら、Ctrl+OEnter で保存し、Ctrl+X でエディタを閉じます。

ステップ 2:【自宅サーバー側】Nginxで「本物のIP」を見破る記述を追加する

次に、自宅サーバー(WordOps)側の設定ファイルを開きます。 VPSが通してきた「正規のアクセス」の本当のIPを正しく認識し、アクセスログに記録させるための設定を行います。

Bash
sudo nano /etc/nginx/sites-available/test-site.online

server { ... } ブロックの直下に、以下の「身元見破り設定(real_ipモジュール)」を記述します。

Nginx
# ==========================================
# 🕵️‍♂️ 【追加】本当の接続元IPを見破る設定
# ==========================================
# VPSのIPを「信頼できる中継元」として登録します
set_real_ip_from   118.27.203.45; # ★あなたのVPSのグローバルIPに書き換える

# 伝票(X-Forwarded-For)から本当の接続元IPを抽出する
real_ip_header     X-Forwarded-For;
real_ip_recursive  on;
# ==========================================

これだけで、自宅のNginxは「あ、118.27.203.45(VPS)から届いたアクセスだけど、本当のアクセス元はコイツだな」とログや内部処理で裏を取れるようになります。

✍️ 自宅サーバー側(WordOps)の設定ファイル記述例

最終的な自宅サーバー側の構成は、以下のようになります。

Nginx
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name test-site.online www.test-site.online;

    ssl_certificate /etc/letsencrypt/live/test-site.online/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/test-site.online/privkey.pem;

    # ==========================================
    # 🕵️‍♂️ 【追加】本当の接続元IPを見破る設定
    # ==========================================
    set_real_ip_from   118.27.203.45; # ★あなたのVPSのグローバルIP
    proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    real_ip_header     X-Forwarded-For;
    real_ip_recursive  on;
    # ==========================================

    root /var/www/test-site.online/htdocs;
    index index.php index.html;

    # ログイン画面(wp-login.php)へのアクセス制限
    location ~ ^/(wp-login\.php) {
        allow 192.168.1.0/24;  # あなたの自宅ローカルネットワーク(VPN接続時など)
        allow 49.250.123.45;   # あなたのスマホや職場の固定回線の「本当のグローバルIP」
        deny all;              # それ以外は世界中すべて、自宅に転送すらさせずにここで遮断!

        # 許可されたクリーンなアクセスだけを自宅サーバーへ転送する
        proxy_pass http://153.156.79.69; # (自宅サーバーのIPアドレス)
        include proxy_params;
    }

    # その他の一般的な設定
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
    
    access_log /var/log/nginx/test-site.online.access.log rt_cache;
    error_log /var/log/nginx/test-site.online.error.log;

    include common/php83.conf;
    include common/wpcommon-php83.conf;
    include common/locations-wo.conf;
    include /var/www/test-site.online/conf/nginx/*.conf;
}

設定が書き終わったら、Ctrl+OEnter で保存し、Ctrl+X で閉じます。

ステップ 3:Nginxをテストして再起動(両方のサーバーで実行)

設定に構文エラーがないかチェックし、問題なければリロードして反映させます。VPS側、自宅サーバー側の両方で実行してください。

Bash
sudo nginx -t
sudo systemctl reload nginx

🛡️ ブラウザで確認!「403 Forbidden」の鉄槌を下す

設定が完了したら、さっそくスマホ(Wi-Fiを切って4G/5G回線にした状態など、許可リストに入れていないIP)から、あなたのサイトのログイン画面にアクセスしてみてください。

Plaintext
https://test-site.online/wp-login.php

画面に素っ気なく 「403 Forbidden」 と表示されれば完全大成功です!

世界中のbotや攻撃者が、どんなに強力な総当たりツールをVPSに向けて叩きつけてこようとも、中継されて自宅サーバーに届いた瞬間に、Nginxが「お前の本当のIPは許可リストにない。回れ右!」と1ミリの猶予もなくシャットアウトしてくれます。
もちろん、自宅のPCや、許可リストに登録したスマホのIPからであれば、何事もなかったかのようにいつもの綺麗なWordPressログイン画面が表示されます。

🔗 まとめ:サーバーの鍵は自分で握る

突かれると一番痛い wp-login.php を完璧に塞いだことで、この自宅サーバーの防御力は一気に跳ね上がりました。 セキュリティプラグインを何個も入れてWordPressの挙動を重くするくらいなら、インフラの最前面(Nginx)でパッと叩き落とす。これが一番軽くて、一番強固な大正義の対策です。
これでログイン画面の要塞化は完了。しかし、攻撃者はログイン画面以外にも、怪しい海外IPからのスキャンや、システムを狙った別のアタックを仕掛けてきます。
次回は、さらに広範囲からの攻撃を自動で、根こそぎ検知してBANする定番の監視ツールをこのVPS中継環境にブチ込んでいきます。お楽しみに!

次の記事は2026年7月29日公開です。

10G光クロス×MAP-Eサバイバル。ログの罠をハックして不正アクセスを自動爆破する「fail2ban」動的迎撃編
10G光クロス×MAP-Eの自宅サーバー構築連載!VPS中継環境でfail2banを導入する際の致命的な罠「VPSのセルフBAN」を回避する手法。Nginxのログフォーマットをハックし、悪質なbotを自動迎撃・遮断する手順。

コメント

タイトルとURLをコピーしました