2013-03-17 2 views
9

프록시 된 백엔드가 원래 호출자의 호스트 이름을 수신하는지 확인하기 위해 웹에서 ProxyPreserveHost On의 사용과 관련하여 많은 것을 봅니다. 내 웹 응용 프로그램의 보안 (Java, Tomcat)을 강화하기 위해이 도구를 사용하고 있지만 내 로그에 사용자가 실제로있는 위치가 표시되면 좋을 것입니다. 내 톰캣 로그 지금 보여이 – 꽤 쓸모 :ProxyPreserveHost가 나를 위해 거의하지 않는 것 같습니다

127.0.0.1 - - [17/Mar/2013:06:32:13 +0100] "GET /webapp/frontend/app/partials/welcome.html HTTP/1.1" 200 54 

이 예상대로 명확하게 작동하지 않는 내 구성입니다 :

"/ 등/아파치/사이트 지원/000-기본"

<VirtualHost *:80> 
ProxyPreserveHost On 
ProxyPass /webapp http://localhost:8080/webapp 
ProxyPassReverse /webapp http://localhost:8080/webapp 
RewriteEngine On 
RewriteRule ^/$   /webapp/frontend/app/ [proxy] 
RewriteRule ^/webapp/$  /webapp/frontend/app/ [redirect] 
RewriteRule ^/webapp/app/$ /webapp/frontend/app/ [redirect] 

사용 가능 모듈 (여기 000-default에 있던 기본 재료부터가) :

,
sudo a2enmod proxy 
sudo a2enmod proxy_http 
sudo a2enmod rewrite 

이것은 Apache HTTPD 2.2.22를 실행하는 우분투 12.10입니다.

귀하의 도움을 많이 주시면 감사하겠습니다.

답변

10

액세스 기록에 여전히 클라이언트 필드에 127.0.0.1이 포함되어 있다고 염려합니다. 이것은 ProxyPreserveHost의 영향을받지 않습니다. 이 주소는 Apache에 연결된 네트워크 끝점의 IP 주소입니다. 다른 서버의 프록시 된 연결의 경우 항상 localhost가됩니다.

또한 ProxyPreserveHost은 클라이언트가 전송 한 Host 헤더를 유지하는 것이지 클라이언트의 원래 IP를 유지하는 것이 아닙니다. 즉, 정보가 잘못된 방향으로 가고 있다는 것입니다. 그것은 클라이언트의 IP가 아닌 클라이언트가 보낸 것으로 서버의 이름을 보존합니다.

귀하의 질문은 this question과 동일하다고 생각합니다. 나는 당신의 CustomLog 구성에 %{X-Forwarded-For}i을 사용하여 로그에 X-Forwarded-For 헤더를 기록 할 수 있다는 추가적 인 메모를 추가 할 것입니다.

+0

감사합니다. 당신이 참조하는 질문은 스택 오버 플로우 외부의 기사에 대한 링크가 실제로 "ProxyPreserveHost"를 하나의 솔루션으로 언급하는 투표 결과에 대한 답변을 갖고 있으므로 개발자는'X-Forwarded-For' 헤더를 사용하지 않아도됩니다. . 나는 그런 개발자 다. 그리고 나는 비표준 무언가를 사용해야하는 것이 나쁘다고 느꼈다. 내가'X-Forwarded-For'를봤을 때, Wikipedia조차도 그 사실을 처음에 생각했던 것보다 훨씬 나은 표준으로보고있다. (내 웹 애플리케이션을 Apache HTTPD와 관련이있는 Apache HTTPD와 관련있다.) . –

+0

나는 링크 된 블로그 포스트가 혼란스럽게 작성되었다고 생각한다. 그는 지시문을 사용하여 "원격 호스트가 아닌 원격 호스트"를 보존 할 수 있다고 말합니다. 정상적인 상황에서는 DNS와 같은 두 가지 이름이 있지만 원격 호스트의 호스트 이름 대신 실제로 "원격 클라이언트가 보낸 호스트 헤더"를 의미한다고 생각합니다. 그러나 실제로, 서면으로 그것은 오히려 혼란 스럽습니다. – rra

+0

나는'WebAuthenticationDetails.getRemoteAddress()'에 대한 기존 검사 외에'HttpServletRequest.getHeader ("X-Forwarded-For")'의 리턴 값에 대한 검사를 구현했다. 내 응용 프로그램은 이제'X-Forwarded-For '를 인식합니다. 그럼에도 불구하고 내가 처음에는 기대했던 것이 아니 었습니다. 고맙습니다. –