📚 네트워크 · 패킷 분석 › 04. 네트워크 장비 실습 — 184편
이전 글: 183. Outbound 정책 · 다음 글: 185. Stateful Firewall
방화벽·ACL의 모든 규칙은 조건이 일치했을 때 수행할 동작(Action) 을 가집니다. 가장 기본은 Allow(허용) 와 Deny(거부) 이며, 거부에는 조용히 버리는 Drop과 거부 사실을 알려 주는 Reject 두 방식이 있습니다.
| 동작 | 장비의 처리 | 보낸 쪽이 받는 것 |
|---|---|---|
| Allow (Accept, Permit) | 패킷 통과, 상태 기반이면 세션 생성 | 정상 응답(목적지가 응답할 경우) |
| Drop | 패킷을 버리고 아무것도 보내지 않음 | 없음 → 타임아웃 |
| Reject | 패킷을 버리고 거부 응답 전송 | TCP RST 또는 ICMP Destination Unreachable |
이 글은 장비가 동작을 어떻게 표기하고, 각 동작이 네트워크에 어떤 흔적을 남기는가를 다룹니다. 허용·차단 정책 설계와 Default Deny는 265. Allow Policy·266. Deny Policy·267. Default Deny에서 다룹니다.
같은 TCP 접속 시도(SYN)에 대해 동작별로 벌어지는 일입니다.
[클라이언트] SYN → dst 10.20.0.10:22 → [방화벽]
│
├─ Allow → 서버로 전달 → 서버 SYN/ACK (포트 열림) 또는 RST (포트 닫힘)
│
├─ Drop → 버림, 응답 없음
│ 클라이언트: SYN 재전송 반복 → 수 초~수십 초 후 타임아웃
│
└─ Reject → 버림 + 방화벽이 응답 생성
(a) TCP RST → 클라이언트: 즉시 "Connection refused"
(b) ICMP 3/13 → 클라이언트: 즉시 "No route to host" 등
(Administratively Prohibited)
Reject의 RST는 방화벽이 목적지 서버를 가장해 만든 패킷입니다. 따라서 클라이언트 입장에서는 "서버의 포트가 닫혀 있는 것"과 구분이 어렵습니다.
장비별 표기와 기본 거부 방식입니다.
| 장비·도구 | 허용 | 거부 표기 | 기본 거부 방식 |
|---|---|---|---|
| Cisco IOS ACL | permit | deny | 버림 + ICMP Unreachable(관리상 금지)을 속도 제한하여 전송, 인터페이스에서 no ip unreachables로 끔 |
| nftables | accept | drop, reject | reject만 쓰면 ICMP Port Unreachable 계열, reject with tcp reset 등으로 지정 |
| iptables | -j ACCEPT | -j DROP, -j REJECT | REJECT 기본은 icmp-port-unreachable, --reject-with tcp-reset 가능 |
| firewalld | accept (rich rule) | drop, reject | zone 기본 target은 ICMP를 제외하고 거부(REJECT 계열), DROP target 선택 가능 |
Drop과 Reject의 선택 기준
| 기준 | Drop | Reject |
|---|---|---|
| 외부에 주는 정보 | 적음 (장비·포트 존재가 불분명) | 방화벽이 있음을 알려 줌 |
| 정상 사용자의 체감 | 타임아웃까지 대기 | 즉시 실패 → 재시도·장애 파악이 빠름 |
| 위조 출발지 공격 시 | 응답을 만들지 않음 | 위조된 출발지로 응답을 보내게 됨 |
| 주로 쓰는 곳 | 인터넷 경계 Inbound | 내부 구간, Outbound 차단 |
filtered, RST를 받으면 closed로 판정됩니다. 방화벽이 tcp reset으로 Reject하면 실제로는 막힌 포트가 closed로 보일 수 있습니다(208. SYN Scan).실습 예시 — 방화벽 VM(nftables)에서 같은 서버 포트에 대해 세 가지 동작을 차례로 적용하고, 클라이언트 반응을 비교합니다(Rocky/Ubuntu 공통, 180. DMZ의 inet fw forward 체인 가정). 값은 예시(값은 환경마다 다름)입니다.
# (1) Drop
sudo nft insert rule inet fw forward ip daddr 10.20.0.10 tcp dport 22 counter drop
# (2) Reject - TCP RST
sudo nft insert rule inet fw forward ip daddr 10.20.0.10 tcp dport 22 counter reject with tcp reset
# (3) Reject - ICMP 관리상 금지
sudo nft insert rule inet fw forward ip daddr 10.20.0.10 tcp dport 22 counter reject with icmpx type admin-prohibited
# 확인·삭제: handle 번호로 지움 (한 번에 하나씩 적용해 비교)
sudo nft -a list chain inet fw forward
sudo nft delete rule inet fw forward handle <번호>
클라이언트에서 각 경우의 반응을 확인합니다.
# 클라이언트 VM
time nc -vz -w 10 10.20.0.10 22
sudo tcpdump -nn -i ens160 'host 10.20.0.10 and (tcp port 22 or icmp)'
결과 형식 예시(메시지는 도구·버전마다 다름):
| 적용 동작 | nc 반응 | tcpdump에 보이는 것 |
|---|---|---|
| Drop | 약 10초 후 timed out | SYN 재전송만 반복 |
| Reject (tcp reset) | 즉시 Connection refused | SYN → RST, ACK |
| Reject (admin-prohibited) | 즉시 No route to host | SYN → ICMP host 10.20.0.10 unreachable - admin prohibited filter |
📷 [실습 화면 삽입 위치] 세 가지 동작을 차례로 적용했을 때의
time nc -vz결과와 tcpdump 출력을 나란히 놓아 타임아웃·RST·ICMP 3/13의 차이를 표시한 화면
| 로그·패킷 흔적 | 해석 |
|---|---|
| 방화벽 로그 action = allow | 연결이 통과함(서버가 실제로 응답했는지는 세션 바이트로 확인) |
| action = drop / deny | 통과하지 못함, 보낸 쪽은 타임아웃 |
| action = reject / reset | 통과하지 못함, 보낸 쪽은 즉시 실패를 인지 |
| 캡처에서 ICMP Type 3 Code 13 | 경로상 장비의 관리상 금지(필터) 응답 |
관제자가 확인할 질문
오탐 주의: "차단 로그가 있다 = 공격이 막혔다"로 끝내지 않습니다. 같은 행위가 다른 경로로 허용되었는지 함께 확인해야 합니다. 방화벽 로그의 action 필드 해석은 187. Firewall Log에서 이어집니다.