이번 포스팅에서는 AWS 의 ELB(Elastic Load Balancer) 중 Network Load Balancer 에서 제공하는 IP Preservation 기능 즉, Client 가 Load Balancer 를 통과 후 Target Server 에 접속하는 경우에도 Client 의 Source IP 가 보존되는 기능에 대해 살펴보려고 합니다. AWS ELB 는 NLB 를 포함한 다양한 종류의 Load Balancer 가 존재합니다. 그리고 각각의 Load Balancer 는 사용자의 목적과 용도에 따라 선택되어 사용될 수 있는데요. 각 Load Balancer 는 부하분산에 사용되는 기술, 지원 프로토콜, Stickiness 등 다양한 항목에서 조금씩 차이를 가지고 있습니다. Source IP 를 보존하는 것 역시 모든 Load Balancer 가 동일한 기능을 제공하는 것이 아니라 차이점이 존재하는데요. Network Load Balancer 는 관리자가 Client 의 Source IP 를 가장 손쉽게 확인할 수 있는 기능을 제공하고 있는데 Network Load Balancer 의 설정에 따라 조금씩 차이가 있어 이 부분에 대해 다뤄보려고 합니다.
Network Load Balancer 에 Target Group 을 등록하는 방법은 여러가지가 있지만 일반적으로 가장 많이 사용하는 방법은 Instance 와 IP 기반으로 등록하는 것입니다.
이 두가지 Target Group 등록 방법은 각각 Preserve client IP address 옵션에 대해 서로 다른 기본값을 가지고 있는데요.
Instance Target 등록 = Preserve client IP address 활성화
IP Address Target 등록 = Preserve client IP address 비활성화
즉, 여러분들이 Network Load Balancer 를 이용하여 Target 을 등록할 때 등록하는 Target 이 Instance 기반인지 혹은 IP Address 기반인지에 따라 기본값으로 설정되어 있는 “Preserve client IP address” 의 값이 달라집니다. 그리고 이 값이 “Disabled(비활성화)” 인 경우에는 Network Load Balancer 를 통과하더라도 Source IP 는 Network Load Balancer 의 Endpoint IP 로 변경되어 Target 으로 전달되게 됩니다.
테스트를 위해서 Amazon Linux EC2 Instance 에 아래와 같은 웹 페이지를 구성한 후 NLB 를 이용하여 인터넷에서 접속이 가능하도록 구성하였습니다.
HTML 을 보시면 아시겠지만 페이지 구성은 간단하게 Source IP 와 Server Name, Instance ID, Availability Zone Code 등을 출력하도록 구성되어 있습니다.
- Instance Target 등록
Instance 기반으로 Target 을 등록하게 되면 아래와 같이 Target Group 의 속성값에서 “Preserve Client IP Address” 가 Enabled 로 되어 있는 것을 확인할 수 있습니다.
등록된 Target 이 Healthy 상태인 것을 확인한 후 NLB 의 DNS 에 접속하면 아래와 같이 정상적으로 페이지에 접속이 가능하며 Client 의 공인 IP 주소가 출력되는 것을 확인할 수 있습니다.
이번에는 모든 설정은 그대로 두고 NLB Target Group 의 속성에서 “Preserve Client IP Address” 값을 “Disabled(비활성화)” 한 후 접속해 보도록 하겠습니다.
속성 값 변경 후 적용되는 데는 몇 분의 시간이 소요될 수 있으므로 어느 정도 시간이 지난 후 동일한 NLB DNS 로 접속하면 아래와 같이 이번에는 동일한 서버에서 Client IP 정보가 사설 IP 주소로 출력되는 것을 확인할 수 있습니다.
2. IP Address Target 등록
이번에는 다른 NLB 를 추가로 생성한 후에 Target Group 을 IP 주소 기반으로 등록해보도록 하겠습니다.
Target Group 을 IP 기반으로 등록한 후 “Preserve Client IP Address” 값을 보면 아래와 같이 “Disabled(비활성화)” 되어 있는 것을 확인할 수 있습니다.
Target Group 에 등록된 인스턴스의 상태가 Healthy 로 된 것을 확인한 후 NLB 의 DNS 주소로 접속하면 아래와 같이 정상적으로 접속이 가능하며 Client IP 주소가 사설 IP 로 출력되는 것을 확인할 수 있는데요. 이 사설 IP 는 NLB 의 Endpoint IP 주소를 나타냅니다.
이번에는 IP 주소 Target Group 의 “Preserve Client IP Address” 값을 활성화하였을 경우 Client IP 주소가 보존되는지를 확인하기 위하여 “Preserve Client IP Address” 값을 아래와 같이 활성화해보도록 하겠습니다.
아래와 같이 “Preserve Client IP Address” 옵션이 활성화된 것을 확인합니다.
속성 값 변경 후 적용되는 데는 몇 분의 시간이 소요될 수 있으므로 어느 정도 시간이 지난 후 동일한 NLB DNS 로 접속하면 아래와 같이 이번에는 동일한 서버에서 Client IP 정보가 Instance Target Group 에서와 마찬가지로 공인 IP 주소로 출력되는 것을 확인할 수 있습니다.
마지막으로 한 가지 테스트를 더 해보도록 하겠습니다. 이번에는 NLB 의 Target 으로 ALB 를 등록해서 진행해볼텐데요. ALB 를 NLB 의 Target Group 으로 등록해서 사용하는 경우는 ALB 에서 Endpoint 에 대한 고정된 IP 를 가질 수 없기 때문에 이러한 제약사항을 극복하기 위해 NLB 를 사용하는 케이스라고 생각하시면 될 것 같습니다.
ALB 를 NLB 의 Target Group 으로 등록한 후 속성값을 확인하면 이전 케이스와는 약간 다르긴 하지만 여전히 “Preserve client IP addresses” 옵션이 존재하고 그 값이 활성화되어 있는 것을 확인할 수 있습니다.
이번 구성에서는 웹서버에 직접 요청을 전달하는 Load Balancer 가 NLB 가 아닌 ALB 이고 ALB 는 무조건 Source IP 를 변경하고 Client IP 의 정보는 X-Forwarded-For Header 에 삽입하도록 동작하기 때문에 Client IP 추적을 위해 Web Server 의 HTML Code 에 아래의 내용을 추가하도록 하겠습니다.
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$xffip = $_SERVER['HTTP_X_FORWARDED_FOR'];<h2>The XFF's IP address is <?php echo $xffip ?></h2>
Target Group 의 상태가 Healthy 인 것을 확인한 후 NBL 의 DNB Name 으로 접속해보면 정상적인 접속이 가능하고 아래와 같은 페이지가 출력되는 것을 확인할 수 있는데요. 즉, IP Header 의 Client IP 값은 ALB 의 Endpoint (사설 IP)이지만 X-Forwarded-For Header 에는 Client IP 의 실제 IP 주소가 존재하는 것을 확인할 수 있습니다.
만일 NLB 가 Source IP 가 변경되었다면 XFF IP 도 사설 IP 로 변경되어 있었을 것입니다.
참고로, ALB 를 Target Group 으로 갖는 NLB 에서는 Target Group 의 속성값을 변경할 수 없습니다.
어떻게 보면 간단한 내용이지만 여러분들이 NLB 를 사용할 때 Target Group 을 어떻게 설정하느냐에 따라 Client IP 보존이 달라질 수 있다는 것을 살펴 보았습니다.
감사합니다.