📚 네트워크 · 패킷 분석 › 03. Wireshark 패킷 분석 — 111편
이전 글: 110. Conversations · 다음 글: 112. Ethernet 프레임 필드 분석 — eth.src·eth.dst·eth.type로 읽는 2계층 증거
Endpoint는 트래픽을 보내거나 받은 개별 주소 하나입니다. 110. Conversations가 "누구와 누구 사이"를 본다면, Endpoints는 "캡처 안에 누가 등장했고 각자 얼마나 보내고 받았는가"를 봅니다. 두 기능의 기본 차이는 109. Statistics로 전체 흐름 파악 — Conversations·Endpoints·Protocol Hierarchy에서 다뤘습니다.
| 탭 | Endpoint 단위 | 주로 쓰는 질문 |
|---|---|---|
| Ethernet | MAC 주소 | 같은 LAN에 어떤 장비가 있었나 |
| IPv4 / IPv6 | IP 주소 | 등장한 호스트 목록, 상위 송신자 |
| TCP / UDP | IP + 포트 | 어떤 포트가 트래픽을 많이 받았나 (서비스 식별) |
패킷 하나는 출발지와 목적지, 두 Endpoint에 동시에 집계됩니다.
패킷: 192.168.10.20 → 203.0.113.50, 1,200 bytes
↓
Endpoint 192.168.10.20 : Tx Packets +1, Tx Bytes +1200
Endpoint 203.0.113.50 : Rx Packets +1, Rx Bytes +1200
↓ (파일 끝까지 반복)
Packets = Tx + Rx, Bytes = Tx Bytes + Rx Bytes
그래서 Endpoints 표의 Packets 합계는 전체 패킷 수의 약 두 배가 됩니다. 비율을 볼 때는 Tx(보낸 것)와 Rx(받은 것)를 따로 봐야 의미가 있습니다.
| 열 | 의미 | 분석 포인트 |
|---|---|---|
| Address (Port) | Endpoint 주소 (TCP/UDP 탭은 포트 포함) | 처음 보는 외부 주소, 비표준 포트 |
| Packets / Bytes | 송수신 합계 | 상위 Endpoint 선별 |
| Tx Packets / Tx Bytes | 이 주소가 보낸 양 | 과다 송신 호스트 |
| Rx Packets / Rx Bytes | 이 주소가 받은 양 | Tx가 0이면 응답하지 않는 대상 |
| Country, City, AS Number 등 | GeoIP 정보 | MaxMind DB를 설정했을 때만 표시 |
GeoIP 열은 Edit → Preferences → Name Resolution → MaxMind database directories에 GeoLite2 등 MaxMind 형식 DB(.mmdb) 경로를 지정해야 나타납니다. 지정하면 IP 계층 Details에도 ip.geoip.src_country 같은 필드가 추가되어 필터로 쓸 수 있습니다.
Endpoint 목록에는 사람이 아닌 주소도 섞여 있으므로 먼저 구분해 둡니다.
| 주소 예 | 성격 | 처리 |
|---|---|---|
255.255.255.255, 192.168.10.255 | 브로드캐스트 | 호스트 아님 |
224.0.0.251 (mDNS), 239.255.255.250 (SSDP) | 멀티캐스트 | 로컬 서비스 탐색 트래픽 |
ff:ff:ff:ff:ff:ff, 01:00:5e:… | 2계층 브로드캐스트·멀티캐스트 MAC | Ethernet 탭에서 제외하고 봄 |
| 게이트웨이 MAC | 외부 IP 전부가 이 MAC으로 보임 | 113. MAC Address 분석 참고 |
실습 예시 — tshark로 Endpoint 표를 만듭니다(Rocky/Ubuntu 공통).
F=/tmp/lab.pcapng
tshark -r $F -q -z endpoints,ip
tshark -r $F -q -z endpoints,tcp # IP+포트 단위
tshark -r $F -q -z endpoints,eth
tshark -r $F -q -z 'endpoints,ip,!(ip.dst == 192.168.10.0/24)' # 필터를 붙인 집계
-z endpoints,ip 출력의 형식 예시(값은 환경마다 다름)입니다.
Filter:<No Filter>
| Packets | | Bytes | | Tx Packets | | Tx Bytes | | Rx Packets | | Rx Bytes |
192.168.10.20 2410 1.9 MB 1080 210 kB 1330 1.7 MB
203.0.113.50 1370 1.3 MB 950 1.3 MB 420 28 kB
192.168.10.35 840 4.1 MB 830 4.0 MB 10 1.1 kB
| 줄 | 읽는 법 |
|---|---|
| 192.168.10.20 | Rx가 Tx보다 큼 → 일반 사용자 PC의 다운로드 형태 |
| 203.0.113.50 | 외부 서버. 이 캡처에서 가장 큰 외부 송신자 |
| 192.168.10.35 | Tx가 압도적이고 Rx가 거의 없음 → 단방향 대량 송신. 캡처 지점·UDP 스트리밍·유출 여부 확인 |
필드 추출로 "내부 호스트별 외부 송신 바이트"처럼 원하는 기준을 직접 만들 수도 있습니다.
# 내부 출발지별, 외부로 보낸 바이트 합계
tshark -r $F -Y 'ip.src == 192.168.10.0/24 && !(ip.dst == 192.168.10.0/24)' \
-T fields -e ip.src -e frame.len \
| awk '{b[$1]+=$2} END {for (h in b) print b[h], h}' | sort -rn | head
# 한 호스트가 서비스한(응답한) TCP 포트 목록: SYN/ACK의 출발지 포트
tshark -r $F -Y 'tcp.flags == 0x012' -T fields -e ip.src -e tcp.srcport | sort -u
📷 [실습 화면 삽입 위치] Statistics → Endpoints의 IPv4 탭을 Tx Bytes 기준으로 정렬한 화면 (Limit to display filter 체크 상태 포함)
📷 [실습 화면 삽입 위치] MaxMind DB 경로를 지정한 뒤 Endpoints에 Country·AS Number 열이 나타난 화면
| Endpoint 관찰 | 정상일 수 있는 경우 | 추가 확인이 필요한 경우 |
|---|---|---|
| 처음 보는 외부 IP | CDN·클라우드 서비스의 주소 변경 | 평판 불량, 업무와 무관한 국가·AS |
| 내부 호스트의 Tx 과다 | 백업 서버, 파일 서버 | 일반 사용자 PC에서 대량 외부 송신 |
| Rx만 있고 Tx가 0인 내부 IP | 꺼진 호스트, 방화벽 drop | 스캔 대상이 된 주소 |
| TCP 탭에서 한 IP에 포트가 많음 | 서버의 다중 서비스 | 일반 PC가 여러 포트로 응답(SYN/ACK) |
| 등록되지 않은 MAC | 방문자 단말, MAC 랜덤화 | 서버 대역의 미등록 장비 |
GeoIP는 등록 정보 기반 추정이며 VPN·클라우드·CDN 주소는 실제 위치와 다를 수 있습니다. 국가만으로 차단·판정하지 않습니다.
Endpoints는 사건 초기에 "이 캡처에 등장한 자산과 외부 주소 목록"을 만드는 데 쓰입니다.
| 산출물 | 대조 대상 | 관제 질문 |
|---|---|---|
| 내부 IP 목록 | 자산 관리 대장, DHCP 임대 기록 | 목록에 없는 내부 주소가 있는가? |
| 외부 IP 목록 | 위협 인텔리전스, 방화벽 허용 목록 | 알려진 악성·미허가 목적지가 있는가? |
| 상위 Tx 호스트 | 프록시·방화벽 송신량 | 평소 대비 송신량이 급증했는가? |
| MAC 목록 | 스위치 MAC 테이블, NAC | 어느 물리 포트의 장비인가? |
IOC 추출 절차 전반은 149. Packet에서 IOC 추출에서 다룹니다.
오탐 주의: 캡처 지점이 NAT 바깥이면 내부 호스트가 공인 IP 하나로 합쳐지고, 프록시 뒤라면 외부 Endpoint가 프록시 하나로 보입니다. 또 Endpoints 표만으로는 누가 먼저 연결했는지 알 수 없으므로 방향은 Conversations와 SYN으로 확인합니다.
tshark -q -z endpoints,ip(tcp, eth)와 ip.src·frame.len 추출로 목적별 Endpoint 집계를 만듭니다.