Overview
최근 GitHub SSH 연결이 비정상적으로 느린 문제를 겪었다. git pull을 실행하면 30초 이상 기다려야 하는 상황이었죠.
"네트워크가 느린가?" 하고 넘어갈 수도 있었지만, tcpdump를 사용해 정확한 원인을 찾아냈다.
이 글에서는 tcpdump의 기본 사용법부터 실전 문제 해결 사례까지 다룬다.

tcpdump란?
tcpdump는 네트워크 인터페이스를 통과하는 패킷을 실시간으로 캡처하고 분석하는 커맨드라인 도구이다. 네트워크 문제 진단, 보안 분석, 성능 최적화의 필수 도구이다.
왜 tcpdump를 사용해야 할까?
- 정확한 진단: 추측이 아닌 실제 패킷 데이터로 문제 파악
- 실시간 모니터링: 문제 발생 시점의 트래픽 즉시 확인
- 가벼움: GUI 없이 서버에서도 사용 가능
- 표준 도구: 대부분의 Unix/Linux 시스템에 기본 설치
기본 사용법
1. 기본 명령어
# 모든 인터페이스의 패킷 캡처 (root 권한 필요)
sudo tcpdump -i any
# 특정 인터페이스만 캡처
sudo tcpdump -i en0
# 캡처 개수 제한
sudo tcpdump -i any -c 10
# 중단: Ctrl+C
2. 필터링
호스트 필터링
# 특정 호스트
sudo tcpdump host github.com
# 특정 IP
sudo tcpdump host 20.200.245.247
# 송신만
sudo tcpdump src host 192.168.1.100
# 수신만
sudo tcpdump dst host 192.168.1.100
포트 필터링
# 특정 포트
sudo tcpdump port 22
sudo tcpdump port 80
# 포트 범위
sudo tcpdump portrange 8000-9000
# 송신 포트
sudo tcpdump src port 443
프로토콜 필터링
sudo tcpdump tcp
sudo tcpdump udp
sudo tcpdump icmp
조합 필터 (BPF - Berkeley Packet Filter)
# AND 조건
sudo tcpdump host github.com and port 22
# OR 조건
sudo tcpdump port 80 or port 443
# NOT (제외)
sudo tcpdump not host 192.168.1.1
# 복합 조건
sudo tcpdump 'host github.com and (port 22 or port 443)'
3. 출력 옵션
# verbose 모드 (더 자세한 정보)
sudo tcpdump -v
sudo tcpdump -vv
sudo tcpdump -vvv # 최대 상세도
# 패킷 내용 출력
sudo tcpdump -X # HEX + ASCII
sudo tcpdump -A # ASCII만
# 타임스탬프 형식
sudo tcpdump -tttt # 읽기 쉬운 형식
# 출력 라인 버퍼링 해제 (실시간 확인)
sudo tcpdump -l
4. 파일 저장 및 읽기
# 파일로 저장 (pcap 형식)
sudo tcpdump -w capture.pcap
# 파일에서 읽기
tcpdump -r capture.pcap
# 필터링하며 저장
sudo tcpdump -w ssh-traffic.pcap host github.com and port 22
# 파일 크기 제한 (100MB마다 새 파일)
sudo tcpdump -w capture.pcap -C 100
# 파일 개수 제한 (5개만 유지, 순환)
sudo tcpdump -w capture.pcap -C 100 -W 5
실전 활용 사례
사례 1: SSH 연결 지연 문제 진단
문제: GitHub SSH 연결이 30초 이상 소요
Step 1: 문제 재현하며 패킷 캡처
# 터미널 1: tcpdump 실행
sudo tcpdump -i any host github.com and port 22
# 터미널 2: SSH 연결 시도
ssh -T git@github.com
Step 2: 패킷 분석
캡처된 로그
18:48:28.709 IP 10.10.11.3.56034 > 20.200.245.247.ssh: Flags [S], seq 2418154065
18:48:28.709 IP 10.10.11.3.56034 > 20.200.245.247.ssh: SSH: SSH-2.0-OpenSSH_9.7
18:48:58.672 IP 20.200.245.247.ssh > 10.10.11.3.56034: SSH: SSH-2.0-85ba476
분석 결과
- 18:48:28 - SSH 버전 교환 시작
- 18:48:58 - GitHub 서버 응답 (30초 지연!)
- TCP 연결은 정상, SSH 키 교환 단계에서 지연 발생
Step 3: 해결
SSH config 최적화 또는 HTTPS로 전환
# 방법 1: SSH config 최적화
vi ~/.ssh/config
# KexAlgorithms curve25519-sha256 추가
# 방법 2: HTTPS로 전환 (즉시 해결)
git remote set-url origin https://github.com/user/repo.git
사례 2: 특정 서비스 연결 확인
# 웹 서버 연결 확인
sudo tcpdump -i any 'host example.com and (port 80 or port 443)'
# DNS 쿼리 확인
sudo tcpdump -i any port 53
# 데이터베이스 연결 확인
sudo tcpdump host db-server and port 3306
사례 3: TCP 3-way Handshake 확인
연결 수립 과정 모니터링
sudo tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack|tcp-fin) != 0'
정상 연결
SYN → 클라이언트가 연결 요청
SYN-ACK → 서버가 수락
ACK → 클라이언트가 확인
사례 4: 느린 네트워크 구간 찾기
# 특정 호스트와의 모든 트래픽 캡처 (타임스탬프 포함)
sudo tcpdump -tttt -i any host api.example.com
# 응답 시간 측정
# SYN 전송 시각과 SYN-ACK 수신 시각 차이 확인
고급 활용 팁
1. TCP 플래그 필터링
# SYN 패킷만
sudo tcpdump 'tcp[tcpflags] & tcp-syn != 0'
# RST (연결 거부) 패킷
sudo tcpdump 'tcp[tcpflags] & tcp-rst != 0'
# FIN (연결 종료) 패킷
sudo tcpdump 'tcp[tcpflags] & tcp-fin != 0'
2. 패킷 크기 필터
# 큰 패킷만 (1000바이트 이상)
sudo tcpdump 'ip[2:2] > 1000'
# 작은 패킷만
sudo tcpdump 'ip[2:2] < 100'
3. 네트워크 대역 필터
# 특정 서브넷
sudo tcpdump net 192.168.1.0/24
# 서브넷 제외
sudo tcpdump not net 10.0.0.0/8
4. 실시간 분석과 파일 저장 동시에
# tee를 활용한 동시 출력
sudo tcpdump -i any -l host github.com | tee capture.log
트러블슈팅 체크리스트
- 네트워크 문제 발생 시
1단계: 연결 확인
# 패킷이 전송되는가?
sudo tcpdump -c 10 host TARGET_HOST
2단계: 프로토콜 확인
# 어떤 프로토콜을 사용하는가?
sudo tcpdump -i any host TARGET_HOST
3단계: 응답 시간 측정
# SYN → SYN-ACK 시간 차이 확인
sudo tcpdump -tttt host TARGET_HOST and port TARGET_PORT
4단계: 에러 패킷 확인
# RST, FIN 등 비정상 종료 패킷
sudo tcpdump 'tcp[tcpflags] & (tcp-rst|tcp-fin) != 0'
5단계: 패킷 내용 분석
# 실제 데이터 확인
sudo tcpdump -X -s 0 host TARGET_HOST
tcpdump vs Wireshark
| 특징 | tcpdump | Wireshark |
| 인터페이스 | CLI | GUI |
| 사용 환경 | 서버, 원격 | 데스크톱 |
| 실시간 분석 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 상세 분석 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 리소스 사용 | 낮음 | 높음 |
조합 사용: tcpdump로 캡처 → Wireshark로 상세 분석
# tcpdump로 캡처
sudo tcpdump -w capture.pcap
# Wireshark로 열기
wireshark capture.pcap
주의사항
1. 권한
tcpdump는 root 권한이 필요하다.
# sudoers 설정으로 특정 사용자 허용 가능
sudo visudo
# username ALL=(ALL) NOPASSWD: /usr/sbin/tcpdump
2. 개인정보 보호
캡처된 패킷에는 민감한 정보가 포함될 수 있다.
- 평문 비밀번호 (HTTP, FTP 등)
- 쿠키, 세션 토큰
- API 키
암호화되지 않은 프로토콜 사용 시 주의!
3. 성능 영향
프로덕션 환경에서는
- 필터를 정확히 지정
- 불필요한 패킷 캡처 최소화
- 파일 저장 시 디스크 공간 확인
자주 사용하는 명령어 모음
# 1. HTTP 트래픽 모니터링
sudo tcpdump -i any -A 'tcp port 80'
# 2. HTTPS 핸드셰이크 확인
sudo tcpdump -i any 'tcp port 443 and (tcp[tcpflags] & tcp-syn != 0)'
# 3. DNS 쿼리 디버깅
sudo tcpdump -i any -vvv port 53
# 4. 특정 IP 간 모든 트래픽
sudo tcpdump host 192.168.1.100 and host 192.168.1.200
# 5. 브로드캐스트/멀티캐스트 패킷
sudo tcpdump ether broadcast or ether multicast
# 6. ARP 패킷
sudo tcpdump arp
# 7. IPv6 트래픽
sudo tcpdump ip6
# 8. ICMP (ping) 패킷
sudo tcpdump icmp
# 9. 비정상 연결 종료 모니터링
sudo tcpdump 'tcp[tcpflags] & tcp-rst != 0'
# 10. 재전송 패킷 확인 (간접적)
sudo tcpdump -tttt 'tcp[tcpflags] & tcp-push != 0'
결론
tcpdump는 네트워크 문제를 추측이 아닌 데이터로 진단할 수 있게 해주는 강력한 도구이다.
이 글에서 다룬 SSH 연결 지연 문제도 tcpdump 없이는 "네트워크가 느리다"는 막연한 추측에 그쳤을 것이다. 하지만 tcpdump로 정확히 SSH 키 교환 단계에서 30초 지연이 발생한다는 것을 확인하고, 근본 원인을 해결할 수 있었다.
핵심 요약
- 필터링이 핵심 - 정확한 필터로 원하는 트래픽만 캡처
- 타임스탬프 활용 - 지연 구간을 정확히 측정
- 플래그 분석 - SYN, ACK, RST 등으로 연결 상태 파악
- 파일 저장 - 나중에 상세 분석 가능
네트워크 문제가 발생하면, 일단 tcpdump부터 실행하세요!
Reference
Somaz | DevOps Engineer | Kubernetes & Cloud Infrastructure Specialist
'Network' 카테고리의 다른 글
| 네트워크 토폴로지 모델 완전 가이드: 허브-스포크부터 메시까지 (0) | 2026.02.03 |
|---|---|
| 가상화 네트워킹 핵심 개념: Linux, KVM, libvirt (0) | 2025.11.19 |
| Bridge 모드 심화 분석: L2 투명성과 네트워크 세그먼트 (3) | 2025.08.11 |
| SSH 터널링이란? 개념부터 활용까지 알아보자! (1) | 2025.04.24 |
| Reverse Proxy(역방향 프록시)란? (2) | 2024.11.13 |