📚 네트워크 · 패킷 분석 › 04. 네트워크 장비 실습 — 176편
이전 글: 175. Routing 경로 분석 · 다음 글: 177. PAT
사설·공인 IP의 구분, SNAT·DNAT의 차이, conntrack으로 변환 흔적을 읽는 방법은 49. 사설 IP · 공인 IP와 NAT — 로그의 IP가 서로 다른 이유에서 다뤘습니다. 이 글은 장비에서 NAT를 어떻게 설정하고, 장비가 어떤 순서로 처리하는가를 다룹니다. 포트까지 바꾸는 PAT는 177. PAT, 방화벽 정책과 결합된 NAT는 186. Firewall NAT 정책에서 이어집니다.
Cisco 계열 장비는 NAT를 설정할 때 인터페이스를 inside(내부)와 outside(외부)로 먼저 지정하고, 주소를 네 가지 관점으로 부릅니다.
| 용어 | 의미 | 예 |
|---|---|---|
| Inside Local | 내부 호스트의 실제(사설) 주소 | 10.20.0.10 |
| Inside Global | 외부에서 보이는 내부 호스트 주소(변환 후) | 203.0.113.10 |
| Outside Local | 내부에서 보이는 외부 호스트 주소 | 198.51.100.20 (보통 Global과 같음) |
| Outside Global | 외부 호스트의 실제 주소 | 198.51.100.20 |
"Local = 내부 쪽에서 본 주소, Global = 외부 쪽에서 본 주소"로 기억하면 show ip nat translations 출력을 읽기 쉽습니다.
NAT가 라우팅 전인지 후인지는 장비 설정과 로그 해석 모두에 중요합니다.
[Cisco IOS 계열]
inside → outside : 라우팅 판단 → NAT(출발지 변환) → 송신
outside → inside : NAT(목적지 역변환) → 라우팅 판단 → 송신
[Linux netfilter]
수신 → PREROUTING(DNAT) → 라우팅 판단 → FORWARD(필터) → POSTROUTING(SNAT) → 송신
Linux 기준으로 보면 결과가 분명합니다.
변환이 적용되는 조건과 방식에 따라 NAT를 나눌 수 있습니다.
| 방식 | 매핑 | 주요 용도 | Cisco IOS 명령 형태 |
|---|---|---|---|
| Static NAT | 사설 1개 ↔ 공인 1개 고정 | 외부에 공개하는 서버 | ip nat inside source static <local> <global> |
| Dynamic NAT | 사설 여러 개 → 공인 풀에서 순서대로 | 공인 주소가 여러 개일 때 | ip nat inside source list <ACL> pool <풀이름> |
| PAT (Overload) | 사설 여러 개 → 공인 1개 + 포트 | 일반 인터넷 사용 | ... overload (177. PAT) |
Dynamic NAT에서 풀의 공인 주소가 모두 사용 중이면 새 연결은 변환되지 못해 통신이 실패합니다.
ip nat inside source list 1 ...의 ACL 1은 "변환할 출발지"를 고르는 용도이며, 트래픽을 막는 필터가 아닙니다(178. ACL).show ip nat translations나 conntrack -L은 현재 상태만 보여 주며, 과거 추적에는 NAT 로그를 따로 남겨야 합니다.실습 예시 — GNS3 등의 Cisco IOS 계열 경계 라우터 설정입니다. Gi0/0이 외부(203.0.113.2/28), Gi0/1이 내부 서버망(10.20.0.1/24)이며 값은 예시(값은 환경마다 다름)입니다.
interface GigabitEthernet0/0
ip address 203.0.113.2 255.255.255.240
ip nat outside
interface GigabitEthernet0/1
ip address 10.20.0.1 255.255.255.0
ip nat inside
! Static NAT: 웹 서버 공개
ip nat inside source static 10.20.0.10 203.0.113.10
! Dynamic NAT: 서버망 나머지 → 공인 풀
access-list 10 permit 10.20.0.0 0.0.0.255
ip nat pool PUB-POOL 203.0.113.11 203.0.113.14 netmask 255.255.255.240
ip nat inside source list 10 pool PUB-POOL
확인 명령과 출력 형식 예시입니다.
R1# show ip nat translations
Pro Inside global Inside local Outside local Outside global
--- 203.0.113.10 10.20.0.10 --- ---
tcp 203.0.113.11:51000 10.20.0.21:51000 198.51.100.20:443 198.51.100.20:443
R1# show ip nat statistics ! 활성 변환 수, inside/outside 인터페이스, 풀 사용량
---만 있는 첫 줄은 Static NAT의 고정 매핑이고, 두 번째 줄은 실제 연결에 대한 변환 항목입니다.
실습 예시 — Linux 게이트웨이 VM에서 nftables로 같은 동작을 구성합니다(Rocky/Ubuntu 공통, ip_forward=1 가정, ens33이 외부). 재부팅하면 사라지는 런타임 설정입니다.
sudo nft add table ip nat
sudo nft 'add chain ip nat prerouting { type nat hook prerouting priority -100 ; }'
sudo nft 'add chain ip nat postrouting { type nat hook postrouting priority 100 ; }'
# Static NAT (양방향 1:1)
sudo nft add rule ip nat prerouting iifname "ens33" ip daddr 203.0.113.10 dnat to 10.20.0.10
sudo nft add rule ip nat postrouting oifname "ens33" ip saddr 10.20.0.10 snat to 203.0.113.10
sudo nft list table ip nat
Rocky에서 firewalld를 쓰는 경우에는 nft 명령을 직접 섞기보다 firewalld의 masquerade·rich rule로 구성하는 것이 관리상 안전합니다. 추가한 공인 IP(203.0.113.10)가 외부 인터페이스에 보조 주소로 설정되어 있거나 상위 장비가 이 주소를 게이트웨이로 보내 주어야 실제로 도달합니다.
📷 [실습 화면 삽입 위치] 외부 역할 VM에서 203.0.113.10:80에 접속한 뒤 게이트웨이의
sudo conntrack -L -d 203.0.113.10결과로 original/reply 튜플이 변환된 모습을 표시한 화면
| 흔적 | 확인할 수 있는 것 |
|---|---|
NAT 로그 (Cisco 계열은 ip nat log translations syslog 설정 시 %IPNAT-6-CREATED 등, 버전마다 다름) | 변환 생성·삭제 시각과 전후 주소 |
| 방화벽 세션 로그의 변환 전·후 필드 | 공인 IP ↔ 내부 호스트 대응 |
show ip nat statistics, conntrack 수 | 변환 자원 사용량 |
관제자가 확인할 질문
오탐 주의: 같은 공인 IP에서 여러 내부 호스트의 트래픽이 섞여 보이는 것은 NAT의 정상 동작입니다. 역추적 절차는 49. 사설 IP · 공인 IP와 NAT — 로그의 IP가 서로 다른 이유, 방화벽 NAT 로그 분석은 268. Firewall NAT에서 다룹니다.