NAT는 네트워크를 공부하다 보면 자주 만나는 개념입니다.
처음에는 NAT를 단순히 “사설 IP를 공인 IP로 변환하는 기술” 정도로 이해했습니다.
그런데 실제 운영 중인 장비에서는 이 개념이 어떤 설정과 규칙으로 나타나는지 궁금해졌습니다.
따라서, 이번 글에서는 UniFi USG-Pro-4에 SSH로 접속해 NAT 관련 설정을 살펴보겠습니다.
- 운영 중인 장비이기 때문에 설정 변경은 하지 않았고, 조회 명령만 사용했습니다.
- 공인 IP, 사설 IP 일부, 비표준 포트, 내부 서버 정보는 보안상 마스킹했습니다.

NAT가 필요한 이유
IPv4 주소는 32비트로 구성되어 있으며, 이론상 약 43억 개의 주소를 표현할 수 있습니다.
하지만 이 주소를 모두 공인 IP로 사용할 수 있는 것은 아니고,
오늘날 인터넷에 연결되는 기기 수를 생각하면 이 정도 주소 공간만으로는 부족합니다.
그래서 내부 네트워크에서는 보통 사설 IP를 사용합니다.
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
사설 IP는 회사, 가정, 연구실 같은 내부 네트워크에서는 사용할 수 있지만, 인터넷에서는 직접 라우팅되지 않습니다.
예를 들어 내부 장비가 192.168.xxx.xxx 주소를 가지고 있다고 해서, 이 주소 그대로 인터넷 서버와 통신할 수는 없습니다.
인터넷 입장에서는 해당 사설 IP가 어느 네트워크의 어떤 장비인지 알 수 없기 때문입니다.
이때 필요한 기술이 NAT(Network Address Translation)입니다.
NAT는 내부 사설 IP를 외부 인터넷에서 사용할 수 있는 주소로 변환해주는 기술입니다.
책의 예시로 보는 NAT 구조
책에 나오는 NAT 구조를 기준으로 먼저 개념을 짚고 넘어가겠습니다.
[내부 호스트]
172.18.3.1
...
↓
[NAT 라우터]
Inside: 172.18.3.30
Outside: 200.24.5.8
↓
[외부 서버]
예시에서 사설 네트워크가 172.18.3.x 대역을 사용합니다.
172.18.3.1
172.18.3.2
...
172.18.3.20
이 주소들은 내부 네트워크에서는 사용할 수 있지만, 외부 인터넷에서는 직접 사용할 수 없습니다.
중간의 NAT 라우터는 두 개의 주소를 가집니다.
내부 방향 주소: 172.18.3.30
외부 방향 주소: 200.24.5.8
내부 호스트가 인터넷으로 나가면, NAT 라우터는 출발지 주소를 내부 사설 IP에서 자신의 외부 주소로 변환합니다.
예를 들어 172.18.3.1이 외부 서버에 접근한다고 해보겠습니다.
변환 전:
172.18.3.1 → 외부 서버
변환 후:
200.24.5.8 → 외부 서버
외부 네트워크에서는 내부의 172.18.3.1을 직접 볼 수 없습니다.
외부에서 보이는 주소는 NAT 라우터의 외부 주소인 200.24.5.8입니다.
이 구조를 실제 운영 환경에 대입하면, NAT 라우터 역할을 UniFi USG-Pro-4가 수행한다고 볼 수 있습니다.
SNAT, DNAT, PAT 구분
NAT는 어떤 주소를 변환하느냐에 따라 나눌 수 있습니다.
| 구분 | 의미 | 대표 방향 |
| SNAT | Source NAT, 출발지 주소 변환 | 내부 → 외부 |
| DNAT | Destination NAT, 목적지 주소 변환 | 외부 → 내부 |
| PAT | Port Address Translation, 포트까지 함께 변환 | 여러 내부 장비 → 하나의 외부 IP |
간단히 정리하면 다음과 같습니다.
- SNAT : 내부 장비가 인터넷으로 나갈 때 출발지 IP를 바꾸는 방식
- DNAT : 외부에서 들어온 요청의 목적지 IP를 내부 서버로 바꾸는 방식
- PAT : 여러 내부 장비의 연결을 포트 번호로 구분하여 하나의 공인 IP를 공유하는 방식
실제 환경에서 확인
이제 운영 중인 UniFi 장비에서 NAT 관련 설정을 직접 확인해보겠습니다.
show interfaces
show ip route
show nat rules
show configuration commands | grep -i port-forward
sudo iptables -t nat -L POSTROUTING -n -v --line-numbers
sudo iptables -t nat -S | grep -E "DNAT|SNAT|MASQUERADE"
아래 정보는 보안상 이유로 마스킹했습니다.
공인 IP
사설 IP 일부
비표준 포트
내부 서버 주소
장비 식별 정보
서비스 설명 일부
...
인터페이스 확인
show interfaces
필요한 부분만 가져오면 아래와 같습니다.
Interface IP Address S/L Description
--------- ---------- --- -----------
eth0 192.168.xxx.1/23 u/u LAN
eth1 - A/D
eth2 203.xxx.xxx.xxx/24 u/u WAN
eth3 - A/D
lo 127.0.0.1/8 u/u
eth0은 내부 네트워크와 연결된 LAN 인터페이스이고, eth2는 외부 인터넷과 연결된 WAN 인터페이스입니다.
구조로 보면 다음과 같습니다.
내부 네트워크
192.168.xxx.0/23
↓
eth0 - USG-Pro-4 - eth2
↓
외부 네트워크
203.xxx.xxx.xxx/24
NAT는 이 LAN과 WAN 사이에서 발생합니다.
라우팅 경로 확인
다음으로 외부 트래픽이 어떤 경로로 나가는지 확인했습니다.
show ip route
주요 출력은 아래와 같습니다.
S>* 0.0.0.0/0 [1/0] via 203.xxx.xxx.1, eth2
C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.xxx.0/23 is directly connected, eth0
C>* 203.xxx.xxx.0/24 is directly connected, eth2
출력 결과에서 핵심은 기본 경로입니다.
0.0.0.0/0 via 203.xxx.xxx.1, eth2
목적지를 알 수 없는 외부 트래픽은 eth2를 통해 WAN 방향으로 나갑니다.
내부 장비는 192.168.xxx.xxx 형태의 사설 IP를 사용하고 있습니다.
즉, 이 주소 그대로 인터넷에 나갈 수 없기 때문에, WAN으로 나가기 전 출발지 주소 변환이 필요하다는 것을 알 수 있습니다.
SNAT / Masquerade 확인
설정된 NAT 규칙을 확인해보겠습니다.
show nat rules
NAT와 관련된 부분만 보면 다음과 같습니다.
rule type intf translation
---- ---- ---- -----------
6001 MASQ eth2 saddr ANY to 203.xxx.xxx.xxx
proto-all sport ANY
6002 MASQ eth2 saddr ANY to 203.xxx.xxx.xxx
proto-all sport ANY
6003 MASQ eth2 saddr ANY to 203.xxx.xxx.xxx
proto-all sport ANY
여기서 MASQ는 Masquerade를 의미합니다.
Masquerade는 SNAT의 한 형태로 볼 수 있습니다.
내부 장비가 외부로 나갈 때 출발지 주소를 WAN 인터페이스의 주소로 바꿔줍니다.
변환 전:
192.168.xxx.xxx → 외부 서버
변환 후:
203.xxx.xxx.xxx → 외부 서버
즉, 내부 장비의 사설 IP가 그대로 인터넷에 노출되는 것이 아니라, USG-Pro-4의 WAN IP로 변환되어 외부와 통신합니다.
iptables에서 SNAT 확인
USG-Pro-4 내부에서는 NAT 규칙이 iptables NAT 테이블에도 반영되어 있었습니다.
sudo iptables -t nat -L POSTROUTING -n -v --line-numbers
NAT와 관련된 부분만 보면 다음과 같습니다.
Chain POSTROUTING (policy ACCEPT)
num pkts bytes target prot in out source destination
4 ... ... MASQUERADE all * eth2 0.0.0.0/0 0.0.0.0/0 match-set corporate_network src /* NAT-6001 */
5 ... ... MASQUERADE all * eth2 0.0.0.0/0 0.0.0.0/0 match-set remote_user_vpn_network src /* NAT-6002 */
6 ... ... MASQUERADE all * eth2 0.0.0.0/0 0.0.0.0/0 match-set guest_network src /* NAT-6003 */
POSTROUTING은 패킷이 외부 인터페이스로 나가기 직전에 적용되는 단계를 의미합니다.
이 지점에서 MASQUERADE가 적용된다는 것은, 내부 네트워크의 출발지 주소가 WAN 인터페이스의 주소로 변환된다는 의미입니다.
따라서 이 규칙은 SNAT에 해당한다고 볼 수 있습니다.
PAT는 어디에 해당할까?
PAT는 IP 주소뿐 아니라 포트 번호까지 함께 변환하여 연결을 구분하는 방식입니다.
여러 내부 장비가 하나의 WAN IP를 공유하려면, 게이트웨이는 각 연결이 어느 내부 장비에서 시작되었는지 구분해야 합니다.
이때 포트 번호가 함께 사용됩니다.
예를 들어 내부에서는 다음과 같은 연결이 발생할 수 있습니다.
192.168.xxx.10:50001 → 외부 서버:443
192.168.xxx.20:50002 → 외부 서버:443
192.168.xxx.30:50003 → 외부 서버:443
NAT 이후 외부에서 보기에는 다음처럼 보일 수 있습니다.
203.xxx.xxx.xxx:40001 → 외부 서버:443
203.xxx.xxx.xxx:40002 → 외부 서버:443
203.xxx.xxx.xxx:40003 → 외부 서버:443
외부에서 보면 모두 같은 WAN IP를 사용하는 것처럼 보입니다.
USG-Pro-4는 포트 번호와 연결 추적 정보를 기준으로 응답을 원래 내부 장비에 돌려보냅니다.
운영 장비에서 PAT라는 이름의 규칙이 따로 보이지는 않았습니다.
다만 여러 내부 네트워크가 MASQUERADE 규칙을 통해 하나의 WAN IP로 나가고 있으므로,
일반적인 인터넷 접속 과정에서는 포트 번호를 이용해 각 연결을 구분한다고 이해할 수 있습니다.
실제 포트 매핑 상태까지 보려면 NAT 규칙뿐 아니라 연결 추적 정보까지 함께 확인해야 합니다.
DNAT / Port Forwarding 확인
이번에는 외부에서 내부로 들어오는 흐름을 보겠습니다.
UniFi 설정에서 Port Forwarding 규칙을 확인할 수 있었습니다.
show configuration commands | grep -i port-forward
Port Forwarding 관련 설정만 보면 다음과 같습니다.
set port-forward hairpin-nat enable
set port-forward lan-interface eth0
set port-forward wan-interface eth2
set port-forward rule 3003 forward-to address 192.168.xxx.xxx
set port-forward rule 3003 original-port 80
set port-forward rule 3003 protocol tcp_udp
set port-forward rule 3004 forward-to address 192.168.xxx.xxx
set port-forward rule 3004 original-port 443
set port-forward rule 3004 protocol tcp_udp
여기서 hairpin NAT는 내부 사용자가 내부 서버를 공인 IP나 도메인으로 접근할 때도
Port Forwarding 흐름을 사용할 수 있게 해주는 설정입니다.
Port Forwarding은 외부에서 WAN IP의 특정 포트로 들어온 요청을 내부 서버로 전달하는 기능입니다.
외부 사용자
↓
USG-Pro-4 WAN IP:80
↓
Port Forwarding
↓
192.168.xxx.xxx:80
HTTPS도 같은 방식입니다.
외부 사용자
↓
USG-Pro-4 WAN IP:443
↓
Port Forwarding
↓
192.168.xxx.xxx:443
이 동작은 목적지 주소를 변환하므로 DNAT에 해당합니다.
iptables에서 DNAT 확인
iptables NAT 테이블에서도 DNAT 규칙을 확인할 수 있었습니다.
sudo iptables -t nat -S | grep -E "DNAT|SNAT|MASQUERADE"
DNAT 처리 흐름은 아래와 같습니다.
-A PREROUTING -j UBNT_PFOR_DNAT_HOOK
-A UBNT_PFOR_DNAT_HOOK -i eth2 -m set --match-set ADDRv4_eth2 dst -j UBNT_PFOR_DNAT_RULES
-A UBNT_PFOR_DNAT_RULES -p tcp --dport 80 -j DNAT --to-destination 192.168.xxx.xxx
-A UBNT_PFOR_DNAT_RULES -p udp --dport 80 -j DNAT --to-destination 192.168.xxx.xxx
-A UBNT_PFOR_DNAT_RULES -p tcp --dport 443 -j DNAT --to-destination 192.168.xxx.xxx
-A UBNT_PFOR_DNAT_RULES -p udp --dport 443 -j DNAT --to-destination 192.168.xxx.xxx
PREROUTING은 패킷이 라우팅되기 전에 먼저 거치는 단계입니다.
외부에서 WAN IP의 특정 포트로 들어온 요청은 이 단계에서 내부 사설 IP로 목적지가 변경됩니다.
즉, UniFi의 Port Forwarding 설정은 내부적으로 iptables의 DNAT 규칙으로 반영되어 있었습니다.
정리
운영 중인 UniFi USG-Pro-4에서 NAT 관련 설정을 확인한 결과는 다음과 같습니다.
| 구분 | 확인한 내용 |
| LAN / WAN 구조 | eth0 = LAN, eth2 = WAN |
| 기본 라우팅 | 외부 트래픽은 eth2를 통해 WAN으로 전달 |
| SNAT | MASQUERADE 규칙으로 내부 주소를 WAN IP로 변환 |
| PAT | 여러 내부 장비가 하나의 WAN IP를 공유하며 포트로 연결 구분 |
| DNAT | Port Forwarding 설정이 iptables의 DNAT 규칙으로 반영 |
방향만 놓고 보면 NAT의 역할은 다음처럼 나눌 수 있습니다.
내부 → 외부:
SNAT / Masquerade / PAT
외부 → 내부:
DNAT / Port Forwarding
책에서 개념으로만 봤던 NAT는 실제 운영 장비에서도 구체적인 규칙으로 확인할 수 있었습니다.
UniFi USG-Pro-4에서는 내부에서 외부로 나가는 트래픽에 MASQUERADE 규칙이 적용되어 SNAT/PAT 성격으로 처리되고 있었고,
외부에서 내부로 들어오는 요청은 Port Forwarding 설정을 통해 DNAT 규칙으로 처리되고 있었습니다.
이처럼 NAT는 단순히 “사설 IP를 공인 IP로 바꿔준다”는 설명으로만 끝나는 기능이 아니라,
트래픽 방향에 따라 서로 다른 규칙으로 처리되는 기능이라고 볼 수 있습니다.
참고자료
Book: Data Communications and Networking / Behrouz A. Forouzan 저
'Why?' 카테고리의 다른 글
| 리눅스는 어떻게 부팅될까? (EC2 로그로 따라가 보기) (0) | 2026.05.18 |
|---|