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


22

Amazon ELBロードバランサーの背後にNginxサーバーのセットがあります。私は(からset_real_ipを使用していますHttpRealIpModuleので、私はこれらのサーバー上の元のクライアントIPアドレスにアクセスできることを)(でのphp-FPMにし、使用するために通過するためHttpGeoIPModule)。

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

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

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

回答:


40

すべてのリクエストが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
おかげで- ELBが上かもしれないことを、より具体的な範囲がある場合、私は、私はそこにIPアドレスの範囲を追加することができます実現しなかった...私は(私が思うチェックします10.0.0.1/8もっと何か具体的な存在かもしれないが動作します)
vitch

:誰もが有効な範囲を知っている場合、私は見つけるために、質問のフォローアップを追加serverfault.com/questions/331697/...
vitch

VPC ALBの場合、範囲はLBが属するサブネット範囲と同じです。
タロンクス

17

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

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

質問は2011年からのものであるため、オプションが利用できなかった可能性があります。外部ユーザーは簡単にアクセスできないため、考えられるすべてのプライベートネットワークを含めます。
ジョーダンライター

7

VPC CIDRを使用するにはset_real_ip_from、AmazonコンソールのVPC => Your VPCにあります(置き換え<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サーバーのログには、実際のIPとして1.2.3.4が表示されますが、これはスプーフィングされたものです。より良い回答については、Amazon ELBの内部プライベートIPのIP範囲を参照してください。


3
これはreal_ip_recursiveをオンに設定した場合にのみ問題になります。これはデフォルトではなく、最初に質問に答えたときにも存在しませんでした。
kolbyjack

3

realip_module X-転送先についての場合には、このモジュールはX-転送先の代替のヘッダの最後の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>;

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.