NAT Traversal이 실제로 작동하는 방식: 숨겨진 장치에 도달하기 위한 실용 가이드
Source: Dev.to
Introduction
인터넷을 거대한 연결 그래프처럼 생각한다면, 실제 상황은 훨씬 더 파편화되어 있습니다. 오늘날 대부분의 장치는 사설 네트워크 내부에 존재하며, 라우터가 수행하는 네트워크 주소 변환(NAT)에 의해 공용 인터넷과 분리됩니다. NAT는 IPv4 주소 부족 문제를 해결했지만, 두 호스트가 별도의 장비 없이 직접 통신할 수 있어야 한다는 원래 설계 아이디어를 깨뜨렸습니다.
NAT Basics
- Original model – 모든 장치가 전역 라우팅 가능한 IPv4 주소를 가지고 있었습니다.
- Problem – 40억 개의 주소만으로는 부족했습니다.
- Solution – NAT는 연결을 추적하고 패킷을 재작성함으로써 다수의 사설 장치가 하나의 공용 IP를 공유하도록 합니다.
- Result –
10.0.0.0/8또는192.168.0.0/16같은 사설 주소대역이 표준이 되었고, 가정용 라우터는 상태 기반 방화벽 역할을 합니다.
How NAT Works
패킷이 로컬 네트워크를 떠날 때 NAT 라우터는 다음을 수행합니다:
- 흐름 엔트리를 기록합니다(다섯 부분 식별자):
- Source IP
- Source Port
- Destination IP
- Destination Port
- Transport Protocol (TCP/UDP)
- Source IP와 포트를 라우터의 공용 주소와 선택된 공용 포트로 재작성합니다.
기존 엔트리와 일치하는 반환 패킷은 통과하도록 허용되고, 그 외의 패킷은 모두 차단됩니다.
Types of NAT Mapping
| Mapping Type | Behavior | Impact on Peer‑to‑Peer |
|---|---|---|
| Endpoint‑independent mapping | 모든 목적지에 대해 동일한 공용 포트를 재사용합니다. | 홀 펀칭에 친화적이며, 피어가 하나의 공용 주소/포트를 공유할 수 있습니다. |
| Endpoint‑dependent (symmetric) NAT | 목적지마다 새로운 공용 포트를 할당합니다. | STUN 서버와 통신할 때 사용된 포트가 피어와의 통신에 재사용되지 않으므로 일반적인 홀‑펀칭이 깨집니다. |
필터링 규칙도 다양합니다: 일부 NAT는 매핑이 존재하는 한 모든 출처의 패킷을 허용하고, 다른 NAT는 원래 원격 IP/포트로 제한합니다.
Hole Punching
양쪽 NAT에 일치하는 아웃바운드 엔트리를 만들기 위한 타이밍 기반 트릭:
- 각 피어가 STUN 서버에 접속해 자신의 공용 IP와 포트를 확인합니다.
- 시그널링 채널을 통해 이 주소들을 교환합니다.
- 두 피어가 동시에 서로에게 패킷을 전송합니다.
패킷이 NAT의 아웃바운드 상태가 유지되는 동안 도착하면, 인바운드 패킷은 기존 흐름의 일부로 간주되어 통과됩니다.
- UDP가 가장 잘 동작합니다(연결 지향이 아니기 때문).
- TCP는 동시 오픈을 사용할 수 있지만, 많은 NAT가 이를 제대로 처리하지 못합니다.
Hairpinning (NAT Loopback)
같은 라우터 뒤에 있는 두 장치가 서로의 공용 주소를 사용해 통신하려 할 때, 라우터는 트래픽을 변환하고 다시 내부로 루프백해야 합니다. 모든 가정용 라우터가 헤어피닝을 지원하는 것은 아니며, 그래서 ICE 같은 프레임워크는 로컬 주소를 먼저 테스트하고 실패하면 공용 주소로 전환합니다.
STUN – Session Traversal Utilities for NAT
STUN 서버는 다음과 같은 질문에 답합니다:
- “내 공용 IP와 포트는 무엇인가요?”
- “내 NAT는 어떻게 동작하나요?”
STUN은 또한 주기적인 keep‑alive 요청을 보내 NAT 매핑을 유지하는 데 도움을 줍니다.
TURN – Traversal Using Relays around NAT
직접 통신이 실패할 경우 TURN이 릴레이 역할을 합니다:
- TURN 서버에 공용 주소를 할당합니다.
- 피어 간 패킷을 중계합니다.
이 방식은 지연을 증가시키지만, 특히 기업이나 모바일 네트워크처럼 제한적인 환경에서 연결성을 보장합니다.
ICE – Interactive Connectivity Establishment
ICE는 전체 과정을 조정합니다:
- Gather candidates – 로컬 주소, STUN으로 얻은 공용 주소, TURN 릴레이 주소 등을 수집합니다.
- Connectivity checks – 각 후보 쌍을 테스트합니다.
- Selection – 최적의 경로(로컬 → 홀‑펀치 → 릴레이)를 선택합니다.
목표는 가장 저렴하고 지연이 적은 경로를 먼저 시도하고, 필요할 때만 대체 경로로 전환하는 것입니다.
Port‑Mapping Protocols
일부 라우터는 애플리케이션이 직접 인바운드 매핑을 요청할 수 있는 API를 제공합니다:
- UPnP IGD
- NAT‑PMP
- PCP
이 방법은 사용자의 라우터가 경로상의 유일한 NAT일 때만 동작합니다. ISP가 관리하는 환경에서는 상위 NAT가 이를 차단하는 경우가 많습니다.
Carrier‑Grade NAT (CGN)
ISP는 전체 동네나 건물을 하나의 공용 IP(CGN) 뒤에 두기도 합니다. 이런 경우:
- 가정용 라우터는 서비스를 외부에 노출할 수 없습니다. ISP의 NAT가 고객 시설에 도달하기 전에 무작위 트래픽을 차단하기 때문입니다.
- 트래버설 성공 여부는 캐리어가 매핑과 헤어피닝을 어떻게 처리하느냐에 크게 좌우되며, 예측이 어렵습니다.
IPv6 Considerations
IPv6는 주소 부족 문제를 없애고 각 장치에 전역적으로 도달 가능한 주소를 부여합니다. 이론적으로는 엔드‑투‑엔드 연결성을 복원하지만:
- 방화벽은 여전히 인바운드 트래픽을 필터링합니다.
- 피어‑투‑피어 시스템은 인바운드 허가를 요청할 방법이 필요합니다.
IPv6 채택이 고르지 않기 때문에 IPv4 기반 우회 방법은 앞으로도 수년간 남아 있을 것입니다.
Building a Robust NAT‑Traversal Implementation
전형적인 구현에는 다음 요소가 포함됩니다:
- UDP‑based communication을 기본 전송 수단으로 사용.
- 공용 주소 탐지를 위한 STUN 서버 접근.
- 복구 불가능한 경우를 대비한 TURN 릴레이 폴백.
- 후보 교환을 위한 시그널링 채널(WebSocket, SIP 등).
- NAT 포트 유지를 위한 주기적 keep‑alive.
- 네트워크 변화에 대응하기 위한 정기적인 연결 검사.
- 엔드‑투‑엔드 암호화로 데이터 안전 확보.
대부분의 애플리케이션은 가장 느리지만 보장된 방법(TURN)부터 시작해, 더 나은 경로가 발견되면 직접 경로로 전환합니다.
Real‑World Usage
- WebRTC는 브라우저에 ICE를 내장해 피어‑투‑피어 영상·음성·데이터 전송을 가능하게 합니다.
- Mesh networking tools도 비슷한 로직을 사용해 수동 설정 없이 장치를 연결합니다.
- 일부 터널링 유틸리티는 NAT를 통과하기보다 우회하는 보안 경로를 만듭니다.
Conclusion
NAT 트래버설은 필연적으로 생겨난 문제에 대한 대응책입니다. IPv4 고갈이 인터넷에 NAT를 도입하게 했고, 이는 원래의 엔드‑투‑엔드 모델을 깨뜨렸습니다. 트래버설 기법은 시기적절한 타이밍, 탐지, 폴백 메커니즘을 활용해 전 세계가 연결된 네트워크라는 착각을 복원합니다. IPv6가 보편화될 때까지 이러한 메커니즘은 매끄러운 영상 통화, 멀티플레이어 게임, 피어‑투‑피어 전송에 필수적입니다.
How does NAT traversal work? – 공용 엔드포인트를 발견하고, 협조된 아웃바운드 트래픽으로 일시적인 NAT 상태를 만들며, 필요 시 릴레이로 폴백하는 과정을 STUN, TURN, ICE와 같은 프로토콜이 조율합니다.