사설 IP를 공인 IP로 바꿔 여러 장치가 하나의 공인 주소를 나눠 쓰게 하는 기술.
왜 필요했나
IPv4 주소는 32비트 = 약 43억 개 인터넷에 연결되는 기기가 그보다 훨씬 많아졌다
- 집·회사 안에서는 '사설 IP' 를 쓰고
- 밖으로 나갈 때만 공인 IP 하나로 바꿔 준다
사설 IP 대역 (인터넷에서 라우팅되지 않는다)
10.0.0.0/8 (약 1,678만)
172.16.0.0/12 (약 104만)
192.168.0.0/16 (65,536)
어떻게 구분하나 — 포트로
[내부] [NAT 테이블] [외부]
192.168.0.5:51000 ──→ 1.2.3.4:40001 ←→ 93.184.216.34:443
192.168.0.7:51000 ──→ 1.2.3.4:40002 ←→ 93.184.216.34:443
^^^^^ 포트를 다르게 매핑해 구분한다
응답이 오면 포트를 보고 어느 내부 장치로 돌려줄지 판단한다. 정확히는 포트까지 바꾸므로 NAPT(또는 PAT)라고 부른다.
따라오는 제약
-
① 밖에서 안으로 먼저 연결할 수 없다
- NAT 테이블에 항목이 없으면 어디로 보낼지 모른다
- 서버를 열려면 '포트 포워딩' 을 수동 설정해야 한다
-
② P2P 가 어렵다
- 양쪽 다 NAT 뒤에 있으면 서로 먼저 연결할 수 없다
- STUN · TURN · 홀 펀칭 같은 우회 기법이 필요하다
- (WebRTC 가 이 문제를 다루는 대표 사례)
-
③ 종단 간 원칙이 깨진다
- 중간 장비가 주소를 고치므로 "양 끝이 직접 통신한다" 는 인터넷의 원래 설계가 흐려진다
확인해 보기
ip addr # 내 사설 IP
curl ifconfig.me # 밖에서 보이는 공인 IP
# 둘이 다르면 NAT 뒤에 있는 것이다
IPv6는 무엇이 다른가
128비트 — 약 3.4 × 10^38 개
→ 모든 장치에 공인 주소를 줄 수 있다 → NAT 이 원리적으로 불필요
→ 헤더가 단순해지고 중간 라우터의 단편화가 사라졌다
→ 보급이 느린 이유는 NAT 이 '충분히 잘 동작해서' 이기도 하다
면접 함정
- ❌ "NAT은 보안 기능" → 부수 효과로 외부 접근을 막지만 방화벽이 아니다. 보안은 별도로 설계한다.
- ❌ "사설 IP는 인터넷에서 못 쓴다" → 정확히는 라우팅되지 않는다. 내부에서는 정상 동작한다.
NAT 유형과 P2P 난이도
-
Full Cone — 한 번 나가면 아무나 그 포트로 들어올 수 있다 (관대)
-
Restricted — 나갔던 상대 IP 에서만
-
Port Restricted 나갔던 상대 IP·포트에서만
-
Symmetric — 목적지마다 다른 외부 포트를 쓴다 → 홀 펀칭이 거의 불가능 (엄격)
-
양쪽 다 Symmetric 이면 TURN 서버로 트래픽을 중계해야 한다 — 비용이 든다
홀 펀칭의 원리
-
A 와 B 가 모두 NAT 뒤에 있다
-
① 둘 다 시그널링 서버(STUN)에 접속한다 → 각자의 공인 IP:포트가 확인된다
-
② 서버가 서로에게 상대의 주소를 알려 준다
-
③ 동시에 서로에게 패킷을 보낸다
- 나가는 패킷이 각자의 NAT 에 매핑을 만든다
- 상대의 패킷이 그 매핑을 타고 들어온다 (구멍이 뚫린다)
확인 명령
ip addr | grep inet # 사설 IP
curl -s ifconfig.me # 공인 IP
conntrack -L 2>/dev/null | head # 리눅스 NAT 테이블 (iptables/nftables 사용 시)