질문
A 계정의 Private 서버(10.0.0.11)가 Public NAT를 타고, B 계정의 Public ALB를 통해 Private web 서버(10.0.0.22)로 접속합니다. B 계정의 Private web 서버(10.0.0.22) 에서 Client IP (10.0.0.11) 를 확인할 수 있는 방법이 있나요?
Tomcat 기준으로 web 서버에서 "request.getHeader("X-Forwarded-For")" 통해 확인하면 NAT IP 가 나타납니다. 혹시 NAT에서 나갈 때 내부 Client IP를 확인할 수 없도록 설정이 되어 있나요?
답변
NAT를 통하여 나갈 때 원래의 출발지 인스턴스의 IP가 아닌 NAT 된 IP로 변경되어 나가게 됩니다. 이는 NAT의 동작 원리에 의한 것이기에, 일단 NAT를 거치게 되면 IP가 변경되게 되므로 NAT를 거쳐서 출발지 인스턴스의 IP가 보이게 하는 것은 어렵습니다.
그러나 확인이 필요하신 경우에는 VPC flow logs를 통해 가능합니다.
그리고 NAT 장비는 4계층에서 동작하기에 Application 단의 정보는 포함이 되지 않습니다. 따라서, 혹시라도 목적지 웹서버에서 출발지 인스턴스의 IP를 x-forwarded-for 헤더를 통해 확인하시려면, 출발지 인스턴스에서 처음부터 수동으로 추가를 하는 방법이 있을 수 있습니다.
예를 들어 curl 명령시, curl -H "X-Forwarded-For: 1.1.1.1" your.alb.domain
과 같은 예시의 명령어를 보낼 시 목적지 인스턴스에서 tcpdump
로 패킷을 확인하면 헤더에 아래와 같은 X-Forwarded-For 값을 확인하실 수 있습니다.
Append mode 사용 시 > X-Forwarded-For: 1.1.1.1, your.alb.domain. node IP
Preserve mode 사용 시 > X-Forwarded-For: 1.1.1.1
Remove mode 사용 시 > X-Forwarded-For 헤더 보이지 않음
혹시라도 이런 방법이 아닌 출발지 인스턴스 자체 내에서의 설정을 통해 목적지 인스턴스로의 모든 https(s) 통신에 X-Forwarded-For 헤더를 추가하시기를 원하신다면 시스템 구성 상황에 맞게 직접 구성하셔야 합니다.