[Daily morning study] NAT와 포트 포워딩
#daily morning study
NAT(Network Address Translation)란?
NAT는 IP 패킷의 헤더에 있는 출발지 또는 목적지 IP 주소를 변환하는 기술이다. 주로 사설 IP 주소를 공인 IP 주소로 바꿔주거나 그 반대 방향으로 변환하는 데 쓴다.
NAT가 필요한 이유:
- IPv4 주소 고갈 — 전 세계 공인 IP는 약 43억 개뿐이다. NAT 덕분에 하나의 공인 IP를 수십, 수백 대의 내부 장치가 공유할 수 있다.
- 보안 — 내부 네트워크 구조가 외부에 직접 노출되지 않아 기본적인 방화벽 역할을 한다.
NAT 동작 방식
집 공유기를 예로 들면 이렇다.
내부 장치 (192.168.0.10:5000)
↓ 출발지 IP/포트 교체
공유기 NAT (공인 IP 203.0.113.1:54321)
↓
인터넷 서버 (93.184.216.34:80)
공유기는 NAT 변환 테이블을 유지한다.
| 내부 IP:포트 | 공인 IP:포트 | 목적지 IP:포트 |
|---|---|---|
| 192.168.0.10:5000 | 203.0.113.1:54321 | 93.184.216.34:80 |
| 192.168.0.11:6000 | 203.0.113.1:54322 | 93.184.216.34:443 |
응답 패킷이 돌아오면 공인 IP:포트를 보고 원래 내부 장치에게 전달한다.
NAT 종류
1. Static NAT (정적 NAT)
공인 IP와 사설 IP를 1:1로 고정 매핑한다. 내부 서버를 외부에 직접 노출시킬 때 쓴다.
203.0.113.1 ←→ 192.168.0.10 (항상 고정)
2. Dynamic NAT (동적 NAT)
공인 IP 풀(pool)에서 가용한 주소를 동적으로 할당한다. 사용이 끝나면 다시 풀로 반납한다. 공인 IP가 여러 개지만 내부 장치 수보다 적을 때 사용한다.
3. PAT / NAPT (포트 주소 변환, IP 마스커레이딩)
실제로 가장 널리 쓰이는 방식이다. 하나의 공인 IP에 포트 번호를 달리해 여러 내부 장치를 동시에 연결한다. 가정용 공유기가 정확히 이 방식으로 동작한다.
192.168.0.10:5000 → 203.0.113.1:54321
192.168.0.11:5000 → 203.0.113.1:54322 (같은 포트도 공인 측 포트로 구분)
192.168.0.12:5000 → 203.0.113.1:54323
포트 포워딩(Port Forwarding)
포트 포워딩은 외부에서 들어오는 특정 포트 요청을 내부 서버의 특정 IP:포트로 전달하는 설정이다. DNAT(Destination NAT)의 일종이다.
외부 클라이언트
→ 203.0.113.1:8080 요청
공유기/방화벽 (포트 포워딩 규칙 적용)
→ 192.168.0.100:80 으로 전달
활용 사례
- 집에서 운영하는 웹 서버, 게임 서버 외부 접근
- SSH 접속 포트 변경 노출 (외부 22222 → 내부 22)
- NAS, IP 카메라 원격 접근
iptables로 포트 포워딩 설정하기 (Linux)
# 외부 8080 포트를 내부 192.168.0.100:80으로 포워딩
iptables -t nat -A PREROUTING -p tcp --dport 8080 \
-j DNAT --to-destination 192.168.0.100:80
# NAT 마스커레이딩 활성화 (SNAT)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# IP 포워딩 커널 설정 활성화
echo 1 > /proc/sys/net/ipv4/ip_forward
NAT의 한계
P2P 통신 문제
NAT 뒤에 있는 두 장치가 서로 직접 통신하려면 어렵다. 둘 다 사설 IP만 가지고 있어서 상대방에게 직접 패킷을 보낼 방법이 없기 때문이다. 화상통화, 온라인 게임, WebRTC 등이 이 문제를 겪는다.
NAT Traversal
P2P 통신 문제를 해결하는 기법들이다.
STUN(Session Traversal Utilities for NAT)
- 클라이언트가 공개 서버에 요청을 보내 자신의 공인 IP:포트를 파악한다.
- 두 클라이언트가 공인 IP:포트를 교환한 뒤 직접 연결을 시도한다.
- Full Cone NAT처럼 개방적인 NAT 유형에서는 잘 동작하지만, Symmetric NAT에서는 실패한다.
TURN(Traversal Using Relays around NAT)
- 중계 서버가 두 클라이언트 사이의 트래픽을 대신 전달한다.
- STUN이 실패할 때의 폴백 방법이다. 대역폭과 지연이 늘어난다.
ICE(Interactive Connectivity Establishment)
- STUN과 TURN을 조합해 최선의 연결 경로를 찾는 프레임워크다.
- WebRTC가 내부적으로 ICE를 사용한다.
정리
| 개념 | 핵심 역할 |
|---|---|
| Static NAT | 공인 IP ↔ 사설 IP 1:1 고정 매핑 |
| Dynamic NAT | IP 풀에서 동적 매핑 |
| PAT / NAPT | 하나의 공인 IP + 포트 번호로 다대일 매핑 (가장 일반적) |
| 포트 포워딩 | 외부 요청을 특정 내부 서버로 전달 (DNAT) |
| STUN | NAT 뒤 클라이언트가 자신의 공인 주소를 알아내는 프로토콜 |
| TURN | P2P 불가 시 중계 서버를 경유하는 방법 |
NAT는 IPv4 주소 부족이라는 현실적인 문제를 해결하기 위해 보편화된 기술이다. 덕분에 수십억 대의 장치가 인터넷에 연결될 수 있었지만, P2P 통신 복잡성이라는 부작용도 가져왔다. IPv6가 보급되면 NAT 없이도 모든 장치에 고유 공인 IP를 부여할 수 있어 이 문제가 근본적으로 해소된다.