📚 네트워크 · 패킷 분석 › 04. 네트워크 장비 실습 — 177편
이전 글: 176. NAT · 다음 글: 178. ACL
PAT(Port Address Translation) 는 여러 내부 호스트의 출발지 주소를 공인 IP 하나로 바꾸면서, 각 연결을 출발지 포트로 구분하는 방식입니다. Cisco 계열에서는 NAT Overload, RFC 문서와 Linux 쪽에서는 NAPT, Linux의 동적 형태는 MASQUERADE라는 이름으로 불립니다. 원리와 역추적 절차는 49. 사설 IP · 공인 IP와 NAT — 로그의 IP가 서로 다른 이유에서 다뤘으므로, 이 글은 장비 설정과 운영에 집중합니다.
| 항목 | Static / Dynamic NAT (176. NAT) | PAT |
|---|---|---|
| 필요한 공인 IP 수 | 내부 호스트 수만큼(동시 사용 기준) | 1개로 가능 |
| 연결 구분 기준 | IP | IP + 포트(ICMP는 Query ID) |
| 외부에서 먼저 연결 | Static은 가능 | 불가 (포트 포워딩 설정이 있어야 함) |
| 주 용도 | 서버 공개, 주소 풀 운영 | 사용자망의 인터넷 사용 |
사용자 PC 두 대가 같은 외부 서버에 접속할 때 PAT 장비의 처리입니다.
PC-A 192.168.10.11:51514 ─┐ ┌→ 198.51.100.20:443
PC-B 192.168.10.12:51514 ─┤→ [PAT 라우터 203.0.113.2] ─┤
│ 변환 테이블 │
│ .11:51514 ⇄ 203.0.113.2:51514
│ .12:51514 ⇄ 203.0.113.2:1024 ← 포트 충돌 → 다른 포트 할당
↓
응답 dst 203.0.113.2:1024 → 테이블 조회 → 192.168.10.12:51514 로 역변환
변환 항목이 유지되는 시간은 장비마다 다르며 로그 대조에 직접 영향을 줍니다.
| 구분 | Cisco IOS 계열 기본값(버전별 확인) | Linux conntrack 확인 방법 |
|---|---|---|
| TCP 연결 | 86400초 (ip nat translation tcp-timeout) | sysctl net.netfilter.nf_conntrack_tcp_timeout_established |
| TCP FIN/RST 후 | 60초 (finrst-timeout) | ..._tcp_timeout_close_wait 등 상태별 값 |
| UDP | 300초 (udp-timeout) | sysctl net.netfilter.nf_conntrack_udp_timeout |
| DNS | 60초 (dns-timeout) | UDP 값 적용 |
| ICMP | 60초 (icmp-timeout) | sysctl net.netfilter.nf_conntrack_icmp_timeout |
SNAT(snat to)가 권장됩니다.실습 예시 — GNS3 등의 Cisco IOS 계열 경계 라우터 설정입니다. Gi0/0이 외부(203.0.113.2), Gi0/1이 사용자망(192.168.10.1)이며 값은 예시(값은 환경마다 다름)입니다.
interface GigabitEthernet0/0
ip nat outside
interface GigabitEthernet0/1
ip nat inside
access-list 1 permit 192.168.10.0 0.0.0.255
ip nat inside source list 1 interface GigabitEthernet0/0 overload
출력 형식 예시입니다.
R1# show ip nat translations
Pro Inside global Inside local Outside local Outside global
tcp 203.0.113.2:51514 192.168.10.11:51514 198.51.100.20:443 198.51.100.20:443
tcp 203.0.113.2:1024 192.168.10.12:51514 198.51.100.20:443 198.51.100.20:443
udp 203.0.113.2:40211 192.168.10.11:40211 198.51.100.53:53 198.51.100.53:53
실습 예시 — Linux 게이트웨이 VM에서 같은 기능을 구성합니다(ens33이 외부, ip_forward=1 가정, 런타임 설정).
# nftables (Rocky/Ubuntu 공통)
sudo nft add table ip nat
sudo nft 'add chain ip nat postrouting { type nat hook postrouting priority 100 ; }'
sudo nft add rule ip nat postrouting oifname "ens33" ip saddr 192.168.10.0/24 masquerade
# iptables 방식으로 쓰는 경우의 같은 의미
# sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ens33 -j MASQUERADE
# Rocky: firewalld로 구성 (외부 인터페이스가 속한 zone에 적용)
sudo firewall-cmd --zone=external --change-interface=ens33 --permanent
sudo firewall-cmd --zone=external --add-masquerade --permanent
sudo firewall-cmd --reload
external zone은 firewalld 기본 zone 중 masquerade가 이미 켜져 있는 zone입니다. 변환 결과는 sudo conntrack -L -s 192.168.10.0/24의 reply 튜플에서 공인 IP·변환 포트로 확인합니다.
📷 [실습 화면 삽입 위치] 내부 VM 두 대가 같은 외부 주소로 접속한 뒤 게이트웨이의 conntrack 결과에서 두 연결의 reply 목적지 포트가 서로 다르게 할당된 부분을 표시한 화면
| 흔적 | 확인할 수 있는 것 |
|---|---|
| 방화벽·라우터 NAT 로그 | 시각 + 공인 IP:포트 ↔ 내부 IP:포트 |
| 변환 테이블 크기, 포트 사용률 | 한 내부 호스트의 과도한 연결 수 |
| 외부 기관 통보(공인 IP, 포트, 시각) | 역추적 시작점 |
관제자가 확인할 질문
오탐 주의: 브라우저·업데이트 프로그램은 정상적으로도 동시 연결을 많이 만듭니다. 변환 항목 수만으로 판단하지 말고 목적지 분포와 연결 결과를 함께 봅니다. PAT 환경의 Firewall NAT 정책은 186. Firewall NAT 정책에서 이어집니다.
overload로 설정합니다.ip nat inside source list 1 interface g0/0 overload에서 ACL 1은 변환 대상 출발지를 고르는 용도입니다.masquerade, iptables MASQUERADE, firewalld --add-masquerade로 구성합니다.