私は、Azureの上でホストされているWebアプリケーション(symfonyの4.1)上のすべてのログイン試行をログに記録します。
基づいて、この質問クライアントのIPを取得するには、私が使用しています:
// $requestStack being Symfony\Component\HttpFoundation\RequestStack
$ip = $this->requestStack->getMasterRequest()->getClientIp();
しかし、ログは言います:
[2020年3月10日午前10時55分56秒] login_attempt.INFO:成功したIPからのログインユーザー 'ユーザー名' '172.16.1.1' [] []は、
あなたが気づくことができるように、これはあるプライベートIP。私は貴様の接続からのログインを試みたが、私はいつも、そのIPを取得しています172.16.1.1
。このIPはどこから来るのか、クライアントの真のパブリックIPを取得する方法?
プライベートIPは、ロードバランサまたはリバースプロキシすることができます。
以下からのドキュメント:
アプリケーションをデプロイするときは、ロードバランサ(例えばAWS弾性負荷分散)または(キャッシュ用などワニス)リバースプロキシの背後かもしれません。
ほとんどの部分については、これはsymfonyで問題が発生することはありません。要求がプロキシを通過するときには、特定の要求情報は、標準のいずれかで使用して送信される
Forwarded
ヘッダまたはX-Forwarded-*
ヘッダを。たとえば、代わりに読んでREMOTE_ADDR
(今、あなたのリバースプロキシのIPアドレスになります)ヘッダを、ユーザーの本当のIPを標準に格納されるForwarded: for="..."
ヘッダやX-Forwarded-For
ヘッダ。あなたはこれらのヘッダを探すためにsymfonyのを設定しない場合、あなたは、クライアントがHTTPS経由で接続されているかどうか、クライアントのIPアドレスに関する誤った情報を得るでしょう、クライアントのポートとホスト名が要求されています。
これを修正するためには、アプリケーションの信頼されたプロキシでIPことを追加することができます。
symfonyの4で、これはこの方法を行うことができます。
// index.php
// creates the $_SERVER['TRUSTED_PROXIES'] entry if it doesn't exist/is empty with the IP of the proxy to trust as value
// or append ',the ip' to the existing entry
$_SERVER['TRUSTED_PROXIES'] = (empty($_SERVER['TRUSTED_PROXIES']) ? '' : ($_SERVER['TRUSTED_PROXIES'] . ',')) . '172.16.1.1';
// This is already in index.php, just let it doing its job
if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? false) {
Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST);
}
そして今、ログに:
[2020年3月10日夜01時09分06秒] login_attempt.INFO:ユーザーズ名'が正常のIPからログインしてパブリックIPアドレス ' [] []