[ELB] AWS NLB 클라이언트 IP 주소 보존(Client IP Preservation)
AWS NLB 클라이언트 IP 주소 보존(Client IP Preservation)
AWS 의 ELB(Elastic Load Balancer) 중 Network Load Balancer에서 제공하는 IP Preservation 기능 즉, 클라이언트가 Load Balancer 를 통과 후 Target Server 에 접속하는 경우에도 클라이언트의 소스 IP 가 보존되는 기능에 대해 확인하고자 합니다.
NLB는 요청을 백엔드 대상으로 라우팅할 때 클라이언트의 소스 IP 주소를 보존할 수 있습니다. 클라이언트 IP 보존을 비활성화하면 NLB의 프라이빗 IP 주소가 모든 수신 트래픽에 대한 클라이언트 IP 주소가 됩니다.
기본적으로, 클라이언트 IP 보존은 UDP 및 TCP_UDP 프로토콜을 사용하는 인스턴스와 IP 유형 대상 그룹에 대해 활성화되며, 비활성화할 수 없습니다. 그러나 preserve_client_ip.enabled 대상 그룹 속성을 사용하여 TCP 및 TLS 대상 그룹에 대한 클라이언트 IP 보존을 활성화하거나 비활성화할 수 있습니다.
- 인스턴스 유형 대상 그룹: Preserve client IP address 활성화됨
- IP 유형 대상 그룹(UDP, TCP_UDP): Preserve client IP address 활성화됨
- IP 유형 대상 그룹(TCP, TLS): Preserve client IP address 비활성화됨
NLB를 이용하여 대상을 등록할 때 등록하는 대상이 인스턴스 기반인지 혹은 IP 기반인지에 따라 기본값으로 설정되어 있는 “Preserve client IP address” 의 값이 달라집니다. 그리고 이 값이 “Disabled(비활성화)” 인 경우에는 NLB를 통과하더라도 소스 IP 는 NLB의 Endpoint IP 로 변경되어 대상으로 전달되게 됩니다.
요구사항 및 고려사항
∙ EKS 환경에서 서비스(NLB)에서 IP 유형 사용 시 Client IP preservation 동작을 하지 않습니다
∙ 클라이언트 IP 보존이 활성화되면 대상은 Network Load Balancer와 동일한 VPC에 있어야 하며 트래픽은 NLB에서 대상으로 직접 유입되어야 합니다.
∙ 대상이 NLB와 동일한 Amazon VPC에 있더라도 GLB 엔드포인트를 통해 NLB와 대상(인스턴스 또는 IP) 사이의 트래픽을 검사하면 클라이언트 IP 보존이 지원되지 않습니다.
∙ 다음 인스턴스 유형, C1, CC1, CC2, CG1, CG2, CR1, G1, G2, HI1, HS1, M1, M2, M3, T1은 클라이언트 IP 보존을 지원하지 않습니다. 이러한 인스턴스 유형은 클라이언트 IP 보존이 비활성화된 IP 주소로 등록하는 것이 좋습니다.
∙ 클라이언트 IP 보존은 AWS PrivateLink로부터의 인바운드 트래픽에 영향을 주지 않습니다. AWS PrivateLink 트래픽의 소스 IP는 항상 NLB의 프라이빗 IP 주소입니다.
∙ 대상 그룹에 AWS PrivateLink ENI나 다른 NLB ENI가 포함된 경우에는 클라이언트 IP 보존이 지원되지 않습니다. 이로 인해 해당 대상과의 통신이 중단됩니다.
∙ 클라이언트 IP 보존은 IPv6에서 IPv4로 변환된 트래픽에 영향을 주지 않습니다. 이 트래픽 유형의 소스 IP는 항상 NLB의 프라이빗 IP 주소입니다.
∙ ALB 유형별로 대상을 지정하면 수신되는 모든 트래픽의 클라이언트 IP가 NLB에 의해 보존되고 ALB에 전송됩니다. 그런 다음 Application Load Balancer는 클라이언트 IP를 대상으로 보내기 전에 X-Forwarded-For 요청 헤더에 첨부합니다.
∙ 클라이언트 IP 보존의 변경 사항은 새 TCP 연결에만 적용됩니다.
클라이언트 IP 주소 보존(Client IP Preservation) 활성화
- 외부에서는 NLB의 퍼블릭 도메인(공인IP)로 접속하면, 대상(타켓 EC2)의 IP로 DNAT(목적지 IP 변환)하여 전달
- 클라이언트 IP 주소 보존 활성화 상태이므로, 외부 클라이언트의 IP 주소를 대상(타켓 EC2)에서 확인 가능
클라이언트 IP 주소 보존(Client IP Preservation) 비활성화
- NLB에서 대상(타켓 EC2)로 전달 시, 출발지 IP 주소를 NLB의 내부 ENI(IP)로 SNAT(출발지 IP 변환)하여 전달
- 클라이언트 IP 주소 보존 비활성화 상태이므로, 외부 클라이언트의 IP 주소를 대상(타켓 EC2)에서 확인 불가능
※ EKS 환경에서 NLB 클라이언트 IP 주소 보존(Client IP Preservation) 비활성화하는 이유
1. Pod 간 IP 충돌 방지:
Kubernetes 클러스터 내에서 여러 파드가 실행될 때, 클라이언트 IP 보존을 사용하면 NLB의 로드 밸런서가 여러 파드 사이에서 클라이언트 IP를 전달하려고 시도할 수 있습니다. 이는 IP 충돌이 발생할 수 있는 위험이 있습니다. 비활성화하면 NLB는 로드 밸런싱된 트래픽에 대해 새로운 소스 IP를 생성하여 각각의 파드에 전달합니다.
2. 안정성 및 확장성:
클라이언트 IP 보존을 사용하면 로드 밸런서가 패킷을 특정 파드로 전달할 때 해당 파드가 일시적으로 실패하면 재시도가 어려울 수 있습니다. 비활성화하면 NLB는 각 요청에 대해 새로운 파드를 선택하므로 실패한 파드에 영향을 받지 않고 안정성과 확장성을 향상시킬 수 있습니다.
3. 사용자 지정 헤더 및 프로토콜 지원:
클라이언트 IP를 보존하면 NLB가 특정 헤더 또는 프로토콜과 함께 작동하는 경우 제약 사항이 발생할 수 있습니다. 클라이언트 IP를 보존하지 않으면 NLB가 다양한 사용자 지정 구성을 지원하기 쉬워집니다.
4. 보안 고려:
일부 시나리오에서는 클라이언트 IP를 노출하지 않고 로드 밸런서 뒤의 서비스에 트래픽을 전달하는 것이 보안 상의 이점이 있을 수 있습니다. 클라이언트 IP를 숨기면 서비스 뒤의 파드 또는 노드에 대한 추가 보안 계층을 설정할 수 있습니다.
[참고]
- https://cloudguardians.medium.com/aws-nlb-ip-preservation-ip-%EB%B3%B4%EC%A1%B4-2115ef3b6622
- https://gasidaseo.notion.site/AWS-NLB-Client-IP-Proxy-protocol-57827e2c83fc474992b37e65db81f669