📚 네트워크 · 패킷 분석 › 02. 포트 · 프로토콜 분석 — 71편
이전 글: 70. DNS 레코드와 질의 유형 · 다음 글: 72. LDAP·Kerberos 포트 — 인증 인프라 트래픽 개요
참고: 31. Ethernet 프레임과 MAC 주소 · ARP 동작 원리 — 브로드캐스트 도메인 개념
앞 글에서 본 DORA 과정에는 인증 단계가 없습니다. 클라이언트는 "가장 먼저 도착한 Offer"를 대체로 받아들이고, 서버는 "요청한 MAC"이 진짜 장비인지 확인하지 않습니다. 이 두 가지 신뢰가 곧 두 가지 공격의 출발점입니다.
관제 입장에서는 공격 자체보다 "평소와 다른 DHCP 서버가 응답한다", "MAC이 끝없이 바뀌는 요청이 몰린다" 는 이상 징후를 알아채는 것이 중요합니다. 이 글은 공격 도구 사용법은 다루지 않고, 원리와 탐지·대응만 다룹니다.
| 구분 | 비인가 DHCP 서버 | DHCP 고갈 |
|---|---|---|
| 악용하는 약점 | 클라이언트가 Offer 발신자를 검증하지 않음 | 서버가 요청 MAC의 진위를 검증하지 않음 |
| 주 목적 | 트래픽 가로채기(중간자), DNS 조작 | 서비스 거부, 위장 공격 준비 |
| 관찰 포인트 | Offer의 옵션 54·3·6 값 | Discover 발신 MAC 수, 풀 사용률 |
| 대표 방어 | DHCP Snooping 신뢰 포트 | 포트 보안(MAC 수 제한), Snooping Rate Limit |
"비인가"는 꼭 공격자만 뜻하지 않습니다. 실제로 흔한 원인은 다음과 같습니다.
| 원인 | 설명 | 성격 |
|---|---|---|
| 가정용 공유기 연결 | 직원이 사무실 포트에 공유기의 LAN 포트를 연결 | 설정 실수 |
| 가상화 소프트웨어 | VM의 NAT/브리지 설정이 잘못되어 DHCP가 외부로 노출 | 설정 실수 |
| 테스트 서버 | 개발자가 테스트용 DHCP 서비스를 운영망에 띄움 | 정책 위반 |
| 공격자 장비 | 의도적으로 게이트웨이·DNS를 자기 주소로 배포 | 공격 |
원인이 무엇이든 결과는 같습니다. 일부 단말이 잘못된 게이트웨이·DNS·IP 대역을 받아 통신 장애 또는 트래픽 노출이 발생합니다. 그래서 관제에서는 원인과 무관하게 "등록되지 않은 DHCP 서버의 응답" 자체를 경보 대상으로 봅니다.
DHCP 서버는 요청마다 chaddr(클라이언트 하드웨어 주소) 필드의 MAC을 기준으로 임대를 기록합니다. 매 요청마다 다른 MAC을 넣으면 서버는 모두 다른 단말로 인식해 IP를 하나씩 내어 줍니다. /24 풀은 수백 개에 불과하므로 짧은 시간에 소진될 수 있습니다.
| 기술 | 위치 | 원리 |
|---|---|---|
| DHCP Snooping | 액세스 스위치 | 신뢰(trusted) 포트에서 온 서버 메시지만 허용, 비신뢰 포트의 Offer/ACK 차단 |
| Snooping Rate Limit | 액세스 스위치 | 포트당 초당 DHCP 패킷 수 제한 |
| Port Security | 액세스 스위치 | 포트당 학습 가능한 MAC 수 제한 |
| DAI / IP Source Guard | 액세스 스위치 | Snooping 바인딩 테이블(IP-MAC-포트)을 근거로 ARP·IP 위조 차단 |
| DHCP 서버 측 감시 | DHCP 서버 | 풀 사용률, 신규 MAC 급증 모니터링 |
스위치 설정의 자세한 실습은 (04 장비 시리즈에서 다룸). 이 글에서는 개념과 대표 명령만 참고로 봅니다.

그림 1. 정상 서버 외의 Offer를 찾는 것이 탐지의 핵심입니다
피해 단말 정상 DHCP 서버 (192.168.10.1) 비인가 서버 (192.168.10.200)
│ │ │
│── DISCOVER (브로드캐스트) ──────────────┬──────────────────→│
│ │←─────────────┘ │
│ │ │
│←──────────── OFFER (GW=192.168.10.200, DNS=192.168.10.200) ─│ ← 더 빨리 도착
│←── OFFER (GW=192.168.10.1, DNS=192.168.10.1) ─│ │
│ │
│── REQUEST (옵션 54 = 192.168.10.200) 브로드캐스트 ───────────→│
│←──────────────────────────── ACK ───────────────────────────│
↓
이후 인터넷 트래픽 → 192.168.10.200 (가짜 게이트웨이) → 실제 게이트웨이
이름 해석 → 192.168.10.200 (가짜 DNS)
핵심은 먼저 도착한 Offer입니다. 비인가 서버가 피해 단말과 같은 스위치에 있고, 정상 서버는 Relay를 거쳐 멀리 있다면 비인가 서버가 이기기 쉽습니다.
공격 장비 1대 (실제 MAC 1개)
│
├─ DISCOVER (chaddr = 가짜 MAC #1) ─→ 서버: 192.168.10.100 제안
├─ DISCOVER (chaddr = 가짜 MAC #2) ─→ 서버: 192.168.10.101 제안
├─ ... ...
└─ DISCOVER (chaddr = 가짜 MAC #N) ─→ 서버: "no free leases"
↓
정상 신규 단말: IP를 받지 못함 (169.254.x.x 자동 사설 주소 등)
169.254.0.0/16 주소를 스스로 붙이는 경우가 많아, 헬프데스크 문의("인터넷이 안 돼요")가 첫 징후가 되기도 합니다.실습 환경: 본인 소유 Linux VM (Rocky Linux 또는 Ubuntu), 인터페이스는 ens33을 예시로 사용합니다.
⚠️ 이 실습은 수동 관찰(탐지)만 합니다. DHCP 서버를 새로 띄우거나 대량 요청을 보내는 행위는 하지 않습니다. 같은 네트워크의 다른 단말에 실제 장애를 일으킬 수 있기 때문입니다.
# tcpdump 설치
# Rocky: sudo dnf install -y tcpdump
# Ubuntu: sudo apt install -y tcpdump
# 서버 → 클라이언트 방향(출발 포트 67)만 캡처해 파일로 저장
sudo tcpdump -i ens33 -n -w /tmp/dhcp_server.pcap 'udp src port 67'
다른 터미널에서 VM 콘솔로 DHCP 재요청을 유도합니다(앞 글과 동일).
sudo nmcli con down "ens33" && sudo nmcli con up "ens33" # NetworkManager
sudo networkctl reconfigure ens33 # systemd-networkd
캡처를 Ctrl+C로 멈추고, 응답한 서버의 IP·MAC을 뽑습니다.
# 응답 서버의 Server-ID(옵션 54)만 추출해 중복 제거
sudo tcpdump -n -v -r /tmp/dhcp_server.pcap | grep "Server-ID" | sort | uniq -c
# 응답 패킷의 출발지 MAC 확인
sudo tcpdump -n -e -r /tmp/dhcp_server.pcap | awk '{print $2}' | sort | uniq -c
📷 [실습 화면 삽입]
uniq -c결과로 Server-ID가 1개(정상 서버)만 나온 화면
아래는 학습용 간단 스크립트입니다. 정상 서버 IP를 ALLOWED에 적어 두고, 다른 Server-ID가 보이면 로그로 남깁니다.
sudo tee /usr/local/bin/dhcp-watch.sh > /dev/null <<'EOF'
#!/bin/bash
# 정상 DHCP 서버 IP (4-1에서 확인한 값으로 변경)
ALLOWED="192.168.10.254"
IFACE="ens33"
tcpdump -i "$IFACE" -n -l -v 'udp src port 67' 2>/dev/null \
| grep --line-buffered "Server-ID" \
| while read -r line; do
srv=$(echo "$line" | awk '{print $NF}')
if [ "$srv" != "$ALLOWED" ]; then
logger -t dhcp-watch "Unexpected DHCP server: $srv"
fi
done
EOF
sudo chmod 700 /usr/local/bin/dhcp-watch.sh
sudo /usr/local/bin/dhcp-watch.sh
tcpdump -l은 출력을 줄 단위 버퍼링으로 바꿔 파이프 처리 지연을 없앱니다.logger -t로 남긴 메시지는 syslog에 기록되므로 중앙 로그 서버·SIEM으로 연동할 수 있습니다.# 경보 확인
sudo journalctl -t dhcp-watch --since today
실습 장비가 없다면 명령 의미만 이해합니다. 아래는 Cisco IOS 계열 스위치 기준 예시입니다.
ip dhcp snooping
ip dhcp snooping vlan 10
!
interface GigabitEthernet0/24 ← 정상 DHCP 서버/업링크 방향
ip dhcp snooping trust
!
interface range GigabitEthernet0/1 - 20 ← 사용자 포트(기본 untrusted)
ip dhcp snooping limit rate 15
!
show ip dhcp snooping binding
📷 [실습 화면 삽입] (Packet Tracer 등 가상 장비 사용 시)
show ip dhcp snooping binding결과
Server-ID 집계 결과 (형식 예시(값은 환경마다 다름))
# 정상 환경
3 Server-ID (54), length 4: 192.168.10.254
# 비인가 서버가 함께 응답하는 환경이라면
3 Server-ID (54), length 4: 192.168.10.254
2 Server-ID (54), length 4: 192.168.10.200
감시 스크립트 경보 (형식 예시(값은 환경마다 다름))
Sep 26 10:15:02 rocky9 dhcp-watch[4321]: Unexpected DHCP server: 192.168.10.200
점검 체크리스트
udp src port 67 캡처에서 Server-ID가 기준선과 일치하는지 확인했다/tmp/dhcp_server.pcap을 정리했다| 관찰 | 정상일 수 있는 경우 | 의심해야 하는 경우 |
|---|---|---|
| Server-ID가 2개 이상 | DHCP 이중화(Failover)로 두 서버가 모두 등록됨 | 등록되지 않은 IP, 사용자 VLAN 안의 IP |
| Offer의 게이트웨이가 표준과 다름 | 해당 VLAN이 원래 다른 게이트웨이 사용 | 일반 PC의 IP가 게이트웨이로 배포됨 |
| Offer의 DNS가 표준과 다름 | 지점별 DNS 서버 운영 | 외부 IP 또는 일반 단말 IP가 DNS로 배포됨 |
| 새 IP 대역(예: 192.168.0.x) 단말 등장 | 신규 VLAN 개통 | 공유기 연결 등으로 다른 대역이 배포됨 |
| 응답 출발지 MAC의 제조사 | 서버·L3 스위치 제조사 | 가정용 공유기 제조사 OUI |
| 관찰 | 정상일 수 있는 경우 | 의심해야 하는 경우 |
|---|---|---|
| DISCOVER 급증 | 정전 복구·일괄 재부팅 | 한 포트·한 출발지 MAC에서 chaddr만 계속 바뀜 |
| 풀 사용률 급상승 | 행사·교육으로 단말 급증 | 짧은 시간 내 100%에 도달, 호스트명 없는 임대 다수 |
no free leases 로그 | 풀 크기가 원래 부족 | 평소 여유 있던 풀에서 갑자기 발생 |
| 169.254.x.x 단말 증가 | 개별 단말 네트워크 설정 문제 | 같은 VLAN에서 동시다발 발생 |
ISC dhcpd 서버에서 풀이 소진되면 다음과 같은 형태가 남습니다.
# 형식 예시(값은 환경마다 다름)
dhcpd[1234]: DHCPDISCOVER from 02:1a:4f:3c:9e:01 via ens33: network 192.168.10.0/24: no free leases
# 짧은 시간 동안 DISCOVER를 보낸 고유 MAC 수 (서버 로그 기준, Rocky 경로 예)
sudo grep "DHCPDISCOVER from" /var/log/messages | awk '{print $8}' | sort -u | wc -l
# 패킷 기준: DISCOVER의 이더넷 출발지 MAC별 개수
sudo tcpdump -i ens33 -n -e -c 500 'udp dst port 67' | awk '{print $2}' | sort | uniq -c | sort -rn | head
로그 필드 위치($8)는 syslog 형식에 따라 달라지므로 먼저 한 줄을 출력해 위치를 확인한 뒤 사용합니다.
흔적이 남는 곳
| 위치 | 비인가 서버 흔적 | 고갈 흔적 |
|---|---|---|
| 스위치(Snooping 활성) | untrusted 포트에서 서버 메시지 차단 로그 | Rate Limit 초과로 포트 err-disable |
| DHCP 서버 | DHCPNAK 증가, 요청의 옵션 54가 자기 IP가 아님 | 신규 MAC 급증, no free leases |
| 단말 | 잘못된 게이트웨이·DNS, 통신 장애 | 169.254 주소, IP 미할당 |
| IDS | DHCP 서버 IP 화이트리스트 룰 위반 | 짧은 시간 다수 DISCOVER 임계값 룰 (06 방화벽·IDS 시리즈에서 다룸) |
대응 흐름 (일반적인 예)
한계와 오탐 주의
no free leases, 신규 MAC 급증, 169.254 주소 단말 증가가 징후입니다.udp src port 67 응답을 이 목록과 비교합니다.다음 글: 11. Telnet과 평문 프로토콜의 위험