WordPress(docker)のアクセス元IPアドレスを正す
WordPress(WP) + docker + CloudFront(CDN)の構成を使っている人向け。ログに残るIPがおかしい場合の対処法。
ApacheのlogのIPがおかしい件
自分はAmazon Elastic BeanstalkのdockerでWPを動かしています。WPのdockerは/var/log/nginx/以下にアクセスログが出力されます。
$ root@f8c4d3b7efac:/var/www/html# ls -al /var/log/nginx/
total 924
drwxrwxrwx 3 root root 4096 Sep 28 20:52 .
drwxr-xr-x 5 root root 4096 Sep 28 20:51 ..
-rw-r--r-- 1 root root 764970 Sep 28 19:08 eb-15d8d75545a0-stdouterr.log
中身はこんな感じ。
70.132.55.139 - - [28/Sep/2019:19:51:00 +0000] "GET /wp-login.php?loggedout=true HTTP/1.1" 200 1786 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
一番左にIPが載っていますが、これは
$ nslookup 70.132.55.139
Server: 2400:4050:31e0:200:21f:67ff:fe6e:79e
Address: 2400:4050:31e0:200:21f:67ff:fe6e:79e#53
Non-authoritative answer:
139.55.132.70.in-addr.arpa name = server-70-132-55-139.nrt20.r.cloudfront.net.
Authoritative answers can be found from:
というわけでCloudFrontのIPになってしまっていますね。アクセスログにはアクセスしてきた人・ブラウザのクライアントIPが載っていてほしいです。
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html
CloudFrontはオリジンサーバにアクセスするときにX-Forwarded-ForにクライアントのIPを入れて、docker版wordpress(の中のApache)がX-Forwarded-Forを拾ってくれないのでCloudFrontのIPが出てしまっていますね。
この辺りの現象はここで議論されていて
https://github.com/docker-library/wordpress/issues/383
最終的にこちらのPRで対応されました。
https://github.com/docker-library/wordpress/pull/411
ローカルエリアにあるReverseProxyには対応されていますが、CloudFrontには対応していないので、今回自分の場合、だめだった、という感じですね。
このPRとほぼ同じことをしてあげればいいので、自分はこちらのコミットで対応しました。
https://github.com/tsukaby/tsukaby-tech-blog-docker/commit/4a41f97ff9634afecc4ff590fb6fcaa442ae63e5
CloudFrontのIPレンジを取得してRemoteIPTrustedProxyとして追加した感じですね。こうするとApacheが指定したIPからのリクエストの場合、X-Forwarded-Forを見てくれるようになります。詳しく知りたい方はmod_remoteipで調べると良いかと思います。自分はこの辺が参考になりました。
http://apache24.jugem.jp/?eid=8
https://blog.manabusakai.com/2016/11/nginx-realip-apache-remoteip/
ここまではApacheのログの話で、実はPHP側(WP管理画面側)でもおかしい件
上記の対応だけだと不十分で、WPでコメントしたり、何かのプラグインがIPアドレスを保管するときにもIPがおかしいことに気づきました。
というわけでこれは先人が既に調べてくれていたので、
https://blog.trippyboy.com/2011/wordpress/wordpress%E3%81%A8reverseproxy%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E6%8E%A5%E7%B6%9A%E5%85%83%E3%82%92%E6%AD%A3%E3%81%97%E3%81%8F%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/
こちらを参考にさせてもらいました。$_SERVER[‘REMOTE_ADDR’]をみるのか・・なるほどなあ。
ちなみに自分の場合EBを使っており、さらにdockerなので、こうしました。
https://github.com/tsukaby/tsukaby-tech-blog-docker/commit/1e15c63537d3e78604b1e154c08a1cfdd1feea08
WORDPRESS_CONFIG_EXTRAという環境変数でwp-config.phpに追記を行えるので、それを使って、上記の$_SERVER書き換えを行なっています。
以上です。