집에서는 노트북, 휴대폰, TV가 함께 인터넷을 쓰는데, 밖에서 보면 공인 IP는 하나인 경우가 많아요. 반대로 집에 둔 서버를 밖에서 접속하려고 하면 포트포워딩이라는 설정이 등장합니다. 두 장면 모두 NAT와 연결됩니다.
SNAT는 보내는 주소를, DNAT는 받는 주소를 바꿉니다. 1:1 NAT는 안쪽 IP 하나와 바깥쪽 IP 하나를 짝지어요. 공유기를 회사 안내 데스크라고 생각하고, 인터넷으로 나가는 요청과 서버로 들어오는 요청을 따라가 보겠습니다.
이 글의 목차
NAT는 주소를 바꿔 적는 안내 데스크
NAT(Network Address Translation)는 네트워크를 지나는 패킷의 IP 주소를 다른 주소로 바꾸는 기술입니다. 패킷은 통신 데이터를 나누어 담은 작은 묶음이에요. 이 글에서는 가정과 사무실에서 익숙한 IPv4 NAT를 다룹니다. RFC 2663: NAT 용어와 개념
회사 직원에게는 사내 내선번호가 있고, 회사 밖에서는 대표번호로 연락한다고 생각해 보세요. 안내 데스크는 바깥에 사용할 번호와 안쪽 직원을 연결합니다. NAT 장비도 안팎에서 사용할 주소를 바꾸고, 필요한 경우 연결 정보를 기록해 응답을 돌려보냅니다.
물론 IP는 전화번호가 아니에요. 이 비유는 ‘안에서 쓰는 주소와 밖에서 보이는 주소가 다를 수 있다’는 점을 이해하는 데만 사용하겠습니다.
| 이름 | 무엇을 바꾸거나 정하나 | 익숙한 장면 |
|---|---|---|
| SNAT | 출발지 IP 주소 | 내 PC가 바깥 인터넷에 접속 |
| DNAT | 목적지 IP 주소 | 외부 요청을 내부 서버에 전달 |
| PAT·NAPT | IP와 포트의 대응 관계 | 여러 기기가 공인 IP 하나를 공유 |
| 1:1 NAT | IP 하나와 IP 하나의 대응 관계 | 특정 서버에 외부 IP 하나를 전용으로 연결 |
SNAT와 DNAT는 어느 주소를 바꾸는지를 말합니다. PAT와 1:1 NAT는 어떻게 짝짓는지에 관한 말이에요. 서로 완전히 별개인 네 가지 제품처럼 외우지 않아도 됩니다.
이제 작은 사무실을 하나 가정하겠습니다. 모든 패킷 예시는 TCP 통신이며, 주소와 포트는 설명을 위해 정한 값입니다.
| 역할 | 주소 | 용도 |
|---|---|---|
| 직원 노트북 | 192.168.10.10 | 인터넷을 사용하는 내부 기기 |
| 사내 웹 서버 | 192.168.10.20 | 외부에서 접속할 내부 서버 |
| NAT 장비의 외부 주소 | 203.0.113.10 | 노트북의 외부 접속과 포트포워딩 |
| 외부 웹사이트 | 198.51.100.80 | 노트북이 접속할 상대 |
192.168.10.x는 이 사무실 안에서 쓰는 사설 주소입니다. 인터넷에서는 이 주소만 보고 어느 사무실의 어느 기기로 돌아가야 하는지 알 수 없습니다. NAT는 사설 IPv4 네트워크를 인터넷에 연결할 때 흔히 사용하는 방법이에요. 사설 주소 범위는 RFC 1918에 정의되어 있습니다.
여기서 203.0.113.x와 198.51.100.x는 공인 IP 역할을 맡긴 문서용 주소입니다. 실제 인터넷 접속 대상으로 사용할 수 없습니다. 뒤에서 나오는 .20, .50도 같은 원칙을 따릅니다. RFC 5737: 문서용 IPv4 주소
SNAT: 보낸 사람 주소를 대표번호로 바꾸기
직원 노트북이 외부 웹사이트에 접속합니다. 처음 패킷에는 ‘보낸 사람은 192.168.10.10, 받는 사람은 198.51.100.80’이라고 적혀 있어요. NAT 장비는 이 패킷의 출발지 주소를 바깥에서 사용할 203.0.113.10으로 바꿉니다.
이것이 SNAT(Source NAT), 출발지 주소 변환입니다. S는 Source, ‘어디에서 왔는가’를 뜻해요. 아래에서는 주소 변화에 집중하도록 출발지 포트를 그대로 두었습니다. nftables 공식 위키: Source NAT
노트북이 보낸 요청
출발지 192.168.10.10:51000
목적지 198.51.100.80:443
↓ SNAT
인터넷으로 나가는 요청
출발지 203.0.113.10:51000
목적지 198.51.100.80:443
IP:포트에서 콜론 뒤 숫자는 TCP 포트 번호입니다. 포트는 한 기기 안에서 통신을 구분하는 데 사용해요. 위 예시의 443은 HTTPS 서비스의 목적지 포트이고, 51000은 노트북 쪽 통신에 사용한 출발지 포트입니다.
외부 웹사이트에는 요청이 203.0.113.10에서 온 것으로 보입니다. 그래서 응답도 그쪽으로 보냅니다. 일반적인 상태 추적 NAT는 이 연결의 변환 정보를 기억했다가, 돌아온 패킷의 목적지를 원래 노트북 주소로 되돌려 전달합니다.
웹사이트가 보낸 응답
출발지 198.51.100.80:443
목적지 203.0.113.10:51000
↓ 기존 변환의 역변환
노트북에 도착하는 응답
출발지 198.51.100.80:443
목적지 192.168.10.10:51000
안내 데스크가 ‘이 회신은 아까 연락한 그 직원에게’라고 연결해 주는 셈이에요. SNAT로 시작한 연결도 응답 방향에서는 목적지 주소가 바뀝니다. 이 때문에 SNAT를 단순히 ‘나가는 패킷에만 일어나는 일’로 외우면 헷갈립니다. RFC 3022: NAT의 변환 과정
PAT: 공인 IP 하나로 노트북과 휴대폰이 함께 쓰는 법
노트북만 쓴다면 앞의 설명으로 충분해 보입니다. 그런데 휴대폰도 같은 웹사이트에 접속하고, 우연히 같은 출발지 포트 51000을 사용하면 어떨까요? 바깥쪽 IP와 포트까지 똑같이 내보내면 두 연결의 응답을 구분할 수 없습니다.
이때 NAT 장비는 바깥쪽 포트를 다르게 배정할 수 있어요. IP뿐 아니라 TCP·UDP 포트까지 변환에 사용하는 방식을 PAT(Port Address Translation) 또는 NAPT(Network Address Port Translation)라고 부릅니다. 공인 IP 하나를 여러 기기가 공유하는 대표적인 방식입니다. RFC 3022 §2.2: NAPT
| 기기 | 내부 출발지 | 외부에서 보이는 출발지 |
|---|---|---|
| 노트북 | 192.168.10.10:51000 | 203.0.113.10:61001 |
| 휴대폰 | 192.168.10.11:51000 | 203.0.113.10:61002 |
두 기기 모두 목적지는 198.51.100.80:443입니다. 응답이 61001로 오면 노트북으로, 61002로 오면 휴대폰으로 전달합니다. 대표번호는 같아도 회신을 연결할 표시가 다른 셈이에요.
표는 출발지의 대응 관계만 줄여 보여 준 예시입니다. 실제 장비는 프로토콜과 연결 정보도 함께 관리하며, 포트 배정 방식은 구현과 설정에 따라 다릅니다. 포트가 충돌하지 않으면 원래 번호를 유지할 수도 있어요. SNAT가 항상 포트 변경을 뜻하는 것은 아닙니다.
DNAT: 대표 주소로 온 손님을 내부 서버로 안내하기
이번에는 외부 사용자가 사내 웹 서버에 접속하려고 합니다. 외부 사용자는 내부 주소 192.168.10.20으로 직접 찾아올 수 없으므로, 바깥에 알려 준 203.0.113.10:443으로 요청을 보냅니다.
NAT 장비에는 ‘이 주소의 TCP 443으로 온 요청은 192.168.10.20:443으로 전달’이라는 규칙을 둡니다. 패킷의 목적지 주소를 바꾸는 DNAT(Destination NAT)입니다. 공유기의 포트포워딩은 DNAT를 사용하는 익숙한 사례예요. RFC 8512 §1.1: Destination NAT
외부 사용자의 주소를 198.51.100.50이라고 가정하면 다음과 같습니다.
외부 사용자가 보낸 요청
출발지 198.51.100.50:52000
목적지 203.0.113.10:443
↓ DNAT
내부 서버에 전달되는 요청
출발지 198.51.100.50:52000
목적지 192.168.10.20:443
이번에는 출발지가 그대로입니다. 별도의 SNAT나 프록시가 없는 이 구성에서 서버는 외부 사용자의 IP를 볼 수 있어요. 포트포워딩이 모든 방문자를 공유기 IP로 바꾸는 것은 아닙니다.
서버의 응답은 같은 NAT 장비를 거치며 기존 변환의 역변환을 받습니다. 외부 사용자에게는 203.0.113.10:443이 응답한 것으로 보입니다. 이 연결의 회신만을 위해 별도의 SNAT 규칙을 매번 만드는 것은 아닙니다. 서버가 새로 시작하는 외부 연결의 출발지 주소 정책은 별도로 살펴봐야 합니다. nftables 공식 위키: 상태 추적 NAT
포트 번호까지 바꿔 전달할 수도 있습니다. 예를 들어 서버가 실제로 HTTPS를 8443에서 제공한다면 외부 443을 내부 8443으로 연결할 수 있어요. NAT가 HTTPS를 HTTP로 바꾸거나, 꺼져 있는 서버 프로그램을 켜 주는 것은 아닙니다. Netgate: 포트포워딩 설정과 대상 포트
1:1 NAT: 서버 한 대에 바깥 주소 하나를 짝짓기
포트포워딩은 ‘이 주소의 이 포트로 온 요청’을 골라 전달합니다. 1:1 NAT는 범위가 달라요. 내부 IP 하나와 외부 IP 하나를 대응시킵니다. 예를 들어 웹 서버 192.168.10.20에 별도의 외부 주소 203.0.113.20을 짝짓습니다.
안내 데스크 비유로 보면 특정 직원에게 외부 전용번호를 배정하는 셈입니다. 서버의 운영체제에는 계속 내부 IP를 두고, NAT 장비가 경계에서 주소를 바꿉니다. Netgate 공식 문서: 1:1 NAT
| 흐름 | NAT 전 | NAT 후 |
|---|---|---|
| 외부에서 서버로 새 요청 | 목적지 203.0.113.20 | 목적지 192.168.10.20 |
| 서버에서 외부로 새 요청 | 출발지 192.168.10.20 | 출발지 203.0.113.20 |
첫 행은 DNAT, 둘째 행은 SNAT의 역할입니다. 일반적인 양방향 정적 1:1 NAT는 이렇게 양쪽 방향에서 같은 IP 대응 관계를 사용합니다. IP만 바꾸는 1:1 NAT는 포트 번호를 유지하며, 장비에 따라 두 방향의 설정을 나누어 구성하기도 합니다.
그렇다고 1:1 NAT를 만들면 모든 포트가 자동으로 허용되는 것은 아닙니다. 주소 변환과 방화벽 허용은 별개입니다. 웹 서비스만 제공한다면 필요한 TCP 443 등을 허용하고, 관리용 접속까지 한꺼번에 열지 않습니다.
또한 203.0.113.20처럼 적당한 주소를 골라 규칙에 넣는 것으로 끝나지 않습니다. 실제 구성에는 사용할 수 있도록 할당받은 외부 IP가 필요하고, 그 주소로 오는 트래픽이 NAT 장비까지 도달해야 합니다. 주소만 전용으로 짝지어도 회선 대역폭이나 보안이 전용으로 보장되지는 않아요.
웹 포트 하나를 내부 서버에 연결하려는 목적이라면 포트포워딩부터 검토하면 편합니다. 특정 서버의 외부 주소를 별도로 유지하고 여러 서비스를 연결할 이유가 있을 때 1:1 NAT를 검토합니다. 제품의 규칙 우선순위와 허용 정책도 함께 확인합니다.
Static·Dynamic·MASQUERADE는 다른 질문에 답하는 말
장비 설정 화면에는 Static NAT, Dynamic NAT, MASQUERADE도 나옵니다. 앞에서 익힌 개념에 새 이름이 덧붙으니 복잡해 보이지만, 각각 무엇을 정하는 말인지 나누면 편해요.
| 용어 | 뜻 | 기억할 장면 |
|---|---|---|
| Static NAT | 주소 대응을 미리 고정 | 내부 서버와 외부 IP를 고정으로 연결 |
| Dynamic NAT | 필요할 때 주소 풀에서 대응을 배정 | 준비된 여러 외부 IP 중 하나를 배정 |
| PAT·NAPT | 주소와 포트로 연결을 구분 | 여러 내부 기기가 외부 IP를 공유 |
| MASQUERADE | 나가는 인터페이스 주소를 사용하는 SNAT | 외부 IP가 바뀔 수 있는 Linux 연결 |
전통적인 Basic Dynamic NAT는 IP 주소 풀에서 주소를 빌려 주는 방식입니다. 주소가 부족할 때 포트까지 나눠 쓰는 PAT와 구분해야 해요. ‘Dynamic’이라는 단어가 있다고 모두 공인 IP 하나를 공유하는 구성은 아닙니다. RFC 2663 §2.7: 주소 매핑
Linux의 MASQUERADE는 나가는 인터페이스의 주소를 사용하도록 하는 SNAT의 한 형태입니다. 외부 IP가 바뀔 수 있는 환경에서 유용합니다. 정해진 변환 주소를 지정하는 snat와 구분해서 보면 돼요. nftables 공식 위키: Masquerading
따라서 규칙을 읽을 때는 먼저 출발지와 목적지 중 무엇을 바꾸는지 보세요. 다음으로 IP만 대응시키는지, 포트까지 사용하는지 살펴봅니다. 마지막에 그 대응이 고정인지 필요할 때 만들어지는지 확인하면 이름들이 덜 뒤섞입니다.
NAT 설정은 맞아 보이는데 접속이 안 될 때
변환·허용·응답 경로를 따로 확인하기
주소를 제대로 바꿔도 중간에서 패킷을 막거나, 서버가 다른 길로 응답하면 통신은 실패할 수 있습니다. 안내 데스크가 방을 알려 줘도 출입문이 잠겨 있거나 답장이 옆 건물로 나가면 연락이 이어지지 않는 것과 비슷해요.
- 서비스 자체를 확인합니다. 내부에서
192.168.10.20의 실제 서비스 포트에 접속되는지 봅니다. 프로그램이127.0.0.1에만 대기하고 있지는 않은지, 서버 방화벽이 차단하지는 않는지 확인합니다. - 외부 요청의 도착 여부를 확인합니다. 외부 네트워크에서 시험하고 NAT 장비의 로그나 패킷 캡처를 봅니다. 패킷이 도착하지 않으면 DNS, 상위 공유기, 회선 쪽 경로부터 살펴봅니다.
- 규칙의 조건을 확인합니다. 외부 IP, TCP·UDP 구분, 외부 포트, 내부 IP와 포트가 의도와 같은지 봅니다. TCP 443 규칙으로 UDP 443까지 처리되는 것은 아닙니다.
- 허용 정책을 확인합니다. NAT 장비의 전달 정책과 서버 방화벽에서 해당 통신이 허용되어야 합니다. 방화벽 규칙이 변환 전·후 중 어느 주소를 기준으로 평가되는지는 제품 문서를 확인합니다.
- 응답의 길을 확인합니다. 일반적인 상태 추적 NAT에서는 응답도 변환 정보를 가진 장비를 거쳐야 합니다. 서버의 기본 게이트웨이와 다른 회선으로 빠지는 경로를 확인합니다.
NAT를 통과하는 경로와 회신 경로의 관계는 RFC 3022 §2, pfSense의 구체적인 처리 순서는 Netgate: NAT와 방화벽 처리 순서에서 확인할 수 있습니다.
밖에서는 되는데 사무실 안에서만 안 되는 경우
내부 노트북이 같은 사무실 서버를 공인 주소로 접속하는 상황입니다. 이런 흐름을 안으로 되돌려 연결하는 기능을 Hairpin NAT, NAT Loopback, NAT Reflection 등으로 부릅니다.
장비의 지원 여부와 설정을 확인하거나, 내부 DNS에서는 같은 도메인이 서버의 사설 IP를 가리키게 하는 Split DNS를 검토합니다. DNS는 이름을 IP 주소로 풀어 주는 기능이라, 외부 443과 내부 8443처럼 포트가 다르면 DNS 응답만 바꿔서는 같은 주소로 접속할 수 없다는 점도 함께 봐야 해요. Netgate: NAT Reflection과 Split DNS
내 공유기보다 바깥에도 NAT가 있는 경우
집 공유기 앞에 통신사 공유기가 있으면 주소 변환을 두 번 거칠 수 있습니다. 이중 NAT 환경에서는 안쪽 공유기에만 포트포워딩을 해도 바깥 요청이 도착하지 않을 수 있어요. 상위 장비의 전달 설정이나 회선 구성을 함께 봐야 합니다.
통신사가 여러 가입자의 연결을 모아 변환하는 CGNAT(Carrier-Grade NAT)도 있습니다. 공유기 WAN 주소가 100.64.0.0/10, 즉 100.64.0.0부터 100.127.255.255 범위라면 통신사 공유 주소 공간을 사용하는지 확인해 보세요. 이 범위는 192.168.x.x와 같은 RFC 1918 사설 주소와는 구분됩니다. RFC 6598: 통신사용 공유 주소 공간
이 주소가 보인다는 이유만으로 모든 구성을 단정하지는 않습니다. 공유기의 WAN 주소와 외부에서 관찰되는 주소를 비교하고 회선 제공자에게 확인합니다. 직접 관리할 수 없는 상위 NAT가 있다면 공인 IP 제공 여부나 별도의 접속 방식을 검토해야 합니다.
NAT를 볼 때는 패킷에 적힌 보낸 사람과 받는 사람부터 읽어 보세요. 노트북이 보낸 요청 하나와 서버로 들어온 요청 하나를 종이에 적고, 경계에서 바뀌는 값을 표시하면 됩니다. 이름을 전부 외우기 전에, 어느 주소가 왜 바뀌는지부터 보이기 시작할 거예요.


![[쿠버네티스 학습 04] 클러스터 구성과 Calico 연결](https://blog.maruops.com/wp-content/uploads/2026/10/maruops-photo-014-768x511.jpg)
![[쿠버네티스 학습 06] Service·DNS와 Windows에서의 접속 경로](https://blog.maruops.com/wp-content/uploads/2026/10/maruops-photo-013-768x509.jpg)