📚 네트워크 · 패킷 분석 › 04. 네트워크 장비 실습 — 180편
이전 글: 179. Network Segmentation · 다음 글: 181. Firewall 정책
DMZ(DeMilitarized Zone) 는 인터넷에 서비스를 공개해야 하는 서버(웹·메일·DNS·리버스 프록시 등)를 두는 완충 구역입니다. 외부 사용자가 접속할 수 있어야 하므로 내부망에 둘 수는 없고, 그렇다고 방화벽 바깥에 그대로 두면 보호를 받지 못합니다. 그래서 외부와 내부 사이에 별도 구역을 만들고, 양쪽 모두와의 통신을 방화벽으로 통제합니다.
DMZ는 179. Network Segmentation의 구역 설계 중 "외부에 노출되어 가장 먼저 침해될 수 있는 구역" 에 해당합니다. 설계의 전제는 "DMZ 서버는 언젠가 침해될 수 있다"이며, 침해되어도 내부망으로 이어지지 않게 하는 것이 목적입니다.
| DMZ에 두는 것 | DMZ에 두지 않는 것 |
|---|---|
| 공개 웹 서버, 리버스 프록시 | 데이터베이스 원본 |
| 메일 게이트웨이(외부 수신용) | 내부 메일 서버·사서함 |
| 외부용 DNS | 내부 도메인 컨트롤러·내부 DNS |
| VPN 게이트웨이(구성에 따라) | 업무 시스템, 파일 서버 |
DMZ를 만드는 대표적인 장비 배치는 두 가지입니다.
[단일 방화벽, 3-leg 구조]
인터넷 ── (outside) [방화벽] (inside) ── 내부망
│
(dmz)
│
DMZ 서버
[이중 방화벽 구조]
인터넷 ── [외부 방화벽] ── DMZ 서버 ── [내부 방화벽] ── 내부망
| 항목 | 단일 방화벽(3-leg) | 이중 방화벽 |
|---|---|---|
| 장비 수 | 1대 (인터페이스 3개 이상) | 2대 |
| 장점 | 구성·관리 단순, 비용 낮음 | 한 방화벽이 뚫려도 다른 하나가 남음 |
| 단점 | 방화벽 1대가 모든 경계를 담당 | 정책 2벌 관리, 비용 |
| 보완 | 인터페이스별 엄격한 정책 | 가능하면 서로 다른 제조사로 구성하기도 함 |
방향별 통신 원칙은 다음과 같습니다. 핵심은 DMZ에서 내부로 먼저 연결을 시작하지 못하게 하는 것입니다.
| 방향 | 원칙 | 예 |
|---|---|---|
| 인터넷 → DMZ | 공개 서비스 포트만 허용 | TCP 443 → 리버스 프록시 |
| DMZ → 내부 | 기본 차단, 꼭 필요한 연결만 개별 허용 | 프록시 → 내부 WAS 8443 한 개 |
| 내부 → DMZ | 관리망에서 관리 포트만 | 관리망 → DMZ SSH |
| DMZ → 인터넷 | 기본 차단, 업데이트·외부 DNS 등만 | 패치 서버 443 |
실습 예시 — NIC 3개를 가진 Linux 방화벽 VM에서 3-leg DMZ의 통과 트래픽 정책을 nftables로 구성합니다(Rocky/Ubuntu 공통, 런타임 설정). ens33=외부, ens37=내부(192.168.10.0/24), ens38=DMZ(10.50.0.0/24)이며 값은 예시(값은 환경마다 다름)입니다. firewalld·ufw가 켜져 있으면 규칙이 섞이므로 실습 VM에서는 하나만 사용합니다.
sudo nft add table inet fw
sudo nft 'add chain inet fw forward { type filter hook forward priority 0 ; policy drop ; }'
# 이미 허용된 연결의 후속 패킷
sudo nft add rule inet fw forward ct state established,related accept
sudo nft add rule inet fw forward ct state invalid drop
# 인터넷 → DMZ 리버스 프록시 443
sudo nft add rule inet fw forward iifname "ens33" oifname "ens38" ip daddr 10.50.0.10 tcp dport 443 accept
# DMZ 프록시 → 내부 WAS 8443 한 개만
sudo nft add rule inet fw forward iifname "ens38" oifname "ens37" ip saddr 10.50.0.10 ip daddr 192.168.10.30 tcp dport 8443 accept
# 내부 → 인터넷
sudo nft add rule inet fw forward iifname "ens37" oifname "ens33" accept
# DMZ에서 내부로 가는 나머지 시도는 기록 후 폐기
sudo nft 'add rule inet fw forward iifname "ens38" oifname "ens37" log prefix "DMZ-TO-IN-DROP " drop'
sudo nft list chain inet fw forward
외부 공인 IP → 10.50.0.10 변환(DNAT)은 176. NAT의 nat 테이블 구성을 함께 적용한다고 가정합니다. 로그는 sudo journalctl -k | grep DMZ-TO-IN-DROP으로 확인합니다.
📷 [실습 화면 삽입 위치] DMZ 서버 VM에서 내부 서버 22번 포트 접속을 시도했을 때 방화벽 VM의 커널 로그에
DMZ-TO-IN-DROP접두어와 IN=ens38 OUT=ens37 필드가 기록된 화면
| 흔적 | 의미 |
|---|---|
| DMZ → 내부 차단 로그 | 침해된 DMZ 서버의 내부 정찰·확산 시도 가능성 (우선순위 높음) |
| DMZ → 인터넷 신규 목적지 연결 | 도구 다운로드, C2 통신 가능성 |
| 인터넷 → DMZ 공개 포트 외 접근 | 일반적인 외부 스캔 (양이 많음) |
| DMZ 서버에서 시작된 대량 DNS 질의 | 비정상 프로세스 가능성 |
관제자가 확인할 질문
오탐 주의: 인터넷 → DMZ 차단 로그는 대부분 무차별 스캔이므로 건수보다 공격 이후 DMZ 서버의 행동 변화를 봅니다. 방화벽 정책 관점의 DMZ 분석은 270. DMZ와 Firewall에서 다룹니다.