| apache에서 Proxy IP를 real IP로 바꾸기 | 작성일 : 2010/03/03 19:14 |
| 조회수 : 31001 |
|
제 목 : apache에서 Proxy IP를 real IP로 바꾸기 작성자 : 좋은진호(truefeel, http://coffeenix.net/ ) 작성일 : 2010.2.25(목) 수정일 : 2015.3.3(화) mod_rpaf 다운받을 URL변경 등 수정일 : 2015.3.10(화) nginx 설정 추가 웹서버 앞단에 Proxy서버를 두거나 Citrix Netscaler등의 장비를 사용할 경우에, 웹서버는 Proxy 서버나 장비 IP에서 접속한 것으로 인식한다. 따라서 웹프로그램은 '실제 클라이언트 IP'가 아닌 앞단에 있는 Proxy서버 IP를 요청한 IP로 인식하게 된다. 웹로그도 마찬가지로 Proxy 서버 또는 장비 IP가 남게 된다.
이 때 X-Forwarded-For HTTP 헤더(또는 임의로 지정한 헤더)에 있는 클라이언트 IP를 뽑아서 1) 웹프로그램에서는 실제 요청한 클라이언트 IP를 알 수 있고, 2) 웹로그에도 남길 수가 있다. 다음은 아파치에서 LogFormat을 설정한 예이다. 첫번째줄은 기본적으로 제공하는 combined 포맷, 두번째줄이 IP 필드에 X-Forwarded-For헤더의 IP정보로 대체하는 포맷이다.
그러나 두번째줄의 LogFormat 설정을 하더라도 여러가 발생했을 경우 error log에는 여전히 Proxy IP가 남게 된다. 또한 웹프로그램에서는 클라이어트 IP을 알아야 할 경우 X-Forwarded-For를 매번 확인해야하는 불편함이 있다. 1. mod_rpaf 모듈이 하는 일
아파치용 mod_rpaf 모듈을 사용하면 문제를 말끔히 해결할 수 있다. 이 모듈은 클라이언트 IP가 저장된 X-Forwarded-For 헤더(헤더명은 변경 가능)값을 뽑아서 요청한 IP(REMOTE_ADDR)로 바꿔서 웹서버에 넘겨준다. 실제 클라이언트 IP를 넘겨주므로 웹프로그래밍이 편해진다. 그리고 LogFormat 설정을 변경할 필요가 없고, error log에도 실제 클라이언트 IP가 남는다. 1) mod_rpaf모듈 없다면 Client IP(192.168.123.123) -> Proxy 서버 (10.10.123.3) -> 웹서버는 10.10.123.3 에서 접속한 것으로 인식 2) mod_rpaf모듈 사용 Client IP(192.168.123.123) -> Proxy 서버 (10.10.123.3) -> 웹서버는 192.168.123.123에서 접속한 것으로 인식 2. mod_rpaf 모듈 설치 (apache 2.x에서) 1) 리눅스의 경우 https://github.com/y-ken/mod_rpaf (apache 2.0또는 2.2) 또는 https://github.com/gnif/mod_rpaf (apache 2.4지원)에서 모듈 소스를 받은 후, 아파치의 apxs명령으로 컴파일한다. (설치 방법은 해당 페이지를 참고 할 것)
모듈이 로딩되도록 설정한다.
2) FreeBSD의 경우 ports로 제공하므로 간단히 설치할 수 있다. 만약 apache 2.2를 사용중이라면 ap24-mod_rpaf2-0.6_3 is marked as broken: : Error from bsd.apache.mk. apache22 is installed ... 와 같은 에러가 나올 수 있다. /etc/make.conf에 DEFAULT_VERSIONS+=apache=2.2 를 추가하고 컴파일한다.
모듈이 로딩되도록 설정한다.
3. mod_rpaf 설정 apache 설정 예이다.
※ https://github.com/gnif/mod_rpaf 에서 모듈을 받아 설치한 경우 설정이 조금 다르니 주의할 것
- RPAFsethostname가 On으로 되어 있으면, X-Host 헤더의 값을 요청 호스트명으로 바꿔준다. - RPAFproxy_ips 에는 Proxy 서버 IP나 장비 IP를 나열한다. 여러 개일 때는 빈칸으로 구분한다. 여기에 적어진 IP를 마주치게 되면 HTTP 헤더에 적혀있는 클라이언트 IP로 바꿔주게 된다. - RPAFheader에는 클라이언트의 real IP가 들어 있는 HTTP 헤더명을 지정한다. 기본값은 X-Forwarded-For. 위의 설정에 따르면 웹서버에 접속한 IP가 10.10.123.3(즉, proxy 서버나 장비 IP)로 파악되었을 때, X-Forwarded-For 헤더에 있는 클라이언트 IP로 바뀌서 넘겨준다. php에서는 $_SERVER['REMOTE_ADDR']가 실제 클라이언트 IP로 바뀌게 되고, X-Host 헤더 값이 있다면 $_SERVER['HTTP_HOST'] 변수도 바뀌게 된다. 예 1) 웹서버에 접속한 IP가 10.10.123.3(즉, proxy 서버나 장비 IP)이고, X-Forwarded-For헤더가 111.111.111.1 일 때 다음과 같이 로그가 남는다.
예 2) 웹서버에 접속한 IP가 222.222.222.2(RPAFproxy_ips에 설정하지 않은 IP)이고, X-Forwarded-For헤더가 111.111.111.1 일때, IP변환없이 그대로 남는다.
4. 시트릭스 넷스케일러에서 Use Source IP를 쓰지 않을 때 System -> Settings -> Modes 를 클릭하면 'Use Source IP'설정이 있다. ![]() 1) 체크를 하면, 실제 접속한 클라이언트(PC) IP정보를 그대로 하단 웹서버로 넘겨준다. 웹서버에서 해줄 것은 아무 것도 없다. 2) 체크를 해제하면, 시트릭스 장비의 IP를 넘겨준다. 이때 지정한 헤더에 클라이언트 real IP정보가 담겨있다. 시트릭스 넷스케일러에서 클라이언트 IP를 담을 헤더명은 다음과 같이 설정한다.
아파치에서 설정은 위에서 했던 것과 똑같다. RPAFproxy_ips에는 시트릭스 장비 IP를, RPAFheader에는 시트릭스에서 설정한 HTTP 헤더명을 적어준다.
5. nginx에서
자세한 설정은 다음 글의 '4. 웹서버 로그에 Proxy IP대신 클라이언트 IP 남기기'부분을 읽어보시길. * HAProxy로 로드밸런싱(LB, 이중화) 구성 (글 좋은진호, 2015.3) http://coffeenix.net/board_view.php?bd_code=1771 6. 참고 자료 * reverse proxy add forward module for Apache (mod_rpaf) https://github.com/gnif/mod_rpaf (apache 2.4 지원) https://github.com/y-ken/mod_rpaf http://stderr.net/apache/rpaf/ (2015.2 현재 접속 안됨) * FreeBSD : mod_rpaf http://www.freebsdsoftware.org/www/mod_rpaf.html * X-Forwarded-For http://en.wikipedia.org/wiki/X-Forwarded-For * Custom Header Module for Apache 2.x to Process Client IP Address http://support.citrix.com/article/CTX109555 * How to rewrite HTTP Headers with Client IP http://community.citrix.com/display/ns/How+to+rewrite+HTTP+Headers+with+Client+IP |
|||||||||||||||||||||||||||||||||||||||||||
|
|