【nginx】CloudFront, ALBどちらからのリクエストでも適切なremote_addrを取得する【php-fpm】
本記事の趣旨
とあるアプリケーションの前段にCloudFrontを挟む作業をしていたのですが、CloudFrontが挟まるとnginx側でシンプルに X-Forwarder-forを使用してuser側のIPを取得することができませんでした。
また、ごく一部にALB越しでのアクセスが存在しており、あとは無停止でalbからcloudfrontへ移行する必要があったので、nginx側でcloudfront越しのIPとalb越しのIPどちらのIPも常に適切なものを所得できる必要がありました。
一部のブログではset_real_ip_fromディレクティブに 0.0.0.0/0を挿入し、すべてのIPを信頼するといったやり方が紹介されていますが、 X-Fowarded-Forは偽装可能なので今回は使用を避けました。
(もちろんアプリケーションの仕様によってはこちらを採用しても良いと思います。)
そこで、cloudfrontのカスタムヘッダである CloudFront-Viewer-Addressを使用しクライアントののIP:Portを取得し、そのままだとport番号まで文字列に含まれているので一部加工してからアプリケーションへ渡すことにしました。
また、alb cloudfrontともに対応するために該当ヘッダが存在するかどうかで最終的に渡すipを決めています。
続きを読む