NAT와 DHCP
지금까지 IP 주소와 서브넷을 배우면서, 공인 IP와 사설 IP가 구분된다는 것을 알았습니다. 그런데 한 가지 의문이 남습니다. 사설 IP는 인터넷에서 라우팅되지 않는다고 했는데, 그렇다면 192.168.x.x 주소를 가진 내 노트북은 어떻게 구글에 접속하는 걸까요?
이 질문에 대한 답이 NAT(Network Address Translation)입니다.
NAT는 주소를 단순히 바꾸는 기능이지만, 가정과 기업에서 흔히 말하는 NAT는 대부분 PAT/NAPT입니다. 내부의 여러 장치가 하나의 공인 IP를 함께 쓰기 위해 IP 주소뿐 아니라 TCP/UDP 포트까지 함께 변환합니다.
NAT의 동작 원리
NAT의 종류
| 종류 | 변환 대상 | 방향 | 사용 사례 |
|---|---|---|---|
| SNAT (Source NAT) | 출발지 IP | 내부→외부 | 인터넷 접속 |
| DNAT (Destination NAT) | 목적지 IP | 외부→내부 | 포트 포워딩, 서버 외부 공개 |
| PAT (Port Address Translation) | 출발지 IP + 포트 | 내부→외부 | 가정/기업 (N:1 NAT) |
| 1:1 NAT | 고정 매핑 | 양방향 | DMZ 서버, AWS Elastic IP |
PAT(NAPT라고도 함)가 실무에서 가장 많이 사용됩니다. 하나의 공인 IP로 포트 번호를 구분하여 수천 개의 동시 연결을 처리합니다. 가정의 공유기가 수행하는 NAT가 바로 PAT입니다.
PAT 장비는 내부 IP:포트 ↔ 공인 IP:포트 ↔ 외부 목적지 관계를 NAT 테이블에 저장합니다. 응답 패킷이 돌아오면 이 테이블을 보고 원래 내부 장치로 되돌려 보냅니다. 그래서 NAT는 주소 변환 장치인 동시에 연결 상태를 기억하는 장치입니다.
포트 포워딩 (DNAT)
포트 포워딩은 외부에서 먼저 들어오는 연결을 허용하기 위한 정적 DNAT 규칙입니다. 예를 들어 203.0.113.7:443으로 들어온 연결을 내부 서버 192.168.1.50:8443으로 넘기도록 미리 매핑합니다. 단, 실제 장비에서는 방화벽 규칙도 함께 열려 있어야 합니다.
여기서 사용하는 203.0.113.x, 198.51.100.x 같은 주소는 실제 서비스 주소가 아니라 문서 예시용 대역입니다. 실제 설정에서는 ISP나 클라우드가 할당한 공인 IP를 사용합니다.
# Linux에서 NAT 설정 (iptables)
# SNAT: 내부 → 외부 (마스커레이드)
sudo iptables -t nat -A POSTROUTING \
-s 192.168.1.0/24 -o eth0 -j MASQUERADE
# DNAT: 외부 80 → 내부 웹서버
sudo iptables -t nat -A PREROUTING \
-i eth0 -p tcp --dport 80 \
-j DNAT --to-destination 192.168.1.50:80
# NAT 테이블 확인
sudo iptables -t nat -L -n -v
# 현재 NAT 세션 확인
sudo conntrack -L | head -20NAT의 한계
| 문제 | 설명 | 영향 |
|---|---|---|
| 엔드투엔드 깨짐 | 외부에서 내부로 직접 접속하기 어려움 | P2P, WebRTC에 영향 |
| NAT 테이블 한계 | 공인 IP·프로토콜·포트 조합 수에 의존 | 대규모 동시 연결 시 고갈 |
| 프로토콜 호환성 | IP/포트가 페이로드에 포함된 프로토콜 | FTP active 모드, SIP 등 |
| 상태 유지 | NAT 테이블 = 상태 저장 | 장애·재시작 시 세션 끊김 |
| 이중 NAT/CGNAT | 공유기 뒤에 ISP NAT가 한 번 더 존재 | 포트 포워딩이 동작하지 않음 |
이런 한계를 우회하기 위해 STUN/TURN 서버(WebRTC), UPnP(자동 포트 포워딩), NAT-T(IPsec VPN) 등의 기술이 사용됩니다.
CGNAT 환경에서는 100.64.0.0/10 공유 주소 대역이 고객 장비와 ISP NAT 사이에서 사용될 수 있습니다. 이 경우 공유기에서 포트 포워딩을 설정해도 ISP NAT를 통과하지 못해 외부 접속이 막힐 수 있습니다.
DHCP 동작 흐름
컴퓨터를 네트워크에 연결하면 자동으로 IP 주소가 할당되는 것이 당연하게 느껴지지만, 사실 이 뒤에는 DHCP(Dynamic Host Configuration Protocol)라는 프로토콜이 동작하고 있습니다.
DHCP의 기본 흐름은 흔히 DORA라고 부릅니다. 클라이언트가 Discover로 서버를 찾고, 서버가 Offer로 주소를 제안하고, 클라이언트가 Request로 선택을 알리고, 서버가 ACK로 임대를 확정합니다. DHCP 메시지는 UDP를 사용하며 서버 포트는 67, 클라이언트 포트는 68입니다.
DHCP가 할당하는 정보
| 정보 | 예시 | 용도 |
|---|---|---|
| IP 주소 | 192.168.1.100 | 장치의 네트워크 주소 |
| 서브넷 마스크 | 255.255.255.0 | 같은 네트워크 범위 결정 |
| 기본 게이트웨이 | 192.168.1.1 | 외부 네트워크로의 출구 |
| DNS 서버 | 8.8.8.8, 1.1.1.1 | 도메인 이름 해석 |
| 임대 시간 | 86400초 (24시간) | 주소 사용 가능 시간 |
| NTP 서버 | time.google.com | 시간 동기화 (옵션) |
DHCP 임대는 영구 할당이 아니라 시간 제한이 있는 lease입니다. 클라이언트는 lease가 끝나기 전에 갱신을 시도하고, 다른 네트워크에 DHCP 서버가 있을 때는 라우터가 DHCP relay로 메시지를 중계할 수 있습니다.
# 현재 DHCP 임대 정보 확인 (Linux)
cat /var/lib/dhcp/dhclient.leases
# DHCP 임대 갱신
sudo dhclient -r eth0 # 임대 해제
sudo dhclient eth0 # 새로 요청
# Windows
ipconfig /release
ipconfig /renew
ipconfig /all # DHCP 서버 주소 확인
# DHCP 서버가 할당한 정보 확인
nmcli connection show "이더넷" | grep -i dhcp공유기의 복합 기능
| 기능 | 설명 |
|---|---|
| 라우터 | 내부 ↔ 외부 패킷 중계 |
| NAT | 사설 IP ↔ 공인 IP 변환 |
| DHCP 서버 | 연결 기기에 IP 자동 할당 |
| L2 스위치 | 유선 LAN 포트 간 프레임 전달 |
| 무선 AP | Wi-Fi 제공 |
| 방화벽 | 외부 → 내부 원치 않는 연결 차단 |
개발자가 로컬에서 서버를 실행하고 외부에서 접속하려 할 때, 포트 포워딩 설정이 필요한 이유가 바로 NAT 때문입니다. 요즘은 ngrok이나 Cloudflare Tunnel을 사용하면 포트 포워딩 없이도 외부에서 로컬 서버에 접근할 수 있습니다.
다음 절에서는 IPv4의 주소 고갈 문제와 그 근본적 해결책인 IPv6를 살펴보겠습니다.