커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 네트워크(network) > 웹 서버(web, httpd, apache) 도움말
검색 : 사이트 WHOIS 웹서버 종류

WebDAV (7, 글 1, 자료 4)
웹서버 튜닝 (5, 글 4, 자료 2)
웹서버 사용 통계 자료 (2, 자료 1)
Apache SSL / mod_ssl (4, 글 3, 자료 2)

  apache에서 Proxy IP를 real IP로 바꾸기 작성일 : 2010/03/03 19:14
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 27216
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
      제  목 :  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가 남게 된다.

     
    Client IP -> Proxy 서버 및 장비 -> 웹서버
     


    이 때 X-Forwarded-For HTTP 헤더(또는 임의로 지정한 헤더)에 있는 클라이언트 IP를 뽑아서
    1) 웹프로그램에서는 실제 요청한 클라이언트 IP를 알 수 있고,
    2) 웹로그에도 남길 수가 있다.

    다음은 아파치에서 LogFormat을 설정한 예이다. 첫번째줄은 기본적으로 제공하는 combined 포맷, 두번째줄이 IP 필드에 X-Forwarded-For헤더의 IP정보로 대체하는 포맷이다.

     
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" realiplog

    CustomLog "...생략..." realiplog
     


    그러나 두번째줄의 LogFormat 설정을 하더라도 여러가 발생했을 경우 error log에는 여전히 Proxy IP가 남게 된다. 또한 웹프로그램에서는 클라이어트 IP을 알아야 할 경우 X-Forwarded-For를 매번 확인해야하는 불편함이 있다.


    1. mod_rpaf 모듈이 하는 일

     * mod_rpaf모듈의 역할

    proxy 서버 IP나 장비 IP를 -> X-Forwarded-For 등의 헤더에 담긴 IP로 변환하여 웹서버에 넘겨준다.
     


    아파치용 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명령으로 컴파일한다. (설치 방법은 해당 페이지를 참고 할 것)

     
    # apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
     


    모듈이 로딩되도록 설정한다.

     LoadModule rpaf_module        modules/mod_rpaf-2.0.so
     


    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 를 추가하고 컴파일한다.

     
    # cd /usr/ports/www/mod_rpaf2/
    # make install clean
     


    모듈이 로딩되도록 설정한다.

     LoadModule rpaf_module        libexec/apache22/mod_rpaf.so
     



    3. mod_rpaf 설정

    apache 설정 예이다.

     
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 10.10.123.3
    RPAFheader X-Forwarded-For
     


    https://github.com/gnif/mod_rpaf 에서 모듈을 받아 설치한 경우 설정이 조금 다르니 주의할 것
     RPAFenable      -> RPAF_Enable
    RPAFproxy_ips   -> RPAF_ProxyIPs
    RPAFheader      -> RPAF_Header
    RPAFsetHostname -> RPAF_SetHostName
     


    - 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 일 때 다음과 같이 로그가 남는다.

     
    1) access log
    111.111.111.1 - - [01/Feb/2010:08:26:48 +0900] "GET / HTTP/1.1" 200 25276 "-" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100125 Ubuntu/9.04 (jaunty) Firefox/3.6"

    2) error log
    [Mon Feb 01 11:31:46 2010] [error] [client 111.111.111.1] File does not exist: /home/cnx/public_html/a.html
     


    예 2) 웹서버에 접속한 IP가 222.222.222.2(RPAFproxy_ips에 설정하지 않은 IP)이고, X-Forwarded-For헤더가 111.111.111.1 일때, IP변환없이 그대로 남는다.

     
    222.222.222.2 - - [01/Feb/2010:08:26:48 +0900] "GET / HTTP/1.1" 200 25276 "-" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100125 Ubuntu/9.04 (jaunty) Firefox/3.6"
     



    4. 시트릭스 넷스케일러에서 Use Source IP를 쓰지 않을 때

    System -> Settings -> Modes 를 클릭하면 'Use Source IP'설정이 있다.



    1) 체크를 하면, 실제 접속한 클라이언트(PC) IP정보를 그대로 하단 웹서버로 넘겨준다. 웹서버에서 해줄 것은 아무 것도 없다.
    2) 체크를 해제하면, 시트릭스 장비의 IP를 넘겨준다. 이때 지정한 헤더에 클라이언트 real IP정보가 담겨있다. 시트릭스 넷스케일러에서 클라이언트 IP를 담을 헤더명은 다음과 같이 설정한다.

     
    set service -cip ENABLED Client-IP
     


    아파치에서 설정은 위에서 했던 것과 똑같다. RPAFproxy_ips에는 시트릭스 장비 IP를, RPAFheader에는 시트릭스에서 설정한 HTTP 헤더명을 적어준다.

     
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 10.10.123.3
    RPAFheader Client-IP
     


    5. nginx에서

     
    set_real_ip_from  10.10.10.10;
    real_ip_header    X-Forwarded-For;
     


    자세한 설정은 다음 글의 '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
      커피닉스 카페 최근 글
    [03/25] на каком носителе л
    [03/25] mega darknet маркет
    [03/25] mega площадка
    [03/25] mega даркнет
    [03/22] Cool + for the post
    [03/21] Каждому Ку, tell ac
    [03/19] omg ссылка
    [03/19] с сложным концом re
    [03/18] don't think anythi
    [03/14] don't think anythi
    [03/12] sova обмен
    [03/11] don't think anythi
    [03/11] омг официальный сай
    [03/10] Оригинальное Зеркал
    [03/09] маркетплейс one min
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~