つかびーの技術日記

(情報)工学修士, 元SIer SE, 現Web系 SEの技術blogです。Scala, Java, JS, TS, Python, Ruby, AWS, GCPあたりが好きです。

WordPress(docker)のアクセス元IPアドレスを正す

      2019/10/07

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書き換えを行なっています。

以上です。

 - サーバ