나는 푸른에서 호스팅되는 웹 응용 프로그램의 모든 로그인 시도 (심포니 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 . 나는 differents의 연결에서 로그인을 시도,하지만 난 항상 IP 것을 얻고있다 172.16.1.1
. 어디에서이 IP에서 온 않고 어떻게 클라이언트의 실제 공용 IP를 얻으려면?
즉, 사설 IP는 부하 분산 또는 역방향 프록시가 될 수 있습니다.
에서 문서 :
응용 프로그램을 배포 할 때, 당신은 부하 분산 장치 (예 : AWS 탄성 부하 분산) 또는 (캐싱 예 니스) 리버스 프록시 뒤에있을 수 있습니다.
대부분의 경우,이 심포니에 문제가 발생하지 않습니다. 요청이 프록시를 통과 할 때, 특정 요청 정보는 표준 중 하나를 사용하여 전송되는
Forwarded
헤더 나X-Forwarded-*
헤더를. 예를 들어, 대신 읽는REMOTE_ADDR
(현재 역방향 프록시의 IP 주소가됩니다) 헤더를 사용자의 실제 IP 표준에 저장됩니다Forwarded: for="..."
헤더 또는X-Forwarded-For
헤더 .당신이 이러한 헤더를 찾기 위해 심포니을 구성하지 않으면 클라이언트가 HTTPS를 통해 연결되어 있는지 여부, 클라이언트의 IP 주소에 대한 잘못된 정보를 얻을 수 있습니다, 클라이언트의 포트와 호스트 이름이 요청된다.
이 문제를 해결하려면, 하나는 응용 프로그램의 신뢰 프록시에 IP 것을 추가 할 수 있습니다.
심포니 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일 13시 9분 6초] login_attempt.INFO : 사용자 이름 '성공적으로'IP에서 로그인 공용 IP 주소 '[] []