본문으로 건너뛰기
김신건의 로그

[Network] NAT: Network Address Translation

· 수정 · 📖 약 3분 · 1,244자/단어 #network #nat #routing #security
network-nat, NAT, Network Address Translation, 네트워크 주소 변환, SNAT, DNAT, PAT, NAPT

정의

NAT (Network Address Translation) 는 IP 패킷의 헤더에서 소스 또는 목적지 IP 주소(포트 포함)를 변환하는 기법이다. 주로 사설 IP와 공인 IP 간 매핑에 사용된다.

왜 필요한가

flowchart LR
    subgraph Private["사설망 (192.168.0.0/24)"]
        H1["호스트 A\n192.168.0.10"]
        H2["호스트 B\n192.168.0.11"]
        H3["호스트 C\n192.168.0.12"]
    end

    Router["라우터 / NAT 장비\n공인 IP: 203.0.113.5"]
    Internet["인터넷"]

    H1 & H2 & H3 --> Router --> Internet
  • IPv4 주소 고갈: 전 세계 IPv4 주소는 약 43억 개뿐이다. 사내 100대 호스트가 공인 IP 1개를 공유하면 99개를 절약한다.
  • 보안: 내부 호스트의 실제 IP를 외부에 노출하지 않는다.
  • 정책 제어: 특정 내부 서비스만 선택적으로 외부에 노출할 수 있다.

종류

SNAT (Source NAT)

아웃바운드 트래픽의 소스 IP/포트를 공인 IP로 변경한다. 홈 라우터나 AWS NAT Gateway의 기본 동작이다.

sequenceDiagram
    participant H as "호스트\n192.168.1.10:12345"
    participant R as "NAT 라우터\n203.0.113.5"
    participant S as "외부 서버\n1.2.3.4:443"

    H->>R: src=192.168.1.10:12345, dst=1.2.3.4:443
    Note over R: 매핑 테이블 등록\n192.168.1.10:12345 -> 203.0.113.5:54321
    R->>S: src=203.0.113.5:54321, dst=1.2.3.4:443
    S-->>R: src=1.2.3.4:443, dst=203.0.113.5:54321
    Note over R: 매핑 테이블 조회\n203.0.113.5:54321 -> 192.168.1.10:12345
    R-->>H: src=1.2.3.4:443, dst=192.168.1.10:12345

DNAT (Destination NAT)

인바운드 트래픽의 목적지 IP/포트를 내부 서버로 변경한다. 포트 포워딩이 대표적인 예시다.

sequenceDiagram
    participant C as "외부 클라이언트\n8.8.8.8"
    participant R as "NAT 라우터\n203.0.113.5:80"
    participant S as "내부 웹 서버\n192.168.1.10:8080"

    C->>R: dst=203.0.113.5:80
    Note over R: DNAT 규칙 적용\n:80 -> 192.168.1.10:8080
    R->>S: dst=192.168.1.10:8080
    S-->>R: src=192.168.1.10:8080
    R-->>C: src=203.0.113.5:80

사용 예:

  • 웹 서버 포트 포워딩 (공인 :80 -> 내부 :8080)
  • 쿠버네티스 NodePort
  • 로드 밸런서의 VIP(Virtual IP) 처리

PAT (Port Address Translation, NAPT)

포트까지 포함한 매핑으로 한 공인 IP를 여러 내부 호스트가 공유한다. 실제로 대부분의 NAT는 PAT를 의미한다.

내부 주소공인 주소 매핑
192.168.1.10:12345203.0.113.5:1001
192.168.1.11:12345203.0.113.5:1002
192.168.1.10:12346203.0.113.5:1003

포트 번호 공간은 65535개이므로 한 공인 IP로 수만 개의 동시 연결을 처리할 수 있다. 단, 연결이 많아지면 포트 고갈이 발생한다.

NAT 매핑 테이블

NAT 매핑 테이블 (PAT 예시)

| Proto | 내부 IP         | 내부 Port | 외부 IP         | 외부 Port | 상태     | 타임아웃 |
|-------|-----------------|-----------|-----------------|-----------|----------|----------|
| TCP   | 192.168.1.10    | 12345     | 203.0.113.5     | 1001      | ESTABLISHED | 300s  |
| TCP   | 192.168.1.11    | 12345     | 203.0.113.5     | 1002      | TIME_WAIT   | 30s   |
| UDP   | 192.168.1.10    | 54321     | 203.0.113.5     | 2001      | ACTIVE      | 60s   |
  • TCP: 연결 상태(SYN/ESTABLISHED/FIN)를 추적해 매핑 유지
  • UDP: stateless이므로 마지막 패킷 이후 일정 시간 후 만료 (보통 60-300초)
  • ICMP: echo id 기반 매핑

NAT 종류별 동작 차이 (RFC 3489 분류)

타입설명P2P 적합성
Full Cone NAT내부 IP:Port가 외부 IP:Port에 고정 매핑. 누구나 외부 포트로 연결 가능가장 좋음
Restricted Cone NAT내부에서 먼저 통신한 외부 IP만 접근 허용중간
Port Restricted Cone NAT외부 IP + 포트까지 제한어려움
Symmetric NAT목적지마다 다른 포트 할당. 가장 엄격매우 어려움

클라우드에서의 NAT

AWS

flowchart LR
    subgraph PrivateSubnet["프라이빗 서브넷"]
        EC2["EC2 Instance\n10.0.1.10"]
    end
    subgraph PublicSubnet["퍼블릭 서브넷"]
        NATGW["NAT Gateway\n탄력적 IP: 52.x.x.x"]
    end
    IGW["Internet Gateway"]
    Internet["Internet"]

    EC2 --> NATGW --> IGW --> Internet
  • NAT Gateway: AWS 관리형 서비스. 고가용성, 자동 확장. 시간당 + 데이터 전송량 과금.
  • NAT Instance: 직접 관리하는 EC2. 비용 절감 가능하지만 단일 장애점.

실무에서는 NAT Gateway를 권장하며, 비용 절감 시 VPC Endpoint로 S3/DynamoDB 트래픽을 NAT 없이 직접 연결한다.

iptables로 Linux NAT 직접 구성

# SNAT: 내부망 아웃바운드 트래픽을 eth0 IP로 변환
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

# DNAT: 80 포트를 내부 8080으로 포워딩
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \
  --to-destination 192.168.1.10:8080

# 포워딩 활성화
echo 1 > /proc/sys/net/ipv4/ip_forward

# 현재 NAT 테이블 확인
iptables -t nat -L -n -v

NAT Traversal

P2P 통신 (WebRTC, 게임, VoIP)에서 NAT 뒤에 있는 피어끼리 직접 연결을 맺으려면 NAT를 뚫어야 한다.

flowchart TB
    subgraph NAT_A["NAT A (Symmetric)"]
        A["피어 A\n192.168.1.10"]
    end
    subgraph NAT_B["NAT B (Full Cone)"]
        B["피어 B\n10.0.0.5"]
    end
    STUN["STUN 서버\n(공인 IP)"]
    TURN["TURN 서버\n(릴레이)"]

    A -->|"1. 내 공인 IP:Port 확인 요청"| STUN
    STUN -->|"2. 203.0.113.5:54321 응답"| A
    B -->|"1. 내 공인 IP:Port 확인 요청"| STUN
    STUN -->|"2. 198.51.100.1:22345 응답"| B
    A <-->|"3. 직접 연결 시도 (Hole Punching)"| B
    A <-->|"실패 시 릴레이"| TURN
    TURN <-->|"릴레이"| B

STUN (Session Traversal Utilities for NAT)

자신의 공인 IP:포트를 발견하고 NAT 타입을 파악한다. 두 피어가 서로 공인 주소를 교환하고 동시에 패킷을 보내 NAT에 홀을 뚫는다 (UDP Hole Punching). Symmetric NAT 환경에서는 실패할 수 있다.

TURN (Traversal Using Relays around NAT)

STUN으로 직접 연결이 불가능할 때 모든 트래픽을 릴레이 서버를 통해 전달한다. 항상 동작하지만 서버 대역폭 비용이 발생하며 지연이 증가한다.

ICE (Interactive Connectivity Establishment)

WebRTC에서 사용하는 프레임워크. STUN/TURN을 조합해 최적 경로를 자동 선택한다.

ICE Candidate 우선순위:
1. host candidate (직접 연결)
2. server reflexive candidate (STUN을 통한 공인 IP)
3. relay candidate (TURN 릴레이)

실전 예시: AWS VPC NAT 구성

# AWS CLI로 NAT Gateway 생성
# 1. EIP (Elastic IP) 할당
EIP=$(aws ec2 allocate-address --domain vpc --query AllocationId --output text)

# 2. 퍼블릭 서브넷에 NAT Gateway 생성
NATGW=$(aws ec2 create-nat-gateway \
  --subnet-id subnet-public-xxx \
  --allocation-id $EIP \
  --query NatGateway.NatGatewayId --output text)

# 3. 프라이빗 서브넷 라우트 테이블에 NAT Gateway 경로 추가
aws ec2 create-route \
  --route-table-id rtb-private-xxx \
  --destination-cidr-block 0.0.0.0/0 \
  --nat-gateway-id $NATGW

비용 최적화: S3, DynamoDB 트래픽은 VPC Endpoint를 통해 NAT 없이 직접 연결하면 NAT Gateway 비용을 줄일 수 있다.

# S3 VPC Endpoint 생성 (NAT 없이 S3 접근)
aws ec2 create-vpc-endpoint \
  --vpc-id vpc-xxx \
  --service-name com.amazonaws.ap-northeast-2.s3 \
  --route-table-ids rtb-private-xxx

함정

WARNING

  1. NAT 매핑 만료: UDP 연결은 마지막 패킷 후 60-300초면 매핑이 만료된다. WebSocket, 게임 소켓 등 장기 연결은 주기적으로 keep-alive 패킷을 전송해야 한다.
  2. Hairpin NAT 미지원: 내부 호스트가 자기 공인 IP로 접근하면 일부 NAT 장비가 처리 못한다. 192.168.1.10203.0.113.5:80에 접근하려 할 때 반환 경로가 없어 실패한다.
  3. Symmetric NAT와 STUN 조합 불가: 모바일 LTE 망은 Symmetric NAT가 많아 UDP Hole Punching이 실패한다. TURN 릴레이가 필요하다.
  4. 포트 고갈 (Port Exhaustion): 대규모 NAT Gateway에서 연결 수가 포트 수 (65535) 를 초과하면 새 연결이 거부된다. AWS NAT Gateway는 IP당 55000개 동시 연결을 권고한다.
  5. NAT + IPSec 충돌: ESP 프로토콜은 포트가 없어 PAT가 다중 연결을 구분하지 못한다. NAT-T (UDP 캡슐화)로 우회한다.

관련 위키

  • IP - IP 주소 체계
  • CIDR / 서브네팅 - 서브넷 설계
  • WebRTC - NAT Traversal을 활용하는 대표 프로토콜
  • TLS - NAT 뒤에서도 종단간 암호화
  • QUIC - Connection ID로 NAT 재바인딩을 자연스럽게 처리
이 글의 용어 (5개)
[Network] CIDR와 Subnettingnetwork
정의 CIDR (Classless Inter-Domain Routing) 은 IPv4 / IPv6 주소를 prefix length 로 표기하는 표준. 1993년 등장 (RFC 1…
[Network] IP: IPv4, IPv6, CIDRnetwork
정의 IP (Internet Protocol) 주소 는 인터넷에서 노드를 식별하는 논리 주소다. IPv4 (32bit) 와 IPv6 (128bit) 두 버전이 현재 병존한다. I…
[Voice AI] WebRTC: PeerConnection, ICE, STUN/TURN, SFUnetwork
정의 WebRTC = 브라우저 / 모바일 P2P 실시간 미디어 + 데이터 표준. 음성, 비디오, 데이터 채널. 2026 시점 voice agent + 영상 통화 + 화면 공유 의…
QUICnetwork
정의 QUIC (Quick UDP Internet Connections)은 Google이 2012년 처음 제안하고 2021년 RFC 9000으로 표준화된 UDP 기반 전송 프로토…
TLS / SSLnetwork
정의 TLS (Transport Layer Security) 는 (또는 위 ) 위에서 동작하는 암호화·인증 프로토콜이다. SSL 은 TLS 의 전신 (Netscape 1995, …

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기