DB나 백엔드 서버를 프라이빗 서브넷에 숨겨 두면 보안은 좋지만, apt update나 외부 API 호출처럼 나가는 트래픽이 필요할 때 문제가 생깁니다. 외부에서 들어오는 연결은 막되 안에서 나가는 연결만 허용하고 싶을 때 쓰는 것이 NAT 게이트웨이입니다.
IGW와 NAT, 무엇이 다른가
| 구분 | 인터넷 게이트웨이(IGW) | NAT 게이트웨이 |
|---|---|---|
| 방향 | 양방향(인바운드+아웃바운드) | 아웃바운드만 |
| 대상 서브넷 | 퍼블릭 | 프라이빗 |
| 필요한 IP | 인스턴스에 퍼블릭 IP 필요 | 프라이빗 IP만으로 가능 |
| 외부 접근 | 외부에서 직접 접속 가능 | 외부에서 먼저 연결 불가 |
핵심 차이는 연결을 누가 먼저 시작하느냐입니다. NAT는 내부에서 시작한 연결의 응답만 돌려보내므로, 외부 공격자가 프라이빗 인스턴스로 직접 접속하는 경로가 원천 차단됩니다.
트래픽이 흐르는 경로
프라이빗 서브넷의 서버가 외부로 나갈 때 패킷은 이렇게 흐릅니다.
TEXT
프라이빗 EC2 → 프라이빗 라우팅 테이블(0.0.0.0/0 → NAT) → NAT GW(퍼블릭 서브넷) → IGW → 인터넷
NAT 게이트웨이 자체는 퍼블릭 서브넷에 위치하고 IGW를 통해 나갑니다. 그래서 NAT만 두고 IGW가 없으면 외부로 못 나갑니다.
구성 순서
- NAT 게이트웨이를 퍼블릭 서브넷에 생성하고 탄력적 IP(EIP)를 붙입니다. 프라이빗 서브넷에 두면 동작하지 않습니다.
로컬 터미널
aws ec2 create-nat-gateway \
--subnet-id subnet-public-xxxx \
--allocation-id eipalloc-xxxx
- 프라이빗 서브넷의 라우팅 테이블에 기본 경로를 NAT로 향하게 추가합니다.
로컬 터미널
aws ec2 create-route \
--route-table-id rtb-private-xxxx \
--destination-cidr-block 0.0.0.0/0 \
--nat-gateway-id nat-xxxx
- 검증: 프라이빗 인스턴스에서 외부로 나가지는지 확인합니다. 동시에 외부에서 그 인스턴스로 접속이 안 되는지도 봅니다.
로컬 또는 서버
curl -s https://checkip.amazonaws.com # 나가는 트래픽 확인
이때 보이는 IP는 인스턴스가 아니라 NAT의 EIP입니다. 외부 API 화이트리스트에는 이 IP를 등록합니다.
비용 함정 주의
- NAT 게이트웨이는 시간당 요금 + 처리 데이터(GB)당 요금이 모두 붙어, 트래픽이 많으면 비용이 빠르게 늘어납니다.
- 가용영역(AZ)마다 NAT를 따로 두면 안정적이지만 그만큼 비용이 배가됩니다.
- S3·DynamoDB 같은 AWS 서비스는 VPC 엔드포인트로 NAT를 우회하면 데이터 처리 요금을 아낄 수 있습니다.
요점 정리
- NAT는 프라이빗 서브넷의 아웃바운드만 허용하고 인바운드는 막습니다.
- NAT 게이트웨이는 퍼블릭 서브넷에 두고 IGW와 함께 동작합니다.
- 프라이빗 라우팅 테이블의
0.0.0.0/0 → NAT경로가 핵심입니다. - 외부에서 보는 IP는 NAT의 EIP이며, 비용은 VPC 엔드포인트로 절감합니다.
NAT 게이트웨이와 프라이빗 서브넷을 직접 구성하고 트래픽 경로를 확인하는 실습은 클라우드 트랙에서 회원가입 없이 무료로 할 수 있습니다.