NAT
집이나 사무실의 컴퓨터, 스마트폰, 노트북은 모두 인터넷에 접속하지만, 그 장치들이 각자 공인 IP 주소를 가지고 있지는 않습니다. 보통 공유기 하나가 통신사에서 받은 공인 IP 주소 하나를 가지고, 안쪽 장치들에는 192.168.0.10 같은 사설 IP 주소를 나눠 줍니다. 사설 주소는 인터넷에서 라우팅되지 않으므로 그대로는 외부 서버와 통신할 수 없는데, 이 둘 사이에서 주소를 바꿔 주는 것이 NAT(Network Address Translation, 네트워크 주소 변환)입니다. NAT 장치는 안에서 밖으로 나가는 패킷의 출발지 주소를 공인 주소로 바꾸고, 밖에서 돌아오는 응답의 목적지를 다시 원래의 사설 주소로 되돌립니다.
여러 내부 장치가 하나의 공인 IP를 함께 쓰려면 주소만 바꿔서는 부족합니다. 같은 공인 IP에서 나가는 연결이 여러 개이면 응답이 어느 장치의 것인지 구분할 수 없기 때문입니다. 그래서 가정 · 사무실의 NAT는 대부분 포트 번호까지 함께 바꾸는 PAT(Port Address Translation, NAPT)로 동작합니다. 이 토픽에서는 주소와 포트가 바뀌는 과정, 변환 표를 이용한 응답 처리와 외부 접속 차단, 외부에서 내부 서버로 접속하게 하는 포트 포워딩을 단계별로 봅니다.
핵심 개념
사설 IP와 공인 IP
사설 IP는 인터넷에서 라우팅되지 않는 내부망용 주소로, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 대역이 RFC 1918에 정해져 있습니다. 공인 IP는 인터넷에서 유일하게 쓰이는 주소입니다.
핵심 개념
NAT
패킷이 지나갈 때 헤더의 IP 주소를 다른 주소로 바꾸는 기술입니다. 내부의 사설 주소를 외부에서 쓰는 공인 주소로 바꿔, 여러 내부 장치가 하나의 공인 IP를 공유하게 합니다.
핵심 개념
PAT (NAPT)
IP 주소와 함께 포트 번호까지 바꾸는 방식입니다. 연결마다 서로 다른 외부 포트를 할당하고 변환 표에 기록해, 하나의 공인 IP로 여러 연결을 구분합니다.
핵심 개념
변환 표 (연결 추적)
"내부 주소:포트 ↔ 외부 포트"의 대응을 기록한 표입니다. 응답이 돌아오면 이 표에서 원래 내부 호스트를 찾아 목적지를 되돌리고, 오래 쓰이지 않으면 항목을 지웁니다.
핵심 개념
포트 포워딩
공인 IP의 특정 포트로 들어오는 패킷을 내부 서버의 주소와 포트로 보내도록 미리 정해 두는 규칙입니다. 외부에서 먼저 시작하는 접속을 받으려면 필요합니다.
핵심 개념
출발지 변환과 목적지 변환
안에서 밖으로 나갈 때 출발지를 바꾸는 것을 SNAT, 밖에서 들어올 때 목적지를 바꾸는 것을 DNAT라고 합니다. PAT는 주로 SNAT이고 포트 포워딩은 DNAT입니다.
NAT의 배경
1990년대 초 인터넷이 빠르게 커지면서 IPv4 주소가 부족해질 것이라는 우려가 커졌고, 그 대응책 중 하나로 RFC 1631(1994)이 NAT를 제안했습니다. 이후 RFC 2663이 NAT의 용어를 정리했고, RFC 3022가 포트까지 바꾸는 NAPT를 포함한 전통적인 NAT를 설명했습니다. 사설 주소 대역은 RFC 1918이 정합니다. 통신사가 가입자에게 공인 IP를 하나씩 주지 않고 여러 가입자를 하나의 공인 IP 뒤에 두는 방식(CGNAT)을 위한 공유 주소 대역 100.64.0.0/10은 RFC 6598이 정합니다.
숫자로 확인하기
자주 하는 오해
면접에서 이렇게 물어요
면접 질문
NAT는 무엇이고 왜 쓰나요?
사설 IP와 공인 IP를 서로 변환하는 기술입니다. 여러 내부 장치가 하나의 공인 IP를 공유해 IPv4 주소 부족을 완화하고, 내부 주소 체계가 외부에 드러나지 않는 부수 효과도 있습니다.
면접 질문
PAT는 어떻게 여러 연결을 구분하나요?
연결마다 서로 다른 외부 포트를 할당하고 "내부 주소:포트 ↔ 외부 포트"를 변환 표에 기록합니다. 응답이 오면 목적지 포트로 표를 찾아 원래 내부 호스트로 되돌립니다.
면접 질문
NAT 뒤의 서버에 외부에서 접속하려면?
NAT는 내부에서 시작한 연결만 변환 표에 기록하므로, 외부에서 먼저 들어오는 접속은 포트 포워딩으로 공인 IP의 포트와 내부 서버의 주소 · 포트를 미리 연결해 두어야 합니다.
면접 질문
NAT의 단점은 무엇인가요?
연결 추적 때문에 장비에 상태와 부담이 생기고, 외부에서 내부로 직접 연결하기 어려우며, IP 주소를 페이로드에 넣는 일부 프로토콜은 추가 처리가 필요합니다.
실제 시스템에서는
함께 보면 좋은 토픽
참고 자료
리눅스 — 출발지 NAT(MASQUERADE)로 내부망 공유
# 이 장비가 패킷을 전달(라우팅)하도록 켜기 sudo sysctl -w net.ipv4.ip_forward=1 # eth0(외부 쪽)으로 나가는 패킷의 출발지를 eth0의 주소로 바꾸기 sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # nat 표의 규칙 확인 sudo iptables -t nat -L -n -v
리눅스를 공유기처럼 쓰려면 먼저 ip_forward로 패킷 전달을 켭니다. nat 표의 POSTROUTING 사슬은 패킷이 나가기 직전에 적용되고, MASQUERADE 대상은 출발지 주소를 나가는 인터페이스(여기서는 eth0)의 현재 주소로 바꿉니다. MASQUERADE는 출발지 주소를 나가는 인터페이스 주소로 바꾸며, 여러 내부 호스트의 포트가 겹치면 포트도 바꿔 PAT처럼 동작합니다. 외부 주소가 DHCP로 바뀌는 환경에서 편리합니다. 주소가 고정이면 SNAT 대상으로 직접 지정할 수도 있습니다. -o eth0 같은 인터페이스 이름은 환경에 맞게 바꿔야 하고, 위 명령은 재부팅하면 사라지므로 영구 설정은 배포판의 방법을 따라야 합니다.
리눅스 — 포트 포워딩(DNAT)과 변환 표 확인
# 공인 쪽 8080 포트로 오는 TCP를 내부 192.168.0.20:80으로 보내기 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 \ -j DNAT --to-destination 192.168.0.20:80 # 연결 추적 표 보기 (conntrack 도구 필요) sudo conntrack -L
nat 표의 PREROUTING 사슬은 패킷이 들어오자마자 적용되어, DNAT 대상이 목적지를 내부 서버의 주소와 포트로 바꿉니다. 응답 패킷의 출발지는 커널의 연결 추적이 자동으로 되돌려 주므로 응답 방향 규칙은 따로 쓰지 않습니다. conntrack -L은 커널이 기억하고 있는 연결 목록을 보여 주며, 각 항목에 원래 방향과 응답 방향의 주소 · 포트가 함께 나와 NAT가 어떻게 바꿨는지 확인할 수 있습니다. 포워딩된 패킷이 통과하도록 FORWARD 사슬의 규칙이 막지 않는지도 확인해야 하며, 위 코드는 개념을 보이는 최소 예시입니다.
Python — PAT 변환 표 흉내 내기
class Nat: def __init__(self, public_ip, first_port=40001): self.public_ip = public_ip self.next_port = first_port self.out = {} # (내부 IP, 내부 포트) -> 외부 포트 self.back = {} # 외부 포트 -> (내부 IP, 내부 포트) def outbound(self, src_ip, src_port): key = (src_ip, src_port) if key not in self.out: self.out[key] = self.next_port self.back[self.next_port] = key self.next_port += 1 return self.public_ip, self.out[key] def inbound(self, dst_port): return self.back.get(dst_port) # 표에 없으면 None (버림) nat = Nat("203.0.113.5") print(nat.outbound("192.168.0.10", 51000)) # ('203.0.113.5', 40001) print(nat.outbound("192.168.0.20", 51000)) # ('203.0.113.5', 40002) print(nat.inbound(40001)) # ('192.168.0.10', 51000) print(nat.inbound(40009)) # None
이 클래스는 PAT의 핵심인 변환 표를 딕셔너리 두 개로 흉내 냅니다. outbound는 안에서 밖으로 나가는 연결에 새 외부 포트를 할당하고 표에 기록하며, 이미 있는 연결이면 같은 외부 포트를 다시 씁니다. inbound는 들어오는 패킷의 목적지 포트로 표를 찾아 원래의 내부 주소와 포트를 돌려주고, 표에 없으면 None을 돌려줍니다. 시각화에서 외부의 먼저 시작한 접속이 버려지는 이유입니다. 실제 NAT는 프로토콜별 상태 추적, 항목 만료, 포트 재사용 같은 처리가 더 있으므로 이 코드는 원리만 보이는 최소 예시입니다.
Q1
NAT(Network Address Translation)의 기본 역할은?
Q2
PAT(포트 주소 변환, NAPT)의 특징은?
Q3
NAT 뒤에 있는 내부 서버에 외부에서 접속할 수 있게 하려면?