와이어샤크(Wireshark) 개요
1. 와이어샤크란?
- 와이어샤크(Wireshark)는 대표적인 네트워크 패킷 분석 도구입니다.
- 1998년 Gerald Combs가 개발했으며, 현재까지 지속적으로 업데이트되고 있음.
- 원래 이름은 Ethereal이었으나, 2006년 상표 문제로 인해 현재의 이름인 Wireshark로 변경됨.
- 유선 및 무선 네트워크 트래픽을 실시간 캡처하여 모니터링하고 분석 가능.
2. 와이어샤크의 사용 목적
- 네트워크 트래픽 실시간 분석을 통해 다음과 같은 용도로 사용됨:
🔧 네트워크 문제 해결
- 네트워크 연결 문제 진단
- 성능 저하 원인 분석
- 보안 위협 탐지 및 대응
🔐 보안 분석
- 침입 탐지 및 비정상적인 활동 모니터링
- 보안 위협에 대한 상세한 트래픽 로그 분석
🧪 개발 및 테스트
- 네트워크 기반 애플리케이션 개발 시, 통신 흐름 테스트
- 프로토콜 구현 검증 및 디버깅
다음은 요청하신 주요 기능만을 마크다운 형식으로 정리한 내용입니다:
3. 주요 기능
-
📡 실시간 패킷 캡처
- 네트워크 인터페이스에서 실시간으로 패킷을 캡처하고 분석
-
🧩 프로토콜 디코딩
- 다양한 네트워크 프로토콜을 해석하고 디코딩하여 상세한 정보 제공
-
🔍 필터링 및 검색
- 특정 패킷이나 프로토콜을 쉽게 찾을 수 있도록 강력한 필터링 기능 제공
-
📈 네트워크 흐름 분석
- 트래픽의 흐름을 시각적으로 분석하여 네트워크 성능을 진단
-
📝 보고서 생성
- 분석 결과를 바탕으로 다양한 형태의 보고서 자동 생성 가능
와이어샤크 구조
패킷 스니퍼(sniffer)
- Packet capture
- 컴퓨터가 보내거나 받은 모든 링크 레이어의 프레임을 복사하여 가져옴(무차별 모드)
- Packet analyzer
- 프로토콜 메시지 안에 있는 모든 필드 내용을 보여줌
- 패킷의 헤더 구조를 이해하고 있으면 도움이 됨

와이어샤크의 한계와 주의사항
- 보안 문제
- 민감한 데이터를 캡처할 수 있으므로 사용시 적절한 보안 조치가 필요
- 성능 이슈
- 대량의 패킷을 캡처할 경우 성능 저하 발생 가능
- 법적 이슈
- 네트워크 트래픽 캡처는 스니핑(Sniffing)과 동일한 과정이므로 법적 문제가 될 수 있음
와이어샤크 설치
와이어샤크 설치

PCAP(Packet Capture)
- 네트워크 데이터 패킷을 캡처하고 분석하는데 사용되는 파일 포맷 및 API
- 네트워크 트래픽을 모니터링하고 분석하는데 사용
Npcap vs WinPcap 비교
| 항목 | Npcap | WinPcap |
|---|
| 지원 플랫폼 | Windows 10 및 최신 버전 지원 | Windows 10에서 공식 지원 없음 |
| 성능 및 안정성 | 최신 드라이버 모델로 성능 및 안정성 우수 | 오래된 드라이버 모델로 성능 저하 |
| 기능 | 루프백 캡처 기능 지원 | 루프백 캡처 기능 없음 |
| 보안 | 최신 보안 패치 반영, 보안성 강화 | 업데이트 중단으로 보안 취약 |
| 개발 및 지원 | 적극적인 개발과 지원 | 개발 중단, 공식 지원 없음 |
※ 루프백 캡처 : 컴퓨터의 네트워크 인터페이스에서 내부적으로 발생하는 트래픽을 캡처하는 기능.
(시스템 내부의 통신을 분석할 수 있게 해 줌)
와이어샤크 UI

캡처 필터
- 대용량 파일 캡처는 성능을 느리게 함
- 필터를 통해 원하는 패킷만 캡처 가능 (ex) TCP, UDP 등



패킷 목록
- 패킷 번호(No.)
- 시간(Time)
- 패킷이 캡처된 시간(상대시간) cf) 절대시간은 프레임 헤더 확인!!
- 요청 메시지를 보낸 후 응답 메시지를 받을 때까지 몇 초 걸렸는지 확인 가능
- 송수신 주소
- 프로토콜
- 패킷 길이
- 패킷의 정보

패킷 상세
- 캡처된 패킷의 캡슐화(Encapsulation)된 상태를 표시
- (예) TCP 패킷의 경우, Frame header, IP header, TCP header 정보를 표시

패킷 바이트
- 네트워크를 통해 실제로 전송되는 값
- 각 헤더의 값이 어느 위치에서, 어떤 값으로 표현(16진수 값)되는지 확인
- 편집 > 설정 > 모양 > 레이아웃 에서 “패킷 다이어그램”으로 변경하면,
각 헤더의 어느 부분의 값인지 쉽게 확인 가능

패킷 마크 설정
- 마크 설정
- 마우스 우클릭을 통해, 선택 항목 마크/해제 선택(ctrl+M)
- 다음 마크로 이동 : ctrl + shift + N
- 이전 마크로 이동 : ctrl + shift + B
- 마킹한 패킷만 별도 인쇄 가능
- 기본적으로 패킷 종류에 따라 색깔이 지정되어 있음


패킷 필터링
- 표시 필터 적용
- 사용자가 원하는 조건을 와이어샤크 상단에 입력
- (예) http, tcp, udp, dns 등
- 기본 문법에 대한 학습이 필요함(맨 뒤 참고)

패킷 필터링 문법
- 연산자 활용
- 사용자가 원하는 패킷을 추출하기 위해 연산자 활용
- ip.src == 192.168.0.1 or ip.src eq 192.168.0.1
- tcp.port != 80 or tcp.port ne 80
- tcp.seq <= 1000 or tcp.seq le 1000
- ip.src == 192.168.0.1 && tcp.port == 80
와이어샤크 필터 연산자 정리
| 연산자 | 키워드 | 설명 |
|---|
== | eq | 조건을 만족하는 패킷을 선택 |
!= | ne | 조건을 만족하지 않는 패킷을 선택 |
&& | and | 조건을 모두 만족하는 패킷을 선택 |
| ` | | ` |
! | not | 조건에 부합하지 않는 패킷을 선택 |
> | gt | 지정한 값을 초과하는 패킷을 선택 |
< | lt | 지정한 값보다 작은 패킷을 선택 |
>= | ge | 지정한 값보다 크거나 같은 패킷을 선택 |
<= | le | 지정한 값보다 작거나 같은 패킷을 선택 |
캡처 파일 저장 및 열기
- 파일 저장
- 현재 캡처된 상태를 저장 or 사용자에 의해 추출된 상태를 저장
- 일반적으로 확장자가 pcapng로 저장
- 저장 & 다른 이름으로 저장
- 지정한 패킷 내보내기
- 사용자가 필터를 통해 필요한 패킷만 추출한 것을 저장
- 파일 열기
- 캡처 파일(pcapng 등)을 언제든지 열 수 있음
- 파일 > 열기를 선택해 파일 열기
- 캡처 파일 더블클릭

프로토콜 분석
TCP/IP 프로토콜

프로토콜 분석 - HTTP

따라가기
- 분석 원하는 패킷을 선택 후,
마우스 우측 버튼 눌러 HTTP 스트림 따라가기
- HTTP 요청 / 응답 내용을 한 눈에 확인 가능


HTTP vs. HTTPS
- HTTP는 평문으로 전송
- HTTPS는 TLS 프로토콜로 암호화해서 전송
- TLS는 대칭키/비대칭키 모두 사용
- HTTP의 데이터는 대칭키로 암호화
- TLS는 비대칭키(공개키, 비공개키)를 이용해 암호화


TCP의 동작


TCP 컨트롤 플래그(Control Flag)
- URG : 긴급 데이터 플래그
- ACK : 응답 플래그
- PSH : 넣기 플래그
- RST : 연결 재설정 플래그
- 비정상적인 상황에서 연결을 즉시 종료(강제종료)
- SYN : 연결요청 플래그
- FIN : 연결 종료 플래그
- ECN-Echo
- 수신측이 네트워크 혼잡 상태를 감지 했음을 송신측에 알림
- CWR
- 송신측이 혼잡 상황을 인지하고 송신 윈도 크기를
줄였음을 수신측에 알림

따라가기

TCP 재전송
- SEQ와 ACK 관계 확인
- 확인 응답번호(ACK)를 통해 메시지 수신 여부 확인
- 수신한 확인 응답 번호를 확인 후,
그 번호를 일련번호로 설정하여 전송
- TCP에서는 메시지를 수신하지 못하면 재전송
- 빠른 재전송(Fast Retransmit)
- 3개의 중복 ACK를 수신할 경우 문제의 패킷을 즉시 전송
- 자신이 설정한 타임 아웃 전에 재전송하므로 빠르게 보냄
- 혼잡 현상이 발생한 것이므로 데이터 전송을 위한
윈도우 크기를 줄임
- tcp-retransmission.pcapng 파일


프로토콜 분석 - IP
- IP 단편화(Fragmentation)
- IP 프로토콜에서 패킷을 몇 개의 작은 패킷으로 나누어 전송하고, 수신측에서 재조합하는 과정
- 식별자(Identification) : 어떤 패킷에서 단편화가 발생했는지 나타내는 값
- 단편화 플래그(flag) : 조각난 플래그가 더 있는지 표시
- 단편화 오프셋(offset) : 각 패킷은 1480의 단위로 떨어져 있음
- ipv4-fragmentation.pcapng 파일


★ MSS(Maximum Segment Size)
- 사용자 데이터를 분할하지 않고 한 번에 보내는
최대 크기(MTU 값에 의해 결정)
★ MTU(maximum Transmission Unit)
- 네트워크에서 전송할 수 있는 최대 크기의 패킷
프로토콜 분석 - ICMP
ping
- 와이어샤크에 icmp로 필터 설정
- ping www.google.com (혹은 교수컴)
- 에코 요청 타입 : 8
- 에코 응답 타입 : 0


tracert
- 와이어샤크에 icmp로 필터 설정
- tracert www.google.com
- ping을 사용하는 것 확인


프로토콜 분석 - ARP
ARP
- 동일한 네트워크 대역에서 통신하기 위해
IP주소로 MAC 주소를 알아내는 프로토콜
- 요청(Request) : Broadcast로 전송
- 응답(Reply) : 해당 IP가 unicast로 전송
- 만약, ARP 요청한 IP가 동일한 네트워크 대역이 아니라면,
게이트웨이의 IP로 변경하여 게이트웨이의 MAC 주소 등록


ARP request
- 220.67.174.1의 MAC 주소 확인
- MAC 주소가 00:00:00_00:00:00인을 확인!!
- 앞 3부분은 제조사, 뒤 3부분은 주소를 나타냄

ARP Reply
- MAC 주소가 채워져서 응답 오는 것을 확인!
- arp -a를 통해 확인

프로토콜 분석 - DNS

DNS에 등록된 도메인의 IP 확인
- nslookup www.youtube.com [다른 DNS 주소]
- 내 컴퓨터가 등록한 DNS 서버 IP 주소 확인
- DNS 서버에 등록된 도메인의 IP 확인
- 내가 사용하는 DNS 서버 이외에 다른 DNS 사용 가능
- 구글 : 8.8.8.8
- KT : 168.126.63.1
- SKB : 210.220.163.82
- LGU+ : 164.124.101.2

패킷 필터링 문법
기본 프로토콜
| 필터 | 설명 (한글 요약) |
|---|
| eth | 이더넷 프레임 분석 |
| ip | IPv4 패킷 분석 |
| ipv6 | IPv6 패킷 분석 |
| arp | MAC 주소 확인을 위한 ARP 패킷 |
| dhcp | IP 자동 할당 관련 DHCP 트래픽 |
| rip | 거리 벡터 기반 라우팅 프로토콜 |
| ospf | 링크 상태 기반 라우팅 프로토콜 |
| bgp | 경로 벡터 기반, 인터넷 백본 라우팅 프로토콜 |
| icmp | 핑(ping)이나 트레이서트에서 사용되는 메시지 제어 프로토콜 |
| tcp | 연결 지향 통신 프로토콜 (3-way handshake 등) |
| udp | 비연결형 통신 프로토콜 (빠르지만 신뢰성 낮음) |
| dns | 도메인 이름을 IP로 변환하는 프로토콜 |
| http | 웹 통신의 기본 프로토콜 |
| http2 | HTTP의 속도 개선 버전 (멀티플렉싱 등 지원) |
| http3 | QUIC 기반의 최신 HTTP 버전 |
| tls | 암호화된 보안 통신(HTTPS 등에서 사용) |
이더넷(2계층) 관련 필터
| 필터 | 설명 |
|---|
| eth.addr | 수신지 또는 송신지 MAC 주소 전체를 검색할 때 사용 |
| eth.dst | 수신지(Destination) MAC 주소 필터링 |
| eth.src | 송신지(Source) MAC 주소 필터링 |
| eth.len | 이더넷 페이로드의 길이 (16비트 양의 정수) |
| eth.type | 이더넷 프레임 내 상위 프로토콜 식별 (예: IPv4는 0x0800) |
✅ 예시 사용법
eth.src == aa:bb:cc:dd:ee:ff
→ 해당 MAC 주소에서 송신된 패킷 필터링
eth.type == 0x0806
→ ARP 패킷만 필터링
ip(3계층) 관련 필터
✅ IPv4 필터 목록 요약
| 필터 | 설명 |
|---|
| ip.addr | 송신지 또는 수신지 IPv4 주소 |
| ip.dst | 수신지 IPv4 주소 |
| ip.src | 송신지 IPv4 주소 |
| ip.flags | 플래그 값 전체 (8비트 정수) |
| ip.flags.df | DF(조각 금지) 플래그 |
| ip.flags.mf | MF(더 많은 조각 있음) 플래그 |
| ip.frag_offset | 단편화 오프셋 (16비트 정수) |
| ip.hdr_len | IP 헤더 길이 (8비트 정수) |
| ip.id | 패킷 식별자 (16비트 정수) |
| ip.len | 전체 IP 패킷 길이 |
| ip.opt.mtu | MTU 옵션 값 |
| ip.ttl | TTL(Time to Live, 생존 시간) 값 |
📌 실전 필터 사용 예시
ip.src == 192.168.0.10
→ 해당 IP가 출발지인 패킷만 보기
ip.dst == 8.8.8.8
→ 구글 DNS 서버로 향하는 트래픽 확인
ip.ttl < 10
→ TTL이 낮은 패킷만 필터링 (루프 가능성 진단 등)
udp(4계층) 관련 필터
✅ UDP 필터 정리
| 필터 | 설명 |
|---|
| udp.port | 수신지 또는 송신지 포트 번호 (16비트 정수) |
| udp.dstport | 수신지 포트 번호 |
| udp.srcport | 송신지 포트 번호 |
| udp.length | UDP 데이터그램 전체 길이 (헤더 + 데이터, 16비트 정수) |
📌 예시 필터 사용법
udp.port == 53
→ DNS 요청 및 응답 패킷 확인 (UDP 53 포트 사용)
udp.srcport == 123
→ NTP 서버로부터 전송된 패킷 필터링
udp.length > 100
→ 100바이트 이상인 UDP 데이터그램 확인
tcp(4계층) 관련 필터
✅ TCP 필터 정리
| 필터 | 설명 |
|---|
| tcp.port | 송신지 또는 수신지 포트 번호 |
| tcp.dstport | 수신지 포트 번호 |
| tcp.srcport | 송신지 포트 번호 |
| tcp.seq | 순서 번호 (Sequence Number, 32비트) |
| tcp.seq_raw | 실제 순서 번호 (32비트 음이 아닌 정수) |
| tcp.nxtseq | 다음 순서 번호 |
| tcp.ack | 확인 응답 번호 (ACK Number) |
| tcp.ack_raw | 실제 ACK 번호 |
| tcp.flags | TCP 플래그 필드 전체 |
| tcp.flags.ack | ACK 플래그 (확인 응답 여부) |
| tcp.flags.fin | FIN 플래그 (연결 종료 요청) |
| tcp.flags.syn | SYN 플래그 (연결 요청) |
| tcp.hdr_len | TCP 헤더 길이 |
| tcp.len | TCP 세그먼트 데이터 길이 |
| tcp.window_size_value | 윈도 크기 (수신 측의 버퍼 크기) |
| tcp.options.mss_val | MSS(Maximum Segment Size) 값 |
| tcp.analysis.ack_rtt | 세그먼트에 대한 ACK까지의 RTT |
| tcp.analysis.out_of_order | 순서가 어긋난 세그먼트 |
| tcp.analysis.retransmission | 재전송된 세그먼트 |
| tcp.analysis.fast_retransmission | 빠른 재전송 |
| tcp.analysis.duplicate_ack | 중복된 ACK |
| tcp.analysis.duplicate_ack_num | 중복 ACK 수 (정수) |
📌 실전 예시
tcp.flags.syn == 1 && tcp.flags.ack == 0
→ TCP 3-way handshake의 시작(SYN 요청) 필터링
tcp.analysis.retransmission
→ 재전송된 패킷 확인, 네트워크 품질 분석 시 유용
tcp.port == 443
→ HTTPS(SSL/TLS) 트래픽 확인
http 관련 필터
✅ Wireshark - HTTP 필터 통합표 (최종)
| 필터 | 설명 |
|---|
http.request | HTTP 요청 여부 |
http.request.line | 요청 라인 전체 |
http.request.method | 요청 메서드 (GET, POST 등) |
http.request.uri | 전체 URI |
http.request.uri.path | URI 경로 (/path/only) |
http.request.uri.query | 전체 쿼리 문자열 |
http.request.uri.query.parameter | 쿼리 파라미터 값 |
http.request.version | HTTP 요청 버전 |
http.response | HTTP 응답 여부 |
http.response.code | HTTP 응답 코드 (예: 200, 404) |
http.response.phrase | 응답 문구 (OK, Not Found 등) |
http.response.line | 응답 라인 전체 |
http.response.version | HTTP 응답 버전 |
http.accept | Accept 헤더 |
http.accept_encoding | Accept-Encoding 헤더 |
http.accept_language | Accept-Language 헤더 |
http.cache_control | Cache-Control 헤더 |
http.connection | Connection 헤더 |
http.content_encoding | Content-Encoding 헤더 |
http.content_length | Content-Length 헤더 |
http.content_type | Content-Type 헤더 |
http.date | Date 헤더 |
http.host | Host 헤더 |
http.location | Location 헤더 |
http.last_modified | Last-Modified 헤더 |
http.server | Server 헤더 |
http.set_cookie | Set-Cookie 헤더 |
http.cookie | Cookie 헤더 |
http.user_agent | User-Agent 헤더 |
http.referer | Referer 헤더 |
http.authorization | Authorization 헤더 |
http.www_authenticate | WWW-Authenticate 헤더 |
📌 필터 예시 몇 가지
-
http.user_agent contains "Chrome"
→ 크롬 브라우저에서 요청한 패킷만 보기
-
http.set_cookie
→ 서버가 Set-Cookie를 포함한 응답만 보기
-
http.authorization
→ Authorization 헤더를 포함한 인증 요청 필터링
-
http.referer contains "naver.com"
→ 네이버에서 유입된 트래픽만 보기
-
http.server contains "Apache"
→ Apache 서버가 응답한 HTTP 트래픽만 보기