NAT: 사설 주소와 공인 주소를 변환하는 경계 라우팅
네트워크 주소 변환(NAT)은 라우터가 패킷의 IP 주소와 포트를 바꾸고 변환 상태를 기록하는 기술이다. 여러 내부 호스트가 하나의 공인 IPv4 주소를 공유할 수 있지만, 외부에서 내부로 연결하려면 포트 전달이나 중계 서버가 필요하다. NAT는 주소 부족을 완화하지만 방화벽이나 암호화 기술 자체는 아니다.
By 송민성
1. 개념
네트워크 주소 변환(NAT, Network Address Translation)은 네트워크 경계 장비가 패킷의 출발지 또는 목적지 IP 주소를 다른 주소로 바꾸는 기술이다.
가정용 공유기에서는 여러 기기가 하나의 공인 IPv4 주소를 공유한다.
노트북 192.168.0.10:51000 ─┐
휴대폰 192.168.0.11:52000 ─┼─ 공유기 203.0.113.7 ─ 인터넷
서버 192.168.0.12:53000 ─┘실제로는 IP 주소뿐 아니라 전송 계층 포트도 함께 바꾸는 경우가 많다. 이를 네트워크 주소·포트 변환(NAPT, Network Address and Port Translation) 또는 포트 주소 변환(PAT, Port Address Translation)이라고 한다. 일상적으로는 이 방식도 NAT라고 부른다.
주요 유형은 다음과 같다.
- 출발지 NAT(SNAT, Source NAT): 외부로 나가는 패킷의 출발지 주소를 변경한다.
- 목적지 NAT(DNAT, Destination NAT): 들어오는 패킷의 목적지 주소를 변경한다.
- 정적 NAT(static NAT): 내부 주소와 외부 주소를 고정된 일대일 관계로 연결한다.
- 동적 NAT(dynamic NAT): 공인 주소 풀에서 사용 가능한 주소를 동적으로 할당한다.
- 포트 주소 변환(PAT): 포트를 구분해 여러 내부 연결이 하나의 공인 주소를 공유하게 한다.
IPv4 사설 주소 범위는 다음과 같다.
10.0.0.0/8172.16.0.0/12192.168.0.0/16
이 주소들은 공용 인터넷에서 직접 라우팅되지 않는다.
2. 왜 사용하는가
NAT의 대표 목적은 공인 IPv4 주소 절약이다. 내부 기기마다 공인 주소를 할당하지 않고 여러 기기가 하나의 공인 주소를 공유할 수 있다.
NAT는 내부 주소 체계를 외부에서 분리하는 데도 사용한다. 내부 서버의 주소가 바뀌어도 외부에 노출된 주소와 포트는 유지할 수 있다.
외부 요청
203.0.113.7:443
│
│ DNAT
▼
192.168.0.20:8443주요 사용 목적은 다음과 같다.
- 가정이나 사무실의 여러 기기가 하나의 공인 IPv4 주소 공유
- 내부 서버에 대한 포트 전달(port forwarding)
- 컨테이너와 가상 머신의 외부 통신
- 로드 밸런서가 외부 주소를 내부 서버 주소로 변환
- 통신사급 NAT(CGNAT, Carrier-Grade NAT)를 통한 가입자 주소 공유
3. 동작 원리
내부 클라이언트 192.168.0.10:51000이 외부 서버 198.51.100.20:443에 TCP 연결을 시작한다고 가정한다.
외부로 나가는 패킷
원래 패킷은 다음 정보를 가진다.
출발지: 192.168.0.10:51000
목적지: 198.51.100.20:443
프로토콜: TCP공유기는 출발지 주소와 포트를 공인 주소 및 사용 가능한 포트로 바꾼다.
출발지: 203.0.113.7:62001
목적지: 198.51.100.20:443
프로토콜: TCP동시에 변환 테이블을 저장한다.
| 프로토콜 | 내부 주소 | 변환된 외부 주소 | 원격 주소 |
|---|---|---|---|
| TCP | 192.168.0.10:51000 | 203.0.113.7:62001 | 198.51.100.20:443 |
내부로 들어오는 응답
외부 서버는 공유기의 공인 주소로 응답한다.
출발지: 198.51.100.20:443
목적지: 203.0.113.7:62001
프로토콜: TCP공유기는 변환 테이블에서 203.0.113.7:62001에 대응하는 내부 연결을 찾는다. 목적지를 192.168.0.10:51000으로 복원한 뒤 내부 네트워크로 전달한다.
IP 주소나 TCP·UDP 포트를 변경하면 헤더 체크섬(checksum)도 다시 계산해야 한다.
외부에서 시작하는 연결
변환 상태가 없는 외부 패킷은 어느 내부 호스트로 보내야 하는지 결정할 수 없다. 외부에서 내부 서버로 연결하려면 정적 포트 전달 규칙이 필요하다.
203.0.113.7:8080 → 192.168.0.20:80라우터는 목적지 주소 변환(DNAT)을 적용해 내부 웹 서버로 패킷을 전달한다.
4. 코드 예제
다음 예제는 UDP 서버가 관찰한 클라이언트의 IP 주소와 포트를 반환한다. 클라이언트와 서버 사이에 NAT가 있다면 클라이언트가 사용하는 로컬 주소와 서버가 관찰하는 주소가 다를 수 있다.
서버 코드:
import { createSocket } from "node:dgram";
const socket = createSocket("udp4");
const port = 4000;
socket.on("message", (message, remote) => {
const observed = {
message: message.toString("utf8"),
observedAddress: remote.address,
observedPort: remote.port,
};
const response = Buffer.from(JSON.stringify(observed));
socket.send(response, remote.port, remote.address);
});
socket.bind(port, "0.0.0.0", () => {
console.log(`UDP 서버가 ${port}번 포트에서 실행 중입니다.`);
});클라이언트 코드:
import { createSocket } from "node:dgram";
const serverHost = process.argv[2] ?? "127.0.0.1";
const serverPort = 4000;
const socket = createSocket("udp4");
socket.bind(() => {
const local = socket.address();
console.log("클라이언트 로컬 주소:", {
address: local.address,
port: local.port,
});
socket.send(
Buffer.from("내 주소를 알려 주세요."),
serverPort,
serverHost,
);
});
socket.on("message", (message) => {
console.log("서버가 관찰한 주소:", JSON.parse(message.toString("utf8")));
socket.close();
});
socket.on("error", (error) => {
console.error(error);
socket.close();
});파일을 각각 server.ts, client.ts로 저장하고 실행한다.
npx tsx server.ts
npx tsx client.ts 127.0.0.1같은 컴퓨터에서 실행하면 NAT를 거치지 않으므로 주소 차이가 나타나지 않는다. 서버를 공인 주소가 있는 다른 네트워크에서 실행하면 NAT가 변환한 출발지 주소와 포트를 확인할 수 있다.
5. 시간 복잡도 또는 성능 특성
NAT는 패킷마다 다음 작업을 수행한다.
- 변환 규칙 또는 기존 연결 상태 조회
- IP 주소와 필요시 포트 변경
- IP 및 전송 계층 체크섬 갱신
- 새 연결이라면 변환 상태 생성
처리 시간은 NAT 장비의 자료구조와 하드웨어 가속 여부에 따라 달라진다. 해시 테이블을 사용하는 구현은 평균적으로 상수 시간에 가까운 연결 조회를 제공할 수 있지만, 모든 NAT 장비가 같은 복잡도를 보장하지는 않는다.
핵심 자원은 변환 테이블 용량이다. 동시 연결이 많아지면 상태 항목과 변환 포트를 더 많이 소비한다. 테이블이나 사용 가능한 포트가 고갈되면 새 연결이 실패할 수 있다.
TCP 연결 종료나 일정 시간 동안 트래픽이 없는 UDP 흐름은 장비 정책에 따라 테이블에서 제거된다. 정확한 유휴 시간 제한(idle timeout)은 장비와 설정마다 다르다.
NAT가 주소와 포트를 바꾸더라도 일반적으로 애플리케이션 데이터 자체를 수정하지는 않는다. 다만 FTP처럼 애플리케이션 본문에 IP 주소나 포트를 포함하는 프로토콜은 별도 처리 장치가 필요할 수 있다.
6. 실무 사용 사례
가정용 공유기
노트북, 휴대폰, 게임기 등 여러 기기가 하나의 공인 IPv4 주소를 공유한다. 내부에서 시작한 연결은 자동으로 변환되지만 외부에서 시작하는 연결에는 포트 전달 설정이 필요하다.
컨테이너 네트워크
컨테이너는 사설 네트워크 주소를 사용하고 호스트가 출발지 NAT를 적용한다.
컨테이너 172.17.0.2:5000
│ SNAT
▼
호스트 공인 주소:변환 포트외부에서 컨테이너 서비스에 접근할 때는 호스트 포트를 컨테이너 포트로 연결한다.
호스트:8080 → 컨테이너:80클라우드 네트워크
사설 서브넷(private subnet)의 서버는 NAT 게이트웨이를 통해 외부 저장소나 패키지 서버에 접근한다. 외부에서는 해당 사설 서버로 직접 연결할 수 없다.
피어 투 피어 통신
영상 통화, 온라인 게임, 웹 실시간 통신(WebRTC)은 양쪽 참가자가 모두 NAT 뒤에 있을 수 있다. 이런 시스템은 다음 기술을 사용한다.
- 세션 순회 유틸리티(STUN, Session Traversal Utilities for NAT): 외부에서 관찰되는 주소와 포트를 확인한다.
- 대화형 연결 수립(ICE, Interactive Connectivity Establishment): 여러 연결 후보를 시험한다.
- NAT 주변 중계(TURN, Traversal Using Relays around NAT): 직접 연결할 수 없을 때 중계 서버를 사용한다.
7. 주의할 점
NAT와 방화벽은 다르다
NAT는 주소 변환 기술이다. 방화벽(firewall)은 보안 정책에 따라 패킷을 허용하거나 차단한다. 가정용 공유기가 두 기능을 함께 제공하는 경우가 많지만 개념과 목적은 다르다.
외부 연결이 제한된다
외부 호스트는 변환 상태나 포트 전달 규칙이 없으면 내부 호스트에 직접 연결하기 어렵다. 서버 운영, 피어 투 피어 통신, 원격 접속에서 문제가 된다.
통신사급 NAT는 포트 전달이 어렵다
통신사급 NAT 환경에서는 가입자 공유기 바깥에 통신사 NAT가 하나 더 존재한다.
내부 기기 → 가정용 NAT → 통신사급 NAT → 인터넷사용자가 가정용 공유기에 포트 전달을 설정해도 통신사 NAT를 직접 제어할 수 없어 외부 연결이 실패할 수 있다.
IP 주소를 사용자 식별자로 쓰면 안 된다
하나의 공인 주소를 여러 사용자나 기기가 공유할 수 있다. 반대로 이동통신이나 재연결 과정에서 한 사용자의 공인 주소가 바뀔 수도 있다. 인증, 과금, 차단을 IP 주소만으로 판단하면 오탐이 발생한다.
종단 간 연결성을 약화한다
NAT는 인터넷의 종단 간 원칙(end-to-end principle)을 약화한다. 내부 호스트가 외부에서 직접 접근 가능한 고유 주소를 갖지 못하기 때문이다.
IPv6는 큰 주소 공간을 제공하므로 주소 절약 목적의 NAT가 필요하지 않다. 그러나 IPv6에서도 방화벽 정책은 별도로 설정해야 한다.
8. 핵심 정리
- 네트워크 주소 변환(NAT)은 패킷의 출발지 또는 목적지 IP 주소를 바꾼다.
- 포트 주소 변환(PAT)은 포트까지 변환해 여러 내부 연결이 하나의 공인 IPv4 주소를 공유하게 한다.
- NAT 장비는 내부 연결과 변환된 외부 연결의 대응 관계를 상태 테이블에 저장한다.
- 외부에서 내부로 연결하려면 포트 전달, 직접 연결 수립 기술 또는 중계 서버가 필요하다.
- NAT는 방화벽, 인증, 암호화를 대신하지 않는다.