SNI 확인(HTTP/2·HTTP/3/QUIC 포함)
title: "macOS에서 Wireshark로 SNI 확인(HTTP/2·HTTP/3/QUIC 포함) 실습"
slug: macos-wireshark-sni-howto
series: "URL·TLS·SNI·필터링·DPI 실전 가이드"
author: EX Corp. Tech Team
summary: "맥에서 복호화 없이 TLS ClientHello의 SNI(호스트명)를 확인하는 법. TCP(TLS1.2/1.3)와 QUIC(HTTP/3) 모두 대비한 캡처, 필터, 징후 판독, CLI 자동화까지."
tags: [Wireshark, tshark, TLS, SNI, QUIC, HTTP3, macOS, DPI]
reading_time: "10분"
cover_image_suggestion: "맥북 화면에 Wireshark 패킷과 SNI 필드가 강조된 스크린샷 스타일 일러스트"
목표
- 복호화 없이 TLS ClientHello → SNI(Server Name Indication) 를 확인한다.
- HTTP/1.1·HTTP/2(TCP 443) 와 HTTP/3/QUIC(UDP 443) 모두에서 재현한다.
- 필터링/차단 징후(RST·타임아웃 등)를 관찰한다.
0) 준비물
- macOS 12 이상(Intel/Apple Silicon)
- Wireshark (CLI는
tshark)brew install --cask wireshark # 설치 중 ChmodBPF 권한 부여 동의설치 후 Wireshark → Help → About Wireshark → Capture Privileges 에서 BPF 권한 OK 확인.
1) 브라우저/클라이언트 세팅(간편 재현용)
- 간단 재현은
curl권장 (HTTP 버전 강제 용이)curl --http1.1 -I https://example.com curl --http2 -I https://example.com - HTTP/3 트래픽 확인을 원하면 크롬/사파리 최신에서 사이트 접속(HTTP/3 지원 도메인 이용). 브라우저에서 QUIC를 끄고 TCP로만 보고 싶다면: 최신 버전에선 플래그가 없을 수 있으니
curl위주로 테스트 후, 별도로 H3를 추가 관찰하세요.
2) 캡처 시작
- Wireshark 실행 → Capture 인터페이스 선택
- Wi-Fi: 보통 en0, 유선: enX
- VPN 사용 중이면 터널 인터페이스 utunX 선택 필요
- Start 클릭으로 캡처 시작
3) 디스플레이 필터 (복붙용)
A) TCP 위 TLS(HTTPS/1.1·2)
- ClientHello만 보기
tls.handshake.type == 1 && tcp.port == 443 - SNI가 포함된 핸드셰이크만
tcp.port == 443 && tls.handshake.extensions_server_name
B) QUIC(HTTP/3)
- QUIC 초기 핸드셰이크에서 ClientHello 보기
udp.port == 443 && quic && tls.handshake.type == 1 - QUIC에서 SNI가 보이는 경우만
quic && tls.handshake.extensions_server_name
주의: Wireshark 버전에 따라 QUIC 디섹터 인식이 달라 최신 버전 권장. 필요 시 Decode As… → QUIC 지정.
4) 패킷 안에서 SNI 찾기
아무 ClientHello 패킷을 더블클릭 → Packet Details 창에서:
Transport Layer Security
TLSv1.3 Record Layer: Handshake Protocol: Client Hello
Extension: server_name (SNI)
Server Name: www.example.com ← 여기!
QUIC(HTTP/3)도 원리는 동일. 초기 QUIC 패킷에서 TLS ClientHello가 보이며 같은 위치에서 server_name을 확인.
5) “차단/필터링이 동작하는지” 징후 보기
- 정상: ClientHello → ServerHello → 핸드셰이크 완료 → 암호화된 애플리케이션 데이터
- 차단 의심:
- ClientHello 이후 ServerHello 미수신 후 RST/FIN으로 즉시 종료
- 일정 지연 뒤 타임아웃
- (평문 HTTP일 경우에만 경고 리다이렉트가 보임. HTTPS는 보통 오류 페이지/연결 실패)
6) CLI 자동화(tshark) 스니펫
A) TCP 443에서 SNI 로그 뽑기
tshark -i any -f "tcp port 443" -Y "tls.handshake.type == 1" \
-T fields -e frame.time -e ip.src -e ip.dst -e tls.handshake.extensions_server_name \
| tee sni_tcp.log
B) QUIC(UDP 443)에서 SNI 로그 뽑기
tshark -i any -f "udp port 443" -Y "quic && tls.handshake.type == 1" \
-T fields -e frame.time -e ip.src -e ip.dst -e tls.handshake.extensions_server_name \
| tee sni_quic.log
C) CSV 저장(시간·출발지·목적지·SNI)
tshark -i any -f "tcp port 443 or udp port 443" -Y "tls.handshake.extensions_server_name" \
-T fields -E header=y -E separator=, \
-e frame.time_epoch -e ip.src -e ip.dst -e tls.handshake.extensions_server_name \
> sni.csv
7) 빠른 교차 검증(오픈SSL)
특정 IP로 붙되 SNI를 명시해 인증서 선택 변화를 확인:
openssl s_client -connect 93.184.216.34:443 -servername example.com -tls1_3 </dev/null 2>/dev/null \
| openssl x509 -noout -subject -issuer
Wireshark 캡처에서도 해당 세션의 ClientHello에 Server Name: example.com 이 찍히는지 확인.
8) 트러블슈팅 매트릭스
| 증상 | 가능한 원인 | 해결 팁 |
|---|---|---|
| 패킷이 안 잡힘 | 인터페이스 오선택(BPF 권한 미적용) | Wi-Fi면 en0, VPN이면 utunX. 설치 시 ChmodBPF 동의 재확인 |
| QUIC에서 SNI가 안 보임 | 디섹터 버전/Decode As 미설정 | Wireshark 최신 사용, Decode As → QUIC, 필터 재적용 |
| SNI 필드 자체가 없음 | ECH(Encrypted ClientHello) 활성/커버명만 노출 | 다른 도메인으로 비교, 브라우저 실험 기능 비활성, DNS/브라우저 조합 변경 |
| RST/타임아웃 반복 | 중간 장비의 도메인 차단(SNI 기반) | 동일 도메인으로 TCP/H3 모두 테스트, 타 경로/망/단말 교차 실험 |
| HTTP/1.1만 잡힘 | 브라우저가 H3/TCP 선택 달리함 | curl --http2/브라우저로 각각 실험, 사이트 H3 지원 여부 확인 |
ECH 감지 팁: Wireshark 버전에 따라
encrypted_client_hello확장이 표시되거나, 아예 SNI가 비어 있음으로 드러납니다.
9) 현업 체크리스트
- 캡처 인터페이스: 물리 NIC vs 터널(utunX) 구분
- HTTP/2/3 혼재 대비: TCP와 UDP 443 동시 필터
- SNI만 보고 정책 판단 시, ECH 적용 도메인 혼재 가능성 고려
- SIEM 연동: SNI 로그는 민감할 수 있으니 수집·보존·마스킹 정책 명확화
10) TL;DR
- 맥에선 Wireshark만으로 SNI 확인 가능(복호화 불필요).
- TCP(HTTPS/1.1·2) 와 QUIC(HTTP/3) 모두
ClientHello에서server_name를 찾는다. - 차단 징후는 ClientHello 이후 ServerHello 부재+RST/타임아웃 패턴으로 판독.
- ECH 활성 환경에서는 SNI가 보이지 않을 수 있으니 대조 실험으로 확정.
답글 남기기