
NAT Gateway 완전 정복: '나는 나갈 수 있지만, 넌 들어올 수 없어'의 원리
프라이빗 서브넷의 서버가 인터넷에서 업데이트를 받아야 한다. 하지만 외부에서는 접근할 수 없어야 한다. 이 모순을 해결하는 NAT Gateway — 작동 원리, 비용 함정, 대안까지를 쉽고 자세하게 풀어본다.

프라이빗 서브넷의 서버가 인터넷에서 업데이트를 받아야 한다. 하지만 외부에서는 접근할 수 없어야 한다. 이 모순을 해결하는 NAT Gateway — 작동 원리, 비용 함정, 대안까지를 쉽고 자세하게 풀어본다.
이전 VPC 글에서 프라이빗 서브넷의 중요성을 다뤘다. 데이터베이스, 앱 서버는 인터넷에 직접 노출되면 안 되니까 프라이빗 서브넷에 둔다. 완벽하다.
그런데 문제가 생긴다.
프라이빗 서브넷의 EC2 인스턴스가 인터넷에 접근해야 하는 순간이 있다:
yum update, apt upgrade)pip install, npm install)프라이빗 서브넷에는 인터넷 게이트웨이(IGW)로의 라우트가 없다. 그래서 이 서버들은 인터넷에 나갈 수 없다.
퍼블릭 서브넷에 옮기면? 보안이 무너진다. 인터넷에서 누구나 이 서버에 접근할 수 있게 된다.
"외부로 나가는 건 허용하되, 외부에서 들어오는 건 차단할 수 있는 방법은 없을까?"
이것이 NAT(Network Address Translation) 의 핵심 아이디어이고, AWS에서 이를 구현한 것이 NAT Gateway다.
NAT를 가장 쉽게 이해하는 비유: 우편물 전달 대행 서비스.
당신은 비밀 기지(프라이빗 서브넷)에 살고 있다. 집 주소를 외부에 알려주면 안 된다. 하지만 인터넷 쇼핑은 하고 싶다.
핵심: 나가는 요청의 출발지 IP를 NAT의 공개 IP로 바꾸고, 돌아오는 응답을 원래 요청자에게 전달한다. 외부에서 보면 NAT Gateway의 IP만 보인다. 프라이빗 서브넷의 실제 IP(10.0.x.x)는 절대 노출되지 않는다.
NAT는 원래 IPv4 주소 부족 문제를 해결하기 위해 탄생했다. IPv4 주소는 약 43억 개뿐인데, 인터넷에 연결되는 기기는 수백억 개다.
1994년, IETF(Internet Engineering Task Force)는 RFC 1631에서 NAT를 공식 표준으로 정의했다. 핵심 아이디어: 사설 IP(10.x.x.x, 192.168.x.x)를 내부에서 쓰고, 인터넷에 나갈 때만 공인 IP로 변환한다.
가정의 와이파이 공유기도 NAT를 사용한다. 집 안의 스마트폰, 노트북, TV가 모두 사설 IP(192.168.0.x)를 쓰지만, 인터넷에서 보면 공유기의 공인 IP 하나로 나간다.
AWS에서 프라이빗 서브넷의 인터넷 접근을 구현하는 방법은 두 가지다:
이것이 NAT Gateway의 가장 큰 논쟁 포인트다.
고가용성을 위해 AZ 2개에 NAT Gateway를 배치하면 **시간 비용만 월 4.50 추가.
소규모 스타트업에서는 EC2 + RDS + Lambda 비용을 합친 것보다 NAT Gateway가 더 비싼 경우가 흔하다.
프라이빗 서브넷의 EC2가 https://pypi.org에서 Python 패키지를 설치하는 경우:
프라이빗 서브넷의 라우트 테이블:
| 목적지 | 타겟 | 의미 |
|---|---|---|
| 10.0.0.0/16 | local | VPC 내부 통신은 직접 |
| 0.0.0.0/0 | nat-gw-xxxxx | 나머지 모든 트래픽은 NAT Gateway로 |
퍼블릭 서브넷의 라우트 테이블:
| 목적지 | 타겟 | 의미 |
|---|---|---|
| 10.0.0.0/16 | local | VPC 내부 통신은 직접 |
| 0.0.0.0/0 | igw-xxxxx | 나머지 모든 트래픽은 인터넷 게이트웨이로 |
차이점: 프라이빗은 0.0.0.0/0 → NAT Gateway, 퍼블릭은 0.0.0.0/0 → IGW.
NAT Gateway 비용의 가장 큰 부분은 데이터 전송비다. AWS 서비스와의 통신을 NAT가 아닌 VPC Endpoint로 우회하면 비용이 대폭 줄어든다.
| AWS 서비스 | Endpoint 유형 | 비용 | 효과 |
|---|---|---|---|
| S3 | Gateway Endpoint | 무료 | S3 트래픽을 NAT에서 분리 |
| DynamoDB | Gateway Endpoint | 무료 | DynamoDB 트래픽 분리 |
| ECR | Interface Endpoint | ~$7/월 | Docker Pull 트래픽 분리 |
| CloudWatch | Interface Endpoint | ~$7/월 | 로그/메트릭 전송 분리 |
| SQS | Interface Endpoint | ~$7/월 | 메시지 큐 트래픽 분리 |
개발/테스트 환경이나 트래픽이 적은 서비스에서는 NAT Instance가 10배 저렴하다.
# fck-nat: 커뮤니티가 만든 경량 NAT Instance AMI
# t4g.nano (~$3/월)로 NAT 기능 수행
fck-nat (커뮤니티 오픈소스)는 NAT Gateway의 높은 비용에 대한 커뮤니티의 대답이다. ARM 기반 t4g.nano 인스턴스에서 동작하며, 월 $3 미만으로 NAT 기능을 제공한다.
프로덕션에서는 AZ별로 NAT Gateway가 필요하지만 (한 AZ의 NAT가 죽으면 해당 AZ의 프라이빗 서브넷이 인터넷 불가), 개발/테스트 환경에서는 AZ 하나에만 NAT Gateway를 두고 다른 AZ의 트래픽을 여기로 보내면 비용이 절반.
가장 근본적인 해결: NAT 자체가 불필요한 아키텍처를 설계.
| 접근 방식 | 설명 |
|---|---|
| VPC Endpoint 최대 활용 | AWS 서비스와의 통신에 NAT 불필요 |
| Lambda (VPC 밖) | Lambda를 VPC에 연결하지 않으면 NAT 불필요 |
| ECR Pull through cache | ECR에 이미지를 캐시하여 Docker Hub 직접 접근 불필요 |
| SSM Agent 기반 접근 | SSH 대신 SSM으로 접속하면 NAT 불필요 |
흔한 오해: "NAT가 있으니까 안전하다." NAT는 주소 변환 기술이지 보안 기술이 아니다. 보안은 보안 그룹, NACL, WAF가 담당한다.
하지만 NAT의 주소 변환 자체가 부수적으로 보안 효과를 준다:
| 구성 요소 | 방향 | 역할 | 위치 |
|---|---|---|---|
| 인터넷 게이트웨이(IGW) | 양방향 | VPC ↔ 인터넷 연결 | VPC 레벨 |
| NAT Gateway | 아웃바운드만 | 프라이빗 → 인터넷 (주소 변환) | 퍼블릭 서브넷 |
| VPC Endpoint | 내부 전용 | VPC → AWS 서비스 (인터넷 불필요) | VPC 레벨 |
| Bastion Host | 인바운드 (SSH) | 관리자 → 프라이빗 서버 접속 | 퍼블릭 서브넷 |
| VPN Gateway | 양방향 | 회사 네트워크 ↔ VPC | VPC 레벨 |
| Transit Gateway | 양방향 | VPC ↔ VPC, VPC ↔ 온프레미스 | 리전 레벨 |
| 기준 | NAT Gateway | NAT Instance |
|---|---|---|
| 관리 | AWS 관리 (패치, 가용성) | 직접 관리 (OS 패치, 장애 대응) |
| 대역폭 | 최대 100Gbps (자동 확장) | 인스턴스 타입에 따라 (t4g.nano: ~5Gbps) |
| 가용성 | AZ 내 자동 이중화 | 직접 이중화 구성 필요 |
| 비용 (시간) | 32/월) | t4g.nano: ~$3/월 |
| 비용 (데이터) | $0.045/GB | EC2 네트워크 비용만 |
| 보안 그룹 | 적용 불가 (NACL만) | 보안 그룹 적용 가능 |
| 포트 포워딩 | 불가 | 가능 (iptables) |
| 모니터링 | CloudWatch 자동 | 직접 설정 |
| 추천 환경 | 프로덕션 | 개발/테스트, 소규모 |
각 AZ의 프라이빗 서브넷은 같은 AZ의 NAT Gateway를 사용한다. AZ-a의 NAT Gateway가 죽어도, AZ-c의 서비스는 영향을 받지 않는다.
퍼블릭 서브넷 (AZ-a만): NAT Gateway 1개
프라이빗 서브넷 (AZ-a, AZ-c): 모두 AZ-a의 NAT GW 사용
비용이 절반이지만, AZ-a의 NAT Gateway가 죽으면 모든 프라이빗 서브넷이 인터넷 접근 불가. 개발/테스트 환경에서만 사용.
한 시드 단계 스타트업의 실제 사례:
VPC Endpoint(S3, ECR)를 추가하고 데이터 전송 패턴을 개선한 후: NAT 비용 38 (60% 절감).
Netflix는 수천 대의 EC2에서 외부 API(결제, CDN origin fetch)를 호출한다. NAT Gateway의 100Gbps 대역폭 한계에 가까워지는 경우를 대비해, 여러 NAT Gateway에 트래픽을 분산하고 VPC Endpoint를 적극 활용한다.
IPv6에서는 주소가 사실상 무한하므로 NAT 자체가 불필요해진다. 모든 기기가 고유한 공인 IPv6 주소를 가질 수 있다.
AWS는 IPv6 전용 서브넷과 Egress-only Internet Gateway(IPv6에서의 NAT 역할)를 지원한다. 장기적으로 IPv6 전환이 완료되면 NAT Gateway는 사라질 수 있다. 하지만 IPv4가 여전히 지배적인 현재, NAT Gateway는 당분간 필수다.
현재 NAT Gateway에는 보안 그룹을 적용할 수 없다 (NACL만 가능). AWS 커뮤니티에서 가장 많이 요청하는 기능 중 하나가 "NAT Gateway에 보안 그룹 지원"이다. 아웃바운드 트래픽의 목적지를 세밀하게 제어하고 싶은 수요가 크다.
NAT Gateway의 본질을 한 문장으로: "프라이빗 서브넷의 리소스가 인터넷에 나갈 수는 있지만, 인터넷에서 들어올 수는 없게 해주는 것."
이 시리즈에서 구축한 아키텍처에서 NAT Gateway의 위치:
| 서비스 | NAT 필요 여부 | 이유 |
|---|---|---|
| ALB | ✗ | 퍼블릭 서브넷에 위치 |
| EC2/ECS (앱 서버) | ✓ | 외부 API 호출, 패키지 설치 |
| RDS | △ | 보통 불필요 (AWS 내부 통신은 VPC Endpoint) |
| Lambda (VPC 연결 시) | ✓ | 외부 API 호출 |
| Lambda (VPC 미연결) | ✗ | 기본적으로 인터넷 접근 가능 |
NAT Gateway는 필수지만 비싸다. VPC Endpoint를 먼저 최대한 활용하고, 정말 인터넷이 필요한 트래픽만 NAT를 거치게 하는 것이 비용 최적화의 핵심이다.
코어닷투데이의 인프라에서도 이 원칙을 따른다. AI 추론 서버는 프라이빗 서브넷에서 안전하게 운영되고, S3와 DynamoDB는 Gateway Endpoint로 직접 접근하며, 외부 AI API 호출만 NAT Gateway를 통과한다. 보안과 비용의 균형 — 이것이 실전 NAT 전략이다.