web-dev-qa-db-ja.com

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

Amazon ELBロードバランサーの背後に一連のNginxサーバーがあります。これらのサーバーの元のクライアントIPアドレスにアクセスできるように(php-fpmへのパススルーおよび HttpGeoIPModule での使用のため)、set_real_ip( HttpRealIpModule から)を使用しています)。

のようだ set_real_ip_from nginx構成では、IPアドレスのみを受け入れることができます。ただし、ELBマシンに関してAmazonは次のように述べています。

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

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

23
vitch

すべてのリクエストが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アドレスを使用することです。

44
kolbyjack

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

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

set_real_ip_fromにVPC CIDRを使用します。AmazonコンソールのVPC => Your VPCで確認できます(<your VPC CIDR here>をそれに置き換えます):

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

Amazon ELBで信頼できる範囲を0.0.0.0/0に設定すると、問題が発生します。 nginxサーバーのセキュリティグループを構成できる場合は、ELBからのリクエストを確実に送信できますが、originalリクエストは可能な任意のソースから発信されます(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範囲 を参照してください。

4

realip_module は、X-Forwarded-Forの場合、このモジュールがX-Forwarded-Forヘッダーの最後のIPアドレスを置換に使用することを示しています。このモジュールは、real_ip_headerおよびset_real_ip_formのみが設定されている場合は機能しません。これは、このモジュールがクライアントIPではなくプロキシIPアドレスを使用するためです。これを解決するには、real_ip_recursiveディレクティブを有効にする必要があります。

さらに、インスタンスでデプロイおよび更新されたSSL証明書がある場合(たとえば、letsencryptまたはcertbot証明書)。これらの認証局は、IPV6を介してこれらの証明書を検証しようとする場合があります。

したがって、IPV6も持つことが重要です。そのため、Nginx構成ファイルには、set_real_ip_from IPV6アドレスも含める必要があります。

real_ip_header X-Forwarded-For;
real_ip_recursive on;
set_real_ip_from <your VPC IPV4 CIDR here>;
set_real_ip_from <your VPC IPV6 CIDR here>;

追加のセキュリティ制限が適用される場合、cloudfront/elb/ec2サブネットのset_real_ip_from VPC CIDR(IPV4とIPV6の両方)を含める必要がある場合もあります。

4