対象
- WordPress の管理画面に IPアドレスアクセス制限をかけ、外部公開したくない。
- WordPress docker コンテナに Nginx docker コンテナからリバースプロキシ接続している。
- server をローカル環境に置いている。
WordPress を外部公開した場合、/wp-login.php 等の管理画面も公開されます。
この画面に IPアドレスによるアクセス制限をかけることができます。ローカル環境からのみアクセスできるようにします。
wordpress.conf
server {
listen ${NGINX_WP_PORT}; #環境に合わせて書き換える
server_name ${NGINX_WP_HOST}; #環境に合わせて書き換える
access_log /var/log/nginx/host.access.log main;
location / {
location ~* /wp-login\.php|/wp-admin/((?!admin-ajax\.php).)*$ {
allow 10.0.0.0/8;
allow 172.16.0.0/12;
allow 192.168.0.0/16;
allow 127.0.0.1;
deny all;
proxy_pass http://wordpress; # コンテナ名を指定
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
}
proxy_pass http://wordpress; # コンテナ名を指定
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
}
リバースプロキシ先を指定する “location / { }” の中に、管理画面関係のアクセス先を指定する “location ~* /wp-login\.php|/wp-admin/((?!admin-ajax\.php).)*$ { }” を記述します。入れ子にするのがポイントです。
“location ~* /wp-login\.php|/wp-admin/((?!admin-ajax\.php).)*$ { }”の内容は、次の通りです。
- allow ~ は、ローカルアドレスを許可する記述です。
- deny all は、allow で許可されたアドレス以外をすべて拒否する記述です。
- IPアドレス制限の部分だけだと、制御をしたあとどこにアクセスすればいいか分からないので、リバースプロキシ接続先を記述します。
proxy ~ の内容は、ひとつ目の塊の内容とふたつ目で全く同じです。
まとめ
メインのリバースプロキシ location 中に条件指定の location を入れ、そこにアドレス制限とアクセス先を記述するという構造です。ふたつの location を入れ子にしていない場合や allow と deny だけ記述してそのあとのアクセス先を書いていない場合は、期待通りの挙動になりませんでした。
外部からのアクセス
上記設定をそのまま適用した場合は、インターネットからは管理画面にアクセスできず、 server と同じ LAN 内からなら管理画面にアクセスできます。もし、インターネット越しに管理画面にアクセスしたい場合は、LAN 内に VPN サーバーを用意して VPN 接続すれば良いです。LAN 内の VPN サーバを経由した場合、Nginx からは LAN 内からアクセスとしてきていると扱われるため、インターネット経由でも管理画面にアクセスできます。
参考
Nginx リバースプロキシを用いた WordPress 外部公開までの手順は、こちらの記事が大変参考になりました。ありがとうございます。
Dockerでリバースプロキシ(nginx)構築+SSL対応 – Qiita