[Troubleshoot] NAT ErrorPortAllocation 에러
개요
트래픽 급증으로 NAT 지표에서 ErrorPortAllocation 에러를 경험하였다. 이에 대하여 조치 방안들에 대한 정리글이다.
본문
ErrorPortAllocation이란?
(1) IPv4 주소에서 최대 65,535 개의 소스 포트를 사용할 수 있다. 그러나 NAT Gateway 1개당 할당된 동시 연결에서는 55,000개의 포트만 사용할 수 있다. 나머지 약 10,000개의 포트는 AWS의 내부 운영 및 관리 목적으로 예약되어 있어 사용하지 못하도록 내부적으로 설계되어져 있다.
여기서 최대 65,535인 이유에 대해 알아보자.
- TCP/UDP에서는 16비트 포트 번호를 사용하며 65,535 숫자는 16비트(2바이트)로 표현할 수 있는 값의 최댓값이다.
(2의 16승 - 1, 0번포트는 미사용되기 때문에 -1을 한다.)
- 16비트 사용하는 이유는 이는 효율성에 기반한 역사적인 결정에 기반한다. TCP/IP 프로토콜이 개발될 당시, 16비트는 충분히 큰 주소 공간을 제공하면서도 당시의 컴퓨팅 리소스에 부담을 주지 않는 적절한 크기였다고 한다.
(2) 일반적으로 ErrorPortAllocation 지표는 동시 연결 한도를 초과할 때 발생한다. 이 커넥션 한도에 도달하면 NAT 게이트웨이는 더 이상 새로운 연결을 위한 포트를 할당할 수 없으며, 이때 ErrorPortAllocation 메트릭의 카운트가 증가하게 된다.
(3) 이 외에도 Source Port 재사용 지연시간 및 비활성 연결 수의 존재 이유로도 발생한다.
재사용 지연시간: NAT 게이트웨이는 사용한 소스 포트를 일정 시간 동안 재사용하지 않는 대기시간이 존재한다. 이러한 특성으로부터 NAT 여전히 연결이 열린 상태를 유지하게 되며 가용 포트 수를 점유한다.
비활성 연결 수: 연결이 종료되지 않았으나 트래픽이 흐르지 않는 Connection이다.
해결방안
방안 1. 보조 IPv4 주소 추가
각 NAT 게이트웨이에 최대 7개의 보조 IPv4 주소를 추가할 수 있다. 각 보조 IP는 추가로 55,000개의 연결을 제공하며, 한 NAT 게이트웨이에서 최대 440,000개의 동시 연결(55,000 x 8 IPv4 주소)을 처리할 수 있다.
방안 2. 가용영역별 여러 NAT 게이트웨이 사용
각 AZ 별로 NAT 게이트웨이가 가용영역별로 분산 배치가 되지 않는 경우, 분산 배치를 통해 해결을 모색할 수 있다. 또한 AWS에서는 각 가용영역마다 NAT 게이트웨이를 설정을 권장한다. 각 NAT 게이트웨이는 55,000개의 연결을 처리할 수 있으므로, 가용 영역에 추가되는 NAT 게이트별로 55,000개의 리밋이 추가된다.
아래 표는 보조 IPv4 주소를 추가하는 방식과 가용영역별 NAT 게이트웨이를 추가하는 방식에 대한 차이점을 비교한 내용이다.
항목 | 보조 IPv4 추가 | NAT 게이트웨이 추가 |
IP 추가 자체 비용 | 없음 | 추가 NAT 게이트웨이마다 시간당 요금 발생 |
NAT 게이트웨이 시간당 비용 | 기존 NAT 게이트웨이 시간당 요금만 발생 | NAT 게이트웨이 수에 따라 시간당 요금 증가 |
데이터 처리 비용 | NAT 게이트웨이 수량 변화가 없기에 트래픽 처리 요금은 동일 |
NAT 게이트웨이마다 처리되는 트래픽 추가 비용 발생 |
검토사항 1. AWS PrivateLink 및 VPC Endpoints 사용
Amazon S3, DynamoDB와 같이 AWS 내부 통신은 PrivateLink나 VPC Endpoint를 사용하여 NAT 게이트웨이를 거치지 않도록 통신하도록 구성하는 것이다. 이를 통해 NAT 게이트웨이에 점유되는 포트 수를 줄일 수 있다.
검토사항 2. Idle 연결 정리
NAT 게이트웨이에서 IdleTimeoutCount 메트릭을 제공한다. 이를 통해 비활성 연결을 파악할 수 있다.
이를 바탕으로 애플리케이션이 불필요한 비활성 연결을 닫도록 설정하는 것도 NAT 게이트웨이 포트 할당 문제를 완화하는데 도움이 될 수 있다.
Reference
https://repost.aws/knowledge-center/vpc-resolve-port-allocation-errors
댓글