icon

안동민 개발노트

14장 : 네트워크 트러블슈팅

패킷 분석


지금까지 ping, traceroute, curl 같은 도구로 네트워크 상태를 확인했습니다. 이 도구들은 연결이 되는가, 응답이 오는가를 알려주지만, 실제로 어떤 패킷이 오가는지는 보여주지 않습니다. 패킷 분석은 네트워크 통신의 블랙박스를 열어 정확히 무슨 일이 벌어지는지 확인하는 가장 강력한 진단 방법입니다.


tcpdump — 커맨드라인 패킷 캡처

tcpdump는 Linux/macOS에서 사용하는 커맨드라인 패킷 캡처 도구입니다.

tcpdump 기본 사용
# 80번 포트의 모든 트래픽 캡처
sudo tcpdump -i eth0 port 80

# 특정 호스트와의 통신만 캡처
sudo tcpdump -i eth0 host 192.168.1.100

# 캡처 내용을 파일로 저장 (Wireshark로 열기 가능)
sudo tcpdump -i eth0 -w capture.pcap port 443

# 저장된 파일 읽기
tcpdump -r capture.pcap

유용한 필터 조합들이 있습니다.

tcpdump 필터
# SYN 패킷만 캡처 (새 연결 시도)
sudo tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'

# SYN이지만 ACK는 아닌 패킷 (최초 연결 시도만)
sudo tcpdump -i eth0 'tcp[tcpflags] == tcp-syn'

# DNS 쿼리만 캡처
sudo tcpdump -i eth0 port 53

# 특정 서브넷의 트래픽만 캡처
sudo tcpdump -i eth0 net 10.0.0.0/24

# RST 패킷 캡처 (연결 거부/리셋)
sudo tcpdump -i eth0 'tcp[tcpflags] & tcp-rst != 0'

# 패킷 내용을 ASCII로 표시 (HTTP 디버깅)
sudo tcpdump -i eth0 -A port 80

# 패킷 내용을 헥스+ASCII로 표시
sudo tcpdump -i eth0 -X port 80

Wireshark — GUI 패킷 분석

Wireshark는 세계에서 가장 널리 사용되는 패킷 분석 도구입니다.

Wireshark 패킷 계층 뷰
┌───────────────────────────────────────┐
│ Frame 1: 74 bytes on wire             │ ← L1: 물리
├───────────────────────────────────────┤
│ Ethernet II                           │ ← L2: 데이터링크
│   Src: aa:bb:cc:dd:ee:ff              │
│   Dst: 11:22:33:44:55:66              │
├───────────────────────────────────────┤
│ Internet Protocol v4                  │ ← L3: 네트워크
│   Src: 192.168.1.100                  │
│   Dst: 93.184.216.34                  │
├───────────────────────────────────────┤
│ Transmission Control Protocol         │ ← L4: 전송
│   Src Port: 54321                     │
│   Dst Port: 443                       │
│   Flags: SYN                          │
├───────────────────────────────────────┤
│ [Application Data]                    │ ← L7: 애플리케이션
└───────────────────────────────────────┘

디스플레이 필터로 원하는 패킷만 골라볼 수 있습니다.

필터용도
http.request.method == "POST"HTTP POST 요청만
tcp.flags.syn == 1SYN 패킷만
ip.addr == 192.168.1.100특정 IP 관련
tcp.port == 443443 포트 트래픽
dns.qry.name contains "example"특정 도메인 DNS
tcp.analysis.retransmission재전송 패킷
tcp.analysis.zero_window수신 버퍼 가득참
http.response.code >= 400HTTP 에러 응답

실전 패킷 분석 예시

TCP 3-way handshake 캡처
No.  Time     Source         Dest           Info
1    0.000    192.168.1.100  93.184.216.34  SYN         Seq=0
2    0.015    93.184.216.34  192.168.1.100  SYN,ACK     Seq=0 Ack=1
3    0.015    192.168.1.100  93.184.216.34  ACK         Seq=1 Ack=1
                                            ↑ 연결 수립 완료

정상: SYN → SYN-ACK → ACK (3패킷)
이상: SYN만 반복 → 서버 무응답 또는 방화벽 DROP
이상: SYN → RST → 서버 포트 닫힘 (Connection Refused)

HTTP 요청 추적: Wireshark에서 HTTP 요청 패킷을 우클릭하고 "Follow → TCP Stream"을 선택하면, 해당 연결의 모든 HTTP 요청과 응답을 시간순으로 볼 수 있습니다.

TLS 문제 진단: HTTPS는 암호화되어 있어 내용을 볼 수 없지만, TLS 핸드셰이크 과정은 볼 수 있습니다. Client Hello의 지원하는 암호 스위트, Server Hello의 선택된 암호 스위트, 인증서 교환 과정을 확인할 수 있습니다.


자주 만나는 문제 사례

증상tcpdump/Wireshark에서 보이는 것원인해결
Connection RefusedSYN → RST포트에 프로세스 없음ss -tlnp로 확인
Connection Timed OutSYN만 반복, 응답 없음방화벽 DROP보안그룹/iptables
간헐적 느림재전송 패킷 다수패킷 유실네트워크 경로 점검
502 Bad Gateway프록시→백엔드 간 RST백엔드 연결 실패백엔드 상태 확인
느린 DNSDNS 질의 후 수초 대기DNS 서버 느림DNS 서버 변경
Zero WindowTCP Zero Window 패킷수신측 처리 못함앱 성능 개선

네트워크 트러블슈팅의 핵심은 추측하지 않고 확인하는 것입니다. 아마 방화벽 문제일 거야가 아니라, 패킷을 캡처하여 SYN이 나갔는데 응답이 없으니 방화벽이 차단하고 있다고 확인하는 것입니다. 이 교재에서 배운 계층별 지식과 진단 도구를 활용하면, 대부분의 네트워크 문제를 체계적으로 해결할 수 있습니다.

목차