아파치를 톰캣의 Reverse Proxy 설정 시 X-Forwarded-For 헤더가 나타나지 않아 삽질했다 ㅠㅠ


다음과 같이 하면,


    @RequestMapping("/headers")

    public void headers(HttpServletRequest request) {

        for (String headerName : Collections.list(request.getHeaderNames())) {

            log.debug("{}: {}", headerName, request.getHeader(headerName));

        }

    }


x-forwarded-host 헤더와 x-forwarded-server 헤더는 있지만, x-forwarded-for 헤더는 없었다.


아파치에서 x-forwarded-for를 제공하는 것이 mod_proxy_http 모듈 (Module)이니


configure 시 --enable-proxy=shared뿐만 아니라


--enable-proxy-http=shared도 해야하나 해서 했으나 소용없었다.


x-forwarded-host 헤더와 x-forwarded-server 헤더가 이미 제공되고 있었으니


이미 활성화됐던 상태였다.


아파치 설정 문제로 국한시켜 삽질하니 답이 보이질 않았다.


혹시나 해서 다음과 같이 tcpdump로 출력해보니 X-Forwarded-For 헤더가 전달되고 있었다.


sudo /usr/sbin/tcpdump -vvX -i lo "dst port 8080"


결국 톰캣이 먹고 있었던 것이었다.


혹시나 해서 HttpServletRequest 객체의 getRemoteAddr() 메소드를 호출하니


X-Forwarded-For 헤더에 포함된 클라이언트 (Client) IP 주소 (Address)를 반환했다.


이것이 톰캣의 기본 동작인지


스프링 부트 (Spring Boot)의 임베디드 (Embedded) 톰캣의 설정인지는 확인해보지는 않았다.


아마도 스프링 부트?


-----


스프링 부트의 기본 설정인데 1.1.7부터 제거되어 유지하려면,


application.properties에 다음과 같이 명시적으로 설정해줘야만 한다.


server.tomcat.remote_ip_header=x-forwarded-for

server.tomcat.protocol_header=x-forwarded-protocol


References:

http://stackoverflow.com/questions/5610822/convert-enumeration-to-a-set-list

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

http://httpd.apache.org/docs/2.2/programs/configure.html

http://stackoverflow.com/questions/3130911/tcpdump-localhost-to-localhost

http://www.rackspace.com/knowledge_center/article/capturing-packets-with-tcpdump

http://expert-mode.blogspot.kr/2011/09/tcpdump-how-to-capture-full-packet.html

https://github.com/spring-projects/spring-boot/issues/1631

Posted by izeye

댓글을 달아 주세요