プロキシを利用した場合、一般的にサービスが受け取る接続元IPはプロキシのIPになります。
じっさいの接続元IPはヘッダーなどから抽出する必要があります。
GCPのHTTPSロードバランサーの場合、
ターゲットプロキシの表にヘッダーの仕様を掲載しています。
クライアントのIPはX-Forwarded-For
に記録されています。
なお、GCPのプロキシには複数の製品があり、HTTPSロードバランサーはGKEのingress
により自動作成されます。ほかにGKEにはLoadBalancer
が作成するプロキシがありますが、これはTCPプロキシであり、まったく挙動が異なります。
nginxでX-Forwarded-ForからIP抽出
nginxで接続元IPを加工するには、
ngx_http_realip_moduleを利用します。
GCP HTTPS LBの設定例は以下のようになります。
server {
set_real_ip_from <external-ip>/32;
set_real_ip_from 130.211.0.0/22;
set_real_ip_from 35.191.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
X-Forwarded-For
は改竄しうるヘッダーであるため、set_real_ip_from
で信用するリクエストのネットワークアドレスを指定します。
GCPの
X-Forwarded-Forの仕様によると、フロントエンドプロキシのアドレスは130.211.0.0/22
と35.191.0.0/16
です。
また、X-Forwarded-For
には経由レイヤのIPも含まれているため、real_ip_recursive on
でプロキシのIPを除去する必要があります。
除去対象のアドレスはset_real_ip_from
を参照しています。
フロントエンド・プロキシのほか、外部IPも除去する必要があり、<external-ip>/32
の形式で実IPを指定しておきます。外部IPは構成により異なるため、あらかじめ調べておきます。
この設定により、configで参照する$remote_addr
もX-Forwarded-Forから抽出した値になります。
Chuma Takahiro