Nginx set_real_ip_from AWS ELB ロードバランサーアドレス

Nginx set_real_ip_from AWS ELB ロードバランサーアドレス

私はAmazon ELBロードバランサーの背後にNginxサーバー群を持っています。set_real_ip(HTTPリアルIPモジュール)これらのサーバー上の発信クライアントIPアドレスにアクセスできるようにします(php-fpmに渡すため、およびHttpGeoIPモジュール)。

nginx の設定では IP アドレスしか受け入れられないようですset_real_ip_from。ただし、ELB マシンに関しては Amazon は次のように述べています:

注意: LoadBalancer に関連付けられた IP アドレスのセットは時間の経過とともに変化する可能性があるため、特定の IP アドレスで "A" レコードを作成しないでください。Elastic Load Balancing サービスによって生成された名前ではなく、LoadBalancer にわかりやすい DNS 名を使用する場合は、LoadBalancer DNS 名の CNAME レコードを作成するか、Amazon Route 53 を使用してホストゾーンを作成する必要があります。詳細については、「Elastic Load Balancing でのドメイン名の使用」を参照してください。

しかし、IP アドレスを入力する必要がある場合は、CNAME (Amazon のものでも自分のものでも) を使用できません。この問題の解決策はありますか?

答え1

すべてのリクエストが ELB から来ることを保証できる場合 (私は ELB に詳しくありません)、以下を試すことができます。

real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;

これにより、nginx は誰からの X-Forwarded-For ヘッダーも信頼するようになります。欠点は、誰かがサーバーに直接アクセスすると、X-Forwarded-For ヘッダーを偽装でき、nginx が間違ったクライアント IP アドレスを使用する可能性があることです。

答え2

今日のベストプラクティスは VPC を使用することです。そうすれば、ELB の正確な CIDR がわかります。次に、次のようなものを Nginx 構成ファイルに追加できます。

real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;

答え3

VPC CIDR を使用します。これは、Amazon コンソールの VPC => Your VPC (これにset_real_ip_from置き換えます) で見つけることができます。<your VPC CIDR here>

real_ip_header X-Forwarded-For;
set_real_ip_from <your VPC CIDR here>;

答え4

Amazon ELBで信頼範囲を0.0.0.0/0に設定すると、間違いなく問題が生じます。nginxサーバーのセキュリティグループを設定できれば、リクエストがELBから来ることを保証できますが、オリジナルリクエストはあらゆる可能なソースから発信されます (Amazon ELB はパブリックインターフェースです)。

簡単なテストで次のことがわかります。

curl --header "X-Forwarded-For: 1.2.3.4" "http://your-elb-dns-address/"

すると、nginxサーバーのログには1.2.3.4が偽装されたIPとして表示されます。Amazon ELB の内部プライベート IP の IP 範囲より良い回答を得るために。

関連情報