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 |