[Network] NAT Gateway 란?

NAT Gateway 란?

NAT Gateway는 Network Address Translation의 약자로, 프라이빗 네트워크의 리소스가 인터넷과 통신할 수 있도록 IP 주소를 변환해주는 관리형 네트워크 서비스입니다. 주로 프라이빗 서브넷의 인스턴스들이 외부 인터넷에 접근할 수 있게 하면서도, 외부에서 직접적인 인바운드 연결은 차단하는 역할을 합니다.

NAT의 기본 개념

NAT (Network Address Translation)

NAT는 IP 패킷의 송신지 또는 목적지 IP 주소를 변환하는 기술입니다.

프라이빗 IP → NAT → 퍼블릭 IP
10.0.1.5 → NAT → 203.0.113.5
10.0.1.10 → NAT → 203.0.113.5
10.0.1.15 → NAT → 203.0.113.5

NAT가 필요한 이유

  1. IPv4 주소 고갈 문제 해결

    • 제한된 퍼블릭 IP 주소를 효율적으로 사용
    • 하나의 퍼블릭 IP로 여러 프라이빗 IP 리소스 관리
  2. 보안 강화

    • 내부 네트워크 구조 은닉
    • 외부에서 직접 접근 차단
  3. 유연한 네트워크 구성

    • 내부 IP 체계를 자유롭게 설계
    • 외부 네트워크 변경 시 내부 영향 최소화

NAT Gateway vs NAT Instance

NAT Gateway

AWS, GCP 등 클라우드 제공업체가 관리하는 관리형 서비스

장점:

  • 높은 가용성 (자동 이중화)
  • 자동 확장 (최대 45Gbps)
  • 관리 부담 없음
  • 보안 그룹 불필요

단점:

  • 시간당 과금
  • 데이터 전송량 과금
  • 보안 그룹 미지원
  • Bastion Host로 사용 불가

NAT Instance

사용자가 직접 관리하는 EC2 인스턴스

장점:

  • 비용 절감 가능 (소규모의 경우)
  • 보안 그룹 사용 가능
  • Bastion Host로 활용 가능
  • 커스터마이징 가능

단점:

  • 관리 부담 (패치, 업데이트)
  • 가용성 직접 관리 필요
  • 성능 제한 (인스턴스 타입에 따라)
  • Single Point of Failure 위험

AWS NAT Gateway 아키텍처

기본 구성

┌─────────────────────────────────────────────────┐
│ VPC (10.0.0.0/16) │
│ │
│ ┌────────────────────┐ ┌──────────────────┐ │
│ │ Public Subnet │ │ Private Subnet │ │
│ │ (10.0.1.0/24) │ │ (10.0.2.0/24) │ │
│ │ │ │ │ │
│ │ ┌──────────────┐ │ │ ┌────────────┐ │ │
│ │ │ NAT Gateway │ │ │ │ Instance │ │ │
│ │ │ (Public IP) │◄─┼──┼──│ (Private) │ │ │
│ │ └──────┬───────┘ │ │ └────────────┘ │ │
│ │ │ │ │ │ │
│ └─────────┼──────────┘ └──────────────────┘ │
│ │ │
└────────────┼────────────────────────────────────┘


Internet Gateway


Internet

라우팅 테이블 구성

Public Subnet 라우팅 테이블:

Destination       Target
10.0.0.0/16 local
0.0.0.0/0 igw-xxxxx (Internet Gateway)

Private Subnet 라우팅 테이블:

Destination       Target
10.0.0.0/16 local
0.0.0.0/0 nat-xxxxx (NAT Gateway)

NAT Gateway 동작 방식

아웃바운드 트래픽 흐름

  1. 프라이빗 인스턴스 → 인터넷
    1. Private Instance (10.0.2.10) → 외부 서버 (93.184.216.34)
    Source: 10.0.2.10:50000
    Dest: 93.184.216.34:443

    2. NAT Gateway에서 주소 변환
    Source: 52.1.2.3:10000 (NAT Gateway Public IP)
    Dest: 93.184.216.34:443

    3. 외부 서버로 전송

    4. 응답 수신
    Source: 93.184.216.34:443
    Dest: 52.1.2.3:10000

    5. NAT Gateway에서 역변환
    Source: 93.184.216.34:443
    Dest: 10.0.2.10:50000

    6. Private Instance로 전달

인바운드 트래픽 차단

NAT Gateway는 아웃바운드 연결만 허용하고, 외부에서 시작되는 인바운드 연결은 자동으로 차단됩니다.

❌ Internet → NAT Gateway → Private Instance (불가능)
✅ Private Instance → NAT Gateway → Internet (가능)

NAT Gateway 고가용성 구성

Multi-AZ 구성

┌─────────────────────────────────────────────────────┐
│ VPC │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ AZ-A │ │ AZ-B │ │
│ │ │ │ │ │
│ │ Public Subnet │ │ Public Subnet │ │
│ │ ┌────────────┐ │ │ ┌────────────┐ │ │
│ │ │NAT Gateway │ │ │ │NAT Gateway │ │ │
│ │ │ A │ │ │ │ B │ │ │
│ │ └─────┬──────┘ │ │ └─────┬──────┘ │ │
│ │ │ │ │ │ │ │
│ │ Private Subnet │ │ Private Subnet │ │
│ │ ┌──────────┐ │ │ ┌──────────┐ │ │
│ │ │Instance │────┼──┐ │ │Instance │ │ │
│ │ │ A │ │ │ │ │ B │────┼──┐ │
│ │ └──────────┘ │ │ │ └──────────┘ │ │ │
│ │ │ │ │ │ │ │
│ └──────────────────┘ │ └──────────────────┘ │ │
│ │ │ │
│ 라우팅: NAT-A ───┘ 라우팅: NAT-B ───┘ │
└─────────────────────────────────────────────────────┘

각 가용 영역(AZ)마다 NAT Gateway를 배치하여 고가용성을 확보합니다.

NAT Gateway 설정 (AWS 예시)

1. NAT Gateway 생성

# AWS CLI를 통한 NAT Gateway 생성
aws ec2 create-nat-gateway \
--subnet-id subnet-1234567890abcdef0 \
--allocation-id eipalloc-1234567890abcdef0

2. 라우팅 테이블 설정

# 라우팅 테이블 생성
aws ec2 create-route-table \
--vpc-id vpc-1234567890abcdef0

# NAT Gateway로 가는 라우트 추가
aws ec2 create-route \
--route-table-id rtb-1234567890abcdef0 \
--destination-cidr-block 0.0.0.0/0 \
--nat-gateway-id nat-1234567890abcdef0

# 프라이빗 서브넷과 라우팅 테이블 연결
aws ec2 associate-route-table \
--route-table-id rtb-1234567890abcdef0 \
--subnet-id subnet-0987654321fedcba0

3. Terraform 설정 예시

# Elastic IP 생성
resource "aws_eip" "nat" {
vpc = true

tags = {
Name = "nat-gateway-eip"
}
}

# NAT Gateway 생성
resource "aws_nat_gateway" "main" {
allocation_id = aws_eip.nat.id
subnet_id = aws_subnet.public.id

tags = {
Name = "main-nat-gateway"
}

# Internet Gateway가 먼저 생성되어야 함
depends_on = [aws_internet_gateway.main]
}

# Private 서브넷 라우팅 테이블
resource "aws_route_table" "private" {
vpc_id = aws_vpc.main.id

route {
cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.main.id
}

tags = {
Name = "private-route-table"
}
}

# 라우팅 테이블 연결
resource "aws_route_table_association" "private" {
subnet_id = aws_subnet.private.id
route_table_id = aws_route_table.private.id
}

NAT Gateway 사용 사례

1. 데이터베이스 서버의 외부 통신

프라이빗 서브넷의 RDS → NAT Gateway → 외부 API
  • 보안 패치 다운로드
  • 외부 API 호출
  • 백업 데이터 전송

2. 프라이빗 컴퓨팅 리소스의 인터넷 접근

Lambda (VPC 내부) → NAT Gateway → 외부 서비스
ECS Task (Private) → NAT Gateway → Docker Hub

3. 소프트웨어 업데이트 및 패키지 설치

# 프라이빗 EC2에서 패키지 설치
sudo yum update -y
sudo yum install -y nginx

# NAT Gateway를 통해 yum 저장소 접근

4. 마이크로서비스 아키텍처

Private Subnet:
├─ API Service → NAT Gateway → 외부 결제 API
├─ Worker Service → NAT Gateway → 외부 이메일 서비스
└─ Batch Job → NAT Gateway → 외부 데이터 소스

NAT Gateway vs Internet Gateway

특징 NAT Gateway Internet Gateway
위치 Public Subnet VPC 레벨
주요 역할 Private → Internet Public ↔ Internet
IP 변환 수행 (Private → Public) 수행하지 않음
인바운드 차단 허용
아웃바운드 허용 허용
비용 시간당 + 데이터 전송량 무료 (데이터 전송량만)

비용 최적화 방법

1. NAT Gateway 통합

여러 프라이빗 서브넷이 하나의 NAT Gateway를 공유하도록 설정

Multiple Private Subnets → Single NAT Gateway

2. VPC Endpoint 활용

AWS 서비스 접근 시 NAT Gateway 대신 VPC Endpoint 사용

# S3 VPC Endpoint
resource "aws_vpc_endpoint" "s3" {
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.region.s3"

route_table_ids = [aws_route_table.private.id]
}

비용 절감:

Before: Private Instance → NAT Gateway → S3 (데이터 전송 비용 발생)
After: Private Instance → VPC Endpoint → S3 (비용 없음)

3. 데이터 전송 최소화

  • 불필요한 외부 API 호출 줄이기
  • 캐싱 활용
  • 배치 처리로 요청 횟수 감소

4. NAT Instance 고려

트래픽이 적은 개발/테스트 환경에서는 NAT Instance 사용 검토

모니터링 및 트러블슈팅

CloudWatch 메트릭

# NAT Gateway 모니터링
- BytesInFromDestination: 인터넷 → NAT Gateway
- BytesInFromSource: 프라이빗 서브넷 → NAT Gateway
- BytesOutToDestination: NAT Gateway → 인터넷
- BytesOutToSource: NAT Gateway → 프라이빗 서브넷
- ConnectionAttemptCount: 연결 시도 횟수
- ConnectionEstablishedCount: 성공한 연결 수
- ErrorPortAllocation: 포트 할당 오류
- PacketsDropCount: 드롭된 패킷 수

일반적인 문제 해결

1. 프라이빗 인스턴스가 인터넷 접근 불가

체크리스트:

  • NAT Gateway가 Public Subnet에 있는지 확인
  • Elastic IP가 NAT Gateway에 연결되어 있는지 확인
  • Private Subnet의 라우팅 테이블에 NAT Gateway가 설정되어 있는지 확인
  • 보안 그룹과 Network ACL 확인
# 라우팅 테이블 확인
aws ec2 describe-route-tables --route-table-id rtb-xxxxx

# NAT Gateway 상태 확인
aws ec2 describe-nat-gateways --nat-gateway-ids nat-xxxxx

2. 연결 타임아웃

# NAT Gateway 상태가 'available'인지 확인
aws ec2 describe-nat-gateways \
--nat-gateway-ids nat-xxxxx \
--query 'NatGateways[0].State'

# VPC Flow Logs 확인
aws ec2 describe-flow-logs --filter "Name=resource-id,Values=eni-xxxxx"

3. 포트 할당 오류

NAT Gateway는 하나의 IP에서 약 55,000개의 동시 연결 지원. 초과 시:

  • 여러 NAT Gateway 사용
  • 연결 풀링 최적화
  • 불필요한 연결 종료

보안 모범 사례

1. Network ACL 설정

Inbound Rules (Private Subnet):
- Allow from NAT Gateway IP
- Deny all other

Outbound Rules (Private Subnet):
- Allow to 0.0.0.0/0

2. 최소 권한 원칙

프라이빗 리소스는 필요한 외부 엔드포인트만 접근하도록 제한

3. VPC Flow Logs 활성화

resource "aws_flow_log" "nat_gateway" {
vpc_id = aws_vpc.main.id
traffic_type = "ALL"
iam_role_arn = aws_iam_role.flow_logs.arn
log_destination = aws_cloudwatch_log_group.flow_logs.arn
}

4. 정기적인 모니터링

  • 비정상적인 트래픽 패턴 탐지
  • 비용 이상 증가 알림 설정
  • 연결 실패 로그 검토

NAT Gateway의 장단점

장점

  1. 높은 가용성: 자동으로 이중화되어 단일 장애 지점 제거
  2. 확장성: 자동으로 최대 45Gbps까지 확장
  3. 관리 편의성: 패치, 업데이트 불필요
  4. 보안: 외부에서 시작되는 연결 자동 차단
  5. 성능: 높은 대역폭과 낮은 지연시간

단점

  1. 비용: 시간당 요금 + 데이터 전송 비용
  2. 유연성 제한: 커스터마이징 불가
  3. 보안 그룹 미지원: Network ACL만 사용 가능
  4. 포트 포워딩 불가: 인바운드 연결 설정 불가

참고 자료

Share