2010-02-11 7 views
8

Apache가 역방향 프록시 (예 : Squid) 뒤에있는 상황에서 cgi 환경 변수 REMOTE_ADDR은 클라이언트가 아닌 프록시 주소를 가져옵니다.Apache에서 REMOTE_ADDR을 X-Forwarded-For로 설정합니다.

그러나 프록시는 클라이언트의 원래 IP 주소를 포함하도록 X-Forwarded-For이라는 헤더를 설정하여 Apache에서 볼 수 있도록합니다.

질문은, REMOTE_ADDR을 헤더의 값으로 대체하여 모든 웹 응용 프로그램이 올바른 주소를 투명하게 볼 수있게하려면 어떻게해야합니까?

답변

10

mod_rpaf를 사용할 수 있습니다. http://stderr.net/apache/rpaf/

+0

정확히 내가 무엇을 찾고 있었는지 (생각이 존재하지 않음). – tylerl

+2

나는 이것을 +1하고 있지만 rpaf가 네트워크 범위를 차지하지 않는다는 점에 유의하고 싶다. 그래서 당신의 공급자가 당신을 위해 균형을 잡고 있다면, 당신은 그들이 그들의 균형 자의 IP를 결코 바꾸지 않기를 바랄 필요가 있습니다. 또한 우분투 12.04가 conf를 올바르게로드하지 못하기 때문에 rpaf.conf에서 및 종료을 주석 처리해야합니다. 그렇지 않으면 해당 conf가로드되지 않습니다. –

+0

@DevNull : 업데이트 된 mod_rpaf를 참조하십시오. CDIR 범위를 지원합니다. https://github.com/gnif/mod_rpaf. 이 저장소는 원래 작성자의 허락을 받아서 공식적인 저장소입니다. – Geoffrey

1

이 값은 스푸핑 될 수 있습니다. 교차 사이트 스크립팅 결과가있는 실제 예는 http://blog.c22.cc/2011/04/22/surveymonkey-ip-spoofing/을 참조하십시오.

+4

그래서 (Maciekb에서 언급 한 매우 유용한 rpaf 모듈을 포함하여) 내가 본 모든 변환 메커니즘이 REMOTE_HOST 허용 목록을 사용하여 신뢰할 수있는 프록시에서 온다는 것을 알 수 있습니다. – tylerl

6

요청이 두 개 이상의 프록시를 통과하는 경우 X-Forwarded-For 헤더에 IP 주소 목록이 포함될 수 있습니다. 이 경우 보통 가장 왼쪽의 IP가 필요합니다.

SetEnvIf X-Forwarded-For "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFFCLIENTIP=$1 

$ (1)의 사용은 (괄호) 정규식에서 첫 번째 그룹의 내용을 유지하기 위해 XFFCLIENTIP 환경 변수를 설정 : 당신은한다 SetEnvIf와이를 추출 할 수 있습니다.

그런 다음 환경 변수 값을 사용하여 헤더를 설정하거나 로그에 실제 클라이언트 IP가 포함되도록 Apache 로그 형식으로 사용할 수 있습니다.

+1

정규 표현식이 틀린 것 같아요 : 가장 왼쪽에있는 것이 아니라'X-Forwarded-For' 헤더에서 가장 오른쪽에있는 IP 주소를 잡고 싶습니다. 대신 표현식은''. *? (\ d {1,3} + \. \ d {1,3} + \. \ d {1,3} + \. \ d {1,3} + $ "'. –

+0

Wikipedia가 최종 소스라는 것을 알지만, 현재 가장 왼쪽의 IP는 클라이언트라고 나와 있습니다 : https://en.wikipedia.org/wiki/X-Forwarded-For –

+0

그래서, 누가 믿으세요? :) –

3

앞서 언급 한 mod_rpaf 외에도 mod_extract_forwarded도이 기능을 수행합니다.

mod_extract_forwarded의 장점은 RHEL/CentOS 서버의 경우 EPEL에서 사용할 수 있으며 mod_rpaf은 그렇지 않다는 것입니다. 하지 범용이며, mod_cloudflare는 주목해야한다 :

이 두 모듈 중 어느 것도 당신이 CloudFlare의 사람들이 자신의 플러그인을 만든 이유는 프록시 서버의 전체 서브넷을 허용 목록에 추가 할 수 있음을 나타납니다 다른 두 사람과 같은 도구; CloudFlare 서브넷의 하드 코딩 된 목록을 포함합니다.

2

예, 가능합니다.

그냥 auto_prepend_file = "c:/prepend.php" 같이 php.ini 파일에서의 auto_prepend_file을 추가하고이 파일이 추가 :

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR']; 
} 

당신은 아파치 폭 RemoteIPHeader X-Real-IP에서 MOD_REMOTEIP이 필요합니다.

건배,

Guiremach

2
불행하게도

,이 글을 쓰는 시점에서

,에서 백 포트와 포크 없음 freshports.org, people.apache.org 또는 gist.github.com 일했다. 그것들은 2.2 버전이나 2.4 버전과 호환되지 않는 아파치 httpd 2.3의 초기 알파 버전을 기반으로했다.

그래서 httpd 2.2에 대한 실제 작업을 만들기 위해 백 포트를 조정하는 동안 시간을 ​​낭비하고 나서, 나는 httpd 2.4로 이동하기로 결정했다. httpd 2.4에서 mod_remoteip은로드 밸런서가 다른 실제 클라이언트 IP 주소에서 백엔드로 요청을 프록시하는 데 사용하는 영구적 인 연결 유지 연결을 가지고 있더라도 원활하게 작동합니다. 나는 다른 모듈이이 상황을 처리 할 수 ​​있는지 확신하지 못한다. (동일한 연결 내에서 각 요청에 대해 클라이언트 IP 주소를 변경하는 것).

0

모듈 mod_extract_forwarded을 설치하고 MEFaccept을 모두에 설정할 수 있습니다.

관련 문제