📚 네트워크 · 패킷 분석 › 01. TCP/IP 구조 이해 — 31편
이전 글: 30. UDP Datagram · 다음 글: 32. ARP Request와 Reply
참고(리눅스 시스템 기초): ss와 ip 명령어 —ip neigh명령어 자체의 옵션은 이 글에서 다룹니다.
1편에서 "MAC 주소는 구간마다 바뀌고, IP 주소는 목적지까지 유지된다"고 정리했습니다.
그렇다면 컴퓨터는 목적지 IP만 알고 있을 때 다음 구간의 MAC 주소를 어떻게 알아낼까요? 그 답이 ARP입니다.
보안관제에서 L2(데이터링크 계층)가 중요한 이유는 다음과 같습니다.
| Dst MAC | Src MAC | EtherType | Payload (46~1500 byte) | FCS |
| 6 byte | 6 byte | 2 byte | IP 패킷, ARP 메시지 등 | 4 byte |
|<------- Ethernet 헤더 14 byte ------->|
| 필드 | 의미 | 분석 포인트 |
|---|---|---|
| Dst MAC | 이 구간에서 프레임을 받을 장비 | ff:ff:ff:ff:ff:ff면 브로드캐스트(같은 네트워크 전체) |
| Src MAC | 이 구간에서 프레임을 보낸 장비 | 내부 호스트를 식별하는 L2 단서 |
| EtherType | Payload에 무엇이 들어 있는지 | 0x0800 IPv4 · 0x0806 ARP · 0x86DD IPv6 · 0x8100 VLAN 태그 |
| FCS | 오류 검출용 값 | 보통 NIC가 처리하므로 캡처 결과에는 대부분 보이지 않음 |
프리앰블(Preamble)과 SFD도 NIC 하드웨어가 처리하므로 Wireshark에서는 보이지 않습니다.
00:0c:29 : aa:bb:cc
└ OUI ┘ └ 장비 고유 번호 ┘
(제조사 식별, 24bit)
| 구분 | 판별 방법 | 관제에서의 의미 |
|---|---|---|
| OUI(앞 3바이트) | 제조사 식별. Wireshark가 VMware_aa:bb:cc처럼 자동 표시 | 서버실에 없어야 할 제조사 장비가 보이면 확인 대상 |
| 브로드캐스트 | ff:ff:ff:ff:ff:ff | ARP 요청, DHCP Discover 등 |
| 멀티캐스트 | 첫 바이트의 최하위 비트가 1 (예: 01:00:5e:…) | 정상 서비스 광고 트래픽이 많음 |
| 로컬 관리 주소 | 첫 바이트의 두 번째 비트가 1 (예: x2, x6, xA, xE로 시작) | 스마트폰의 MAC 랜덤화, 가상화, 또는 MAC 변조 가능성 |
MAC 주소는 소프트웨어로 쉽게 바꿀 수 있습니다. MAC만으로 장비를 확정하면 안 되고, IP 할당 기록(DHCP 로그)이나 스위치 포트 정보와 함께 봐야 합니다.
IP 주소 → MAC 주소를 알아내는 프로토콜입니다. 같은 네트워크(브로드캐스트 도메인) 안에서만 동작합니다.
| 메시지 | Opcode | 전송 방식 | 내용 |
|---|---|---|---|
| ARP Request | 1 | 브로드캐스트 | "192.168.10.1 가진 사람? 192.168.10.20에게 알려줘" |
| ARP Reply | 2 | 유니캐스트 | "192.168.10.1은 00:50:56:dd:ee:ff야" |
| Gratuitous ARP | 1 또는 2 | 브로드캐스트 | 요청하지 않았는데 자기 IP↔MAC을 알림 (보낸 IP = 찾는 IP) |
[내 PC 192.168.10.20] 목적지: 8.8.8.8
↓ ① 라우팅 테이블 확인
↓ 8.8.8.8은 내 네트워크(192.168.10.0/24)가 아님 → 게이트웨이 192.168.10.1로 보내야 함
↓ ② ARP 캐시 확인 : 192.168.10.1의 MAC이 있는가?
↓ 없음 → ARP Request 브로드캐스트 "192.168.10.1 누구?"
↓ ③ 게이트웨이가 ARP Reply 유니캐스트 "00:50:56:dd:ee:ff"
↓ ④ ARP 캐시에 저장 (일정 시간 후 만료)
↓ ⑤ 프레임 전송
[Dst MAC: 게이트웨이 | Src MAC: 내 PC | EtherType 0x0800 | IP: 192.168.10.20 → 8.8.8.8]
핵심: 외부로 나가는 통신에서 ARP로 찾는 대상은 목적지 서버가 아니라 게이트웨이입니다.
그래서 게이트웨이의 MAC 주소가 바뀌면, 내 PC의 외부 통신 전체가 다른 장비를 거치게 됩니다. 이것이 ARP Spoofing이 위험한 이유입니다.
ip neigh)| 상태 | 의미 |
|---|---|
| REACHABLE | 최근에 통신이 확인된 유효한 항목 |
| STALE | 오래되어 재확인이 필요하지만 아직 사용 가능 |
| DELAY / PROBE | 재확인 중 |
| INCOMPLETE | 요청을 보냈지만 아직 응답이 없음 |
| FAILED | 응답이 없어 실패 (해당 IP가 없거나 차단됨) |
| PERMANENT | 관리자가 고정한 정적 항목 |
→ 공격자가 "게이트웨이 IP = 공격자 MAC"이라는 응답을 계속 보내면, 피해자의 트래픽이 공격자를 거쳐 나갑니다.
실습 환경: 본인 소유 Linux VM 1대 (Rocky Linux 또는 Ubuntu). ens33은 예시 인터페이스 이름입니다.
⚠️
-i any로 캡처하면 Ethernet 헤더 대신 Linux cooked 헤더가 보여 MAC 분석이 어렵습니다. 실제 인터페이스 이름을 지정하세요.
# 게이트웨이 IP 확인
ip route show default
# ARP 캐시 (IP ↔ MAC ↔ 상태)
ip neigh show
📷 [실습 화면 삽입]
ip route show default와ip neigh show결과 — 게이트웨이 IP와 MAC이 보이는 화면
# 터미널 1 : ARP만 캡처, -e로 MAC 주소 표시
sudo tcpdump -i ens33 -nn -e arp
# 터미널 2 : 캐시를 비우고 게이트웨이에 ping → ARP가 새로 발생
# (실습 VM에서만 실행하세요. 잠깐 통신이 끊길 수 있습니다.)
sudo ip neigh flush dev ens33
ping -c 1 <게이트웨이_IP>
sudo tcpdump -i ens33 -nn -w arp.pcap arp
# 다른 터미널에서 4-2의 flush + ping 실행 후 Ctrl+C
Wireshark에서 사용할 Display Filter:
| 필터 | 용도 |
|---|---|
arp | ARP 패킷만 보기 |
arp.opcode == 1 / arp.opcode == 2 | 요청 / 응답만 보기 |
eth.dst == ff:ff:ff:ff:ff:ff | 브로드캐스트 프레임만 보기 |
arp.duplicate-address-detected | Wireshark가 같은 IP에 다른 MAC을 감지한 패킷 |
📷 [실습 화면 삽입] Wireshark에서 ARP Reply 선택 → Packet Details의
Ethernet II와Address Resolution Protocol (reply)필드를 펼친 화면
tcpdump -e arp 출력은 대략 아래 형식입니다. (주소는 예시 값입니다.)
00:0c:29:aa:bb:cc > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.168.10.1 tell 192.168.10.20, length 28
00:50:56:dd:ee:ff > 00:0c:29:aa:bb:cc, ethertype ARP (0x0806), length 60: Reply 192.168.10.1 is-at 00:50:56:dd:ee:ff, length 46
| 확인 항목 | Request | Reply |
|---|---|---|
| Dst MAC | ff:ff:ff:ff:ff:ff (브로드캐스트) | 요청한 PC의 MAC (유니캐스트) |
| EtherType | 0x0806 (ARP) | 0x0806 (ARP) |
| 핵심 문장 | who-has <찾는 IP> tell <내 IP> | <IP> is-at <MAC> |
확인 체크리스트
is-at MAC이 ip neigh에 저장된 게이트웨이 MAC과 같은가?ip neigh에서 해당 항목이 REACHABLE로 바뀌었는가?| 관찰 내용 | 정상일 수 있는 경우 | 의심해야 하는 경우 |
|---|---|---|
| 게이트웨이 MAC이 바뀜 | 장비 교체, 이중화(VRRP 등) 전환 | 바뀐 MAC이 일반 PC의 MAC과 같음 |
| 하나의 MAC이 여러 IP를 가짐 | 라우터, 가상화 호스트 | 일반 호스트 MAC이 게이트웨이 IP까지 가짐 |
| Gratuitous ARP | 부팅, IP 변경, 이중화 전환 시 소수 발생 | 짧은 간격으로 반복되는 응답 |
| 요청 없는 ARP Reply | 드물게 발생 | 대량·주기적으로 발생 |
| ARP Request 폭증 | 신규 장비 연결 | 한 호스트가 대역 전체 IP를 순서대로 질의 → 내부 호스트 탐색 가능성 (05. 스캔 시리즈에서 다룸) |
# 같은 MAC이 여러 IP에 매핑되어 있는지 확인 (중복 MAC 출력)
ip neigh show | awk '/lladdr/ {print $5}' | sort | uniq -d
# 중복된 MAC이 있다면 어떤 IP들이 쓰고 있는지 확인
ip neigh show | grep '<중복된_MAC>'
결과가 비어 있으면 중복 없음입니다. 결과가 나오면 그 MAC이 게이트웨이 IP에도 매핑되어 있는지 먼저 확인하세요.
게이트웨이 MAC 기준값(Baseline) 기록
↓
현재 ip neigh / Wireshark에서 게이트웨이 MAC 비교
↓ 다르다면
그 MAC을 가진 다른 IP가 있는가? (6-2 명령)
↓ 있다면
해당 IP의 호스트 확인 + 스위치 포트 / DHCP 로그로 실제 장비 식별
↓
ARP Spoofing 의심 이벤트로 보고
| 증거 | 위치 | 한계 |
|---|---|---|
| ARP 캐시 | 각 호스트 (ip neigh, Windows arp -a) | 휘발성. 시간이 지나면 사라짐 → 빨리 수집 |
| 스위치 MAC 테이블 | 스위치 | 장비 접근 권한 필요 |
| 패킷 캡처 | 미러링 포트, 호스트 | 캡처 지점이 같은 L2 구간에 있어야 보임 |
| DHCP 로그 | DHCP 서버 | 어떤 MAC에 어떤 IP를 줬는지 → 장비 식별 |
| 수단 | 역할 |
|---|---|
| 스위치 DAI (Dynamic ARP Inspection) + DHCP Snooping | DHCP 할당 기록과 다른 ARP 응답을 차단 |
| arpwatch 같은 전용 도구 | IP↔MAC 매핑 변경을 기록·알림 |
| 중요 서버의 정적 ARP 항목 | 게이트웨이 MAC 변조 방지 (관리 부담 있음) |
| IDS | 대부분 L3 이상 분석이 중심이라 L2 공격 탐지는 제한적. L2는 스위치 기능과 전용 도구가 더 적합 |
0x0800, ARP 0x0806)을 구분한다.