ELBの後ろにあるEC2にはPHPサーバーがいくつかあります。私たちは、サーバーに接続するクライアントのIPアドレスでロケール/地域を決定したいと考えています。問題は、PHPサーバだけがELBのIPアドレスを参照することです。私たちはELBを通過したクライアントのIPアドレスを見たいと思います。Amazon ELBの背後にあるクライアントのIPアドレスを確認
答えて
:
をX-転送さ-のリクエストヘッダはあなたが識別するのに役立ちますクライアントのIPアドレス。ロードバランサはクライアントとサーバー間のトラフィックをインターセプトするため、サーバーアクセスログにはロードバランサのIPアドレスのみが含まれます。クライアントのIPアドレスを確認するには、X-Forwarded-Forリクエストヘッダーを使用します。
次のPHPコード(Apacheを仮定)を使用してアクセスすることができます
$http_headers = apache_request_headers();
$original_ip = $http_headers["X-Forwarded-For"];
これは大きな問題であるので、この試してください:あなたは、Apacheを使用する場合はD
<?php
if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$real_client_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
$real_client_ip = $_SERVER["REMOTE_ADDR"];
}
これは、クライアントがX-Forwarded-For(クライアントがロードバランサであるため)を提供することを信頼することを前提としています。このコードは、REMOTE_ADDRを受け入れ可能なIPのホワイトリストと照らし合わせるか、コードを脆弱性まで開くべきです。 – ZiggyTheHamster
を、 mod_remoteipモジュールをご覧ください。これはApache 2.4以降に含まれていますが、2.2のバックポートもあります。
このモジュールは、RemoteIPHeaderディレクティブで設定された要求ヘッダーで報告されたユーザーエージェントIPアドレスとの接続のクライアントIPアドレスを上書きします。
指示に従って置き換えられると、このオーバーライドされたユーザエージェントIPアドレスは、mod_authz_hostに必要なIP機能に使用され、mod_statusによって報告され、mod_log_config%aとcore%aフォーマット文字列によって記録されます。接続の基になるクライアントIPは、%{c}形式の文字列で利用できます。
つまり、使用するヘッダー(X-Forwarded-Forなど)と、どのIPが信頼できるもの(ロードバランサなど)にするかを設定できます。信頼できるIPはヘッダーから削除され、信頼されていない最初のIPが元のクライアントとして使用されます。このIPは、ログのような他のモジュールのApacheで内部的に使用されます。
これは、mod_remoteipがスタック全体を処理するので、PHPでXFFヘッダーを処理するよりも便利です。あなたのアクセスログが正しいかどうか確認してください。
注:このモジュールの前身であるmod_rpafモジュールもあります。はるかに限定されている。たとえば、信頼できるIP範囲を処理することはできません。事前にELBのIPを知らないので、これが必要です。また、Apacheの前にELB before Varnishなどの複数のホップを処理することもできません。私はrpafモジュールをスキップし、代わりにremoteipを使用することをお勧めします。
mod_cloudflareは、特にいくつかの場合、より良いオプションと思われます - 特にv2。2人のユーザーは、この男のブログで続きを読む : http://knowledgevoid.com/blog/2012/01/13/logging-the-correct-ip-address-using-apache-2-2-x-and-amazons-elastic-load-balancer/
最適なソリューション:
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$commaPos = strrchr($_SERVER['HTTP_X_FORWARDED_FOR'], ',');
if ($commaPos === FALSE) $remote_addr = $_SERVER['HTTP_X_FORWARDED_FOR'];
else $remote_addr = trim(substr($_SERVER['HTTP_X_FORWARDED_FOR'], $commaPos + 1));
} else {
$remote_addr = $_SERVER['REMOTE_ADDR'];
}
注:X-Forwarded-Forは最後に、プロキシのコンマスペースで区切ったリストを指定できますリスト内のはAWSのELBに接続しているものであるため、偽装されていないと信頼できる唯一のものです。
- 1. AWS ELBの背後にあるクライアントIPを取得する方法は?
- 2. Amazon AWS ELBの背後にあるサーバーにパブリックアドレスがない
- 3. Amazon ELBの背後にあるNodeJsアプリケーション502
- 4. ELBの背後にあるハプロキシ
- 5. amazon elbの背後にあるjavaサーバーを使用してhttpとhttpsにリダイレクト
- 6. AmazonのクラウドのIPアドレスが静的であるかどうかを確認するには?
- 7. WebClientクライアントのIPアドレス
- 8. クライアントのIPアドレス/ MAC
- 9. サーバ上の接続されたクライアントのIPアドレスを確認する
- 10. 私のamazon Ec-2 ipアドレス
- 11. Amazon ec2ホスティングサーバーのIPアドレス
- 12. クライアントが接続しているサーバーのIPアドレスを確認する方法
- 13. AWS ELBの背後で動作するSSHサーバーのSSHクライアントの実際のIPを見る方法
- 14. 訪問回数とIPアドレスの確認
- 15. SilverlightクライアントにユーザーのIPアドレスを認識させる方法
- 16. HTTPS/SSLを使用したAWS ELBの背後にあるZUUL
- 17. ELBの背後にあるYoutrackのHTTPSリダイレクトへ
- 18. AWSの背後にあるNode.jsアプリのSSL統合ELB
- 19. C++が有効なIPアドレスまたはIPを確認する
- 20. HttpListenerリモートIPアドレス(クライアント)
- 21. ELB with tcp modeとクライアントIPスティッキー
- 22. VPCのAmazon ELB
- 23. ロードバランサの背後にあるSSL接続を確認する
- 24. ELBの背後にあるLaravel 4.2 - セッションが動作しない
- 25. Amazon ELB
- 26. NATの背後にあるCORBAクライアント
- 27. ルータの背後にあるPythonクライアント/サーバ
- 28. Amazon WebサービスのIPアドレスとサービスプロトコル
- 29. GoogleドライブAPI - アップローダのIPアドレスを確認する
セキュリティを気にする人は、ELB以外のWebサーバーとの接続を禁止する必要があります。さもなければ、攻撃者はELBのふりをして、このヘッダーを設定し、真のリモートIPアドレスについてあなたに嘘をつきます。 http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/using-elb-security-groups.html –
X-Forwarded-Forヘッダには、コンマで区切られたIPアドレスのリストが含まれている場合があります複数のフォワーダ。最初のものは元のクライアントIPです。 http://en.wikipedia.org/wiki/X-Forwarded-For#Format – mmindenhall
クライアントが独自のX-Forwarded-Forを提供した場合、コンマで区切られたIPリストの最初のものになります応用。実際のIPは、明らかに最後の項目です。 –