1. 개요

HAProxy에서 listen 절에서 별도 설정하지 않으면 x-forwarded-for 헤더에 클라이언트 IP를 실어보내지 않는다.

XFF에 대한 내용은 여기에 자세히 정리되어 있다.


2. 설정

 option forwardfor를 추가한다.

listen http-in
        bind *:80
        server server1 192.168.30.161:80 maxconn 32
        option forwardfor

 위의 option forwardfor만 추가하면 뒷단에서 클라이언트 IP를 확인할 수 있다.


3. 테스트

3-1. option forwardfor 있을 때 뒷단의 아파치 서버의 access.log

10.10.10.10 127.0.0.1 - - [17/Apr/2019:01:41:36 +0000] "GET / HTTP/1.1" 200 10 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"

3-2. option forwardfor 없을 때 (주석으로 막음) 뒷단의 아파치 서버의 access.log

- 127.0.0.1 - - [17/Apr/2019:01:44:54 +0000] "GET / HTTP/1.1" 200 10 "-" "curl/7.61.1"

4. Tomcat에서 X-Forwarded-for 필드 값 얻기

HAProxy - Apache - Tomcat 구조일 때 Tomcat에서 클라이언트 IP 값을 확인하기 위한 간단한 JSP 코드이다.

<table border="1">
<tr><td>referer</td><td><%=request.getHeader("referer")%></td></tr>
<tr><td>User-agent</td><td><%=request.getHeader("User-agent")%></td></tr>
<tr><td>Remote</td><td><%=request.getRemoteAddr()%></td></tr>
<tr><td>X-Forwarded-For</td><td><%=request.getHeader("X-Forwarded-For")%></td></tr>
</table>

4-1. 기본 호출 시

referer null
User-agent Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
Remote 127.0.0.1
X-Forwarded-For 10.10.10.10

4-2. RemoteValve 설정 후 호출 시

server.xml 파일에 다음 Value 설정 추가.

<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="x-forwarded-for" />

JSP 호출 결과.

referer null
User-agent Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
Remote 10.10.10.10
X-Forwarded-For null