Tan Kim

NAT (Network Address Translation)

NAT는 IP 패킷의 출발지/목적지 주소를 변환하는 기술이다. 주로 사설 IP를 공인 IP로 변환하여 인터넷에 연결할 때 사용한다.

등장 배경

IPv4 주소는 약 43억 개로 한정되어 있다. 전 세계 기기 수에 비해 턱없이 부족하기 때문에, 하나의 공인 IP를 여러 기기가 공유하는 방식으로 이 문제를 해결한다.

[공인 IP 1개]
      │
   라우터 (NAT)
   ├── 192.168.1.10  (노트북)
   ├── 192.168.1.11  (스마트폰)
   └── 192.168.1.12  (태블릿)
  • 공인 IP (Public IP): 인터넷에서 유일한 주소, ISP가 할당
  • 사설 IP (Private IP): 내부 네트워크에서만 유효, 인터넷 라우팅 불가

사설 IP 대역

대역 범위
10.0.0.0/8 10.0.0.0 ~ 10.255.255.255
172.16.0.0/12 172.16.0.0 ~ 172.31.255.255
192.168.0.0/16 192.168.0.0 ~ 192.168.255.255

NAT 동작 원리

기본 NAT (1:1 변환)

공인 IP 1개 ↔ 사설 IP 1개를 1:1로 매핑. IP 주소만 변환하고 포트는 유지한다.

NAPT (Network Address Port Translation)

가장 흔히 쓰이는 방식. 공인 IP 1개를 여러 기기가 공유하며, 포트 번호로 기기를 구분한다. 흔히 "NAT"이라 부르면 대부분 NAPT를 의미한다.

송신 (내부 → 외부)
  192.168.1.10:5000 → 구글 DNS 8.8.8.8:53
  NAT 테이블에 기록: (192.168.1.10:5000) ↔ (1.2.3.4:9000)
  패킷 변환: 출발지를 1.2.3.4:9000으로 바꿔서 전송

수신 (외부 → 내부)
  8.8.8.8:53 → 1.2.3.4:9000 수신
  NAT 테이블 조회: 9000 → 192.168.1.10:5000
  패킷 변환: 목적지를 192.168.1.10:5000으로 바꿔서 내부 전달

NAT 테이블

라우터는 변환 정보를 NAT 테이블에 보관한다.

내부 IP:포트 외부 IP:포트 목적지 IP:포트 프로토콜
192.168.1.10:5000 1.2.3.4:9000 8.8.8.8:53 UDP
192.168.1.11:6000 1.2.3.4:9001 142.250.1.1:443 TCP

포트 포워딩 (Port Forwarding)

NAT 환경에서 외부에서 내부 기기로 먼저 접근하려면 포트 포워딩이 필요하다. 라우터에 "이 포트로 오는 패킷은 이 내부 기기로 전달해라"를 미리 등록하는 방식이다.

외부에서 1.2.3.4:8080 접근
  → 라우터: 8080 포트 포워딩 규칙 확인
  → 192.168.1.10:80 으로 전달

홈 서버, NAS, 게임 서버 등 외부에서 접근이 필요한 경우에 사용한다.

NAT 4종류

NAT이 외부에서 들어오는 패킷을 어떻게 처리하느냐에 따라 4가지로 분류한다. 이 차이가 P2P 홀 펀칭 가능 여부를 결정한다.

1. Full Cone NAT

내부 기기가 한 번이라도 외부로 패킷을 보내면, 이후 누구든 그 외부 포트로 보낸 패킷이 내부로 전달된다.

내부: 192.168.1.10:5000 → 외부 포트: 1.2.3.4:9000 매핑
외부 어떤 IP:포트든 → 1.2.3.4:9000 으로 보내면 통과
  • P2P 홀 펀칭: 가능

2. Address Restricted Cone NAT

내가 먼저 패킷을 보낸 IP에서 오는 패킷만 허용. 포트는 따지지 않는다.

내가 8.8.8.8:53 에 패킷 전송
→ 이후 8.8.8.8 에서 오는 패킷은 어떤 포트든 통과
→ 다른 IP(5.5.5.5)에서 오는 패킷은 차단
  • P2P 홀 펀칭: 가능 (양측이 동시에 패킷 전송하면 됨)

3. Port Restricted Cone NAT

내가 먼저 패킷을 보낸 IP + 포트 모두 일치해야 허용.

내가 8.8.8.8:53 에 패킷 전송
→ 이후 8.8.8.8:53 에서 오는 패킷만 통과
→ 8.8.8.8:80 이나 다른 IP는 차단
  • P2P 홀 펀칭: 가능 (양측이 동시에 패킷 전송하면 됨)

4. Symmetric NAT

목적지 IP + 포트가 달라질 때마다 외부 포트를 새로 할당한다. 가장 엄격한 방식.

내가 8.8.8.8:53 에 보낼 때 → 외부 포트 9000 할당
내가 1.1.1.1:53 에 보낼 때 → 외부 포트 9731 할당 (다른 포트!)
내가 8.8.4.4:80 에 보낼 때 → 외부 포트 11204 할당 (또 다른 포트!)

STUN으로 파악한 공개 포트가 실제 피어와 통신할 때는 이미 바뀌어버리기 때문에 홀 펀칭이 실패한다.

  • P2P 홀 펀칭: 불가능 → TURN 릴레이 서버 필요

종류별 비교

NAT 종류 외부 접근 허용 조건 홀 펀칭
Full Cone 누구든 OK 가능
Address Restricted 내가 먼저 보낸 IP 가능
Port Restricted 내가 먼저 보낸 IP + 포트 가능
Symmetric 목적지마다 새 포트 할당 불가

NAT의 한계

외부에서 먼저 접근 불가

NAT 테이블에 항목이 없으면 외부에서 들어오는 패킷은 버려진다. 포트 포워딩이나 NAT 통과 기법이 필요한 이유다.

P2P 연결 어려움

두 기기 모두 NAT 뒤에 있으면 서로 직접 연결이 어렵다. 홀 펀칭, STUN, TURN, ICE 등의 기법으로 해결한다. (자세한 내용은 p2p.md 참고)

애플리케이션 레이어 문제

IP 주소가 페이로드 안에 포함된 프로토콜(FTP, SIP 등)은 NAT 통과 시 추가 처리가 필요하다.

관련 개념

  • STUN / TURN / ICE — NAT 통과 기법 (p2p.md)
  • WireGuard — NAT 뒤 기기 간 VPN 터널링 (wireguard.md)
  • Tailscale — NAT 통과 자동화 메시 VPN (tailscale.md)
  • IPv6 — NAT 없이 모든 기기에 공인 IP 할당하는 차세대 방식

메모

이 글에 대해 물어보기