Как получить IP-адрес клиента с помощью приложения Symfony 4, размещенного в Azure Web App - PullRequest
1 голос
/ 10 марта 2020

Я хочу регистрировать все попытки входа в систему в веб-приложении (Symfony 4.1), размещенном на Azure.

На основе этого вопроса , чтобы получить клиентский IP, я использую:

// $requestStack being Symfony\Component\HttpFoundation\RequestStack
$ip = $this->requestStack->getMasterRequest()->getClientIp();

Однако в журналах указано:

[2020-03-10 10:55:56] login_attempt.INFO: Пользователь 'username' успешно вошел в систему из ip '172.16.1.1' [] []

Как вы можете заметить, это частный IP . Я пытался войти с разных соединений, но я всегда получаю этот IP, 172.16.1.1. Откуда этот IP-адрес и как получить настоящий общедоступный c IP-адрес клиента?

1 Ответ

1 голос
/ 10 марта 2020

Этот частный IP-адрес может быть балансировщиком нагрузки или обратным прокси.

Из документации :

При развертывании приложения вы можете отставать балансировщик нагрузки (например, AWS Elasti c Load Balancing) или обратный прокси-сервер (например, Varni sh для кэширования).

В большинстве случаев это не вызывает проблем с Symfony. Но когда запрос проходит через прокси, определенная информация о запросе отправляется с использованием стандартного заголовка Forwarded или заголовков X-Forwarded-*. Например, вместо чтения заголовка REMOTE_ADDR (который теперь будет IP-адресом вашего обратного прокси-сервера), истинный IP-адрес пользователя будет сохранен в стандартном заголовке Forwarded: for="..." или X-Forwarded-For заголовке * 1016. *.

Если вы не настроите Symfony для поиска этих заголовков, вы получите неверную информацию об IP-адресе клиента, независимо от того, подключается ли клиент через HTTPS, порт клиента и запрашиваемое имя хоста.

Чтобы исправить это, можно добавить этот 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-03-10 13:09:06] login_attempt.INFO: Пользователь 'username' успешно вошел в систему с ip ' публичный c IP-адрес '[] []

...