서버 모니터링 중 디스크가 꽉 찬 경험이 있나요? tcpdump로 패킷을 캡처하다 보면 파일 크기가 기하급수적으로 증가해 시스템에 부담을 줄 수 있습니다. 이 글에서는 tcpdump의 로테이션 저장 기능을 완벽히 마스터하여 안전하고 효율적인 네트워크 모니터링 환경을 구축하는 방법을 알아보겠습니다.
tcpdump 로테이션이 반드시 필요한 이유
디스크 공간 폭탄을 피하는 방법
네트워크 트래픽이 많은 서버에서 tcpdump를 무제한으로 실행하면 어떤 일이 벌어질까요?
실제 사례:
# 1Gbps 네트워크에서 1시간 캡처 시
# 예상 파일 크기: 약 100GB~400GB
# 하루 운영 시: 최대 9.6TB!
로테이션 없이 운영할 때의 위험:
- 💥 디스크 Full: 시스템 전체 다운 위험
- 🐌 성능 저하: 대용량 파일 처리로 인한 I/O 부하
- 📈 관리 복잡성: 거대한 단일 파일 분석의 어려움
- ❌ 데이터 손실: 시스템 다운 시 전체 캡처 데이터 유실
<a id="basic-options"></a>
tcpdump 로테이션 기본 옵션 마스터하기
핵심 옵션 3총사
tcpdump의 로테이션 기능은 세 가지 옵션의 조합으로 구현됩니다:
1. -w (Write) 옵션
tcpdump -w capture.pcap
캡처 데이터를 파일로 저장하는 기본 옵션입니다.
2. -C (File size) 옵션
tcpdump -C 100 -w capture.pcap
# 100MB마다 새 파일 생성
3. -W (File count) 옵션
tcpdump -W 5 -C 100 -w capture.pcap
# 최대 5개 파일 유지, 100MB마다 로테이션
파일 명명 규칙 이해하기
로테이션 사용 시 파일명이 어떻게 생성되는지 알아봅시다:
# 기본 명명 규칙
capture.pcap # 첫 번째 파일
capture.pcap1 # 두 번째 파일
capture.pcap2 # 세 번째 파일
...
capture.pcap4 # 다섯 번째 파일 (W=5일 때)
# 순환 후
capture.pcap # 새로운 첫 번째 파일 (기존 덮어씀)
크기 기반 로테이션 완벽 설정
최적 파일 크기 결정하기
파일 크기별 장단점 분석:
파일 크기 장점 단점 권장 용도
| 10MB | 빠른 분석, 세밀한 제어 | 잦은 로테이션, 관리 복잡 | 개발/테스트 환경 |
| 100MB | 균형잡힌 선택 | - | 일반 운영 환경 |
| 1GB | 적은 파일 수 | 분석 시간 증가 | 고트래픽 환경 |
실전 설정 예제
1. 웹서버 모니터링 (권장 설정)
# 100MB, 최대 10개 파일 유지 (총 1GB)
tcpdump -i eth0 -C 100 -W 10 -w /var/log/tcpdump/web_traffic.pcap
# 예상 디스크 사용량: 1GB
# 로테이션 주기: 트래픽에 따라 1시간~6시간
2. 데이터베이스 서버 모니터링
# 포트 3306(MySQL) 트래픽만 캡처
tcpdump -i eth0 port 3306 -C 50 -W 20 -w /var/log/tcpdump/db_traffic.pcap
# 총 디스크 사용량: 1GB
# MySQL 트래픽만 필터링하여 효율적 저장
3. 고트래픽 환경 (CDN, 로드밸런서)
# 500MB, 최대 20개 파일 (총 10GB)
tcpdump -i eth0 -C 500 -W 20 -w /data/captures/high_traffic.pcap
# 디스크 사용량: 10GB
# 대용량 트래픽 대응
시간 기반 로테이션 구현하기
tcpdump는 네이티브한 시간 기반 로테이션을 지원하지 않지만, 다양한 방법으로 구현할 수 있습니다.
방법 1: logrotate 활용
설정 파일 작성 (/etc/logrotate.d/tcpdump):
/var/log/tcpdump/*.pcap {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
/usr/bin/killall -HUP tcpdump 2>/dev/null || true
endscript
}
설명:
- daily: 매일 로테이션
- rotate 7: 7개 파일 유지
- compress: 압축 저장으로 공간 절약
- postrotate: 로테이션 후 tcpdump 재시작
방법 2: cron과 스크립트 조합
1시간마다 로테이션하는 스크립트:
#!/bin/bash
# /usr/local/bin/tcpdump_hourly_rotate.sh
CAPTURE_DIR="/var/log/tcpdump"
INTERFACE="eth0"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
FILENAME="capture_${TIMESTAMP}.pcap"
# 기존 tcpdump 프로세스 종료
pkill tcpdump
# 새로운 캡처 시작
tcpdump -i $INTERFACE -w ${CAPTURE_DIR}/${FILENAME} &
# 7일 이전 파일 삭제
find $CAPTURE_DIR -name "capture_*.pcap" -mtime +7 -delete
echo "$(date): Rotated to $FILENAME" >> /var/log/tcpdump_rotation.log
crontab 설정:
# 매시간 0분에 로테이션 실행
0 * * * * /usr/local/bin/tcpdump_hourly_rotate.sh
고급 로테이션 전략
트래픽량 적응형 로테이션
네트워크 트래픽이 불규칙한 환경에서는 고정 크기 로테이션보다 동적 로테이션이 효과적입니다.
스마트 로테이션 스크립트:
#!/bin/bash
# 트래픽량에 따른 동적 파일 크기 조정
check_network_load() {
# 현재 네트워크 사용률 확인 (MB/s)
CURRENT_LOAD=$(sar -n DEV 1 1 | grep eth0 | tail -1 | awk '{print $5}' | cut -d. -f1)
if [ $CURRENT_LOAD -gt 100 ]; then
echo 500 # 고트래픽: 500MB
elif [ $CURRENT_LOAD -gt 50 ]; then
echo 200 # 중간트래픽: 200MB
else
echo 100 # 저트래픽: 100MB
fi
}
DYNAMIC_SIZE=$(check_network_load)
tcpdump -i eth0 -C $DYNAMIC_SIZE -W 10 -w /var/log/tcpdump/adaptive.pcap
압축을 활용한 저장공간 최적화
실시간 압축 파이프라인:
# tcpdump → gzip 파이프라인
tcpdump -i eth0 -w - | gzip > /var/log/tcpdump/compressed_$(date +%Y%m%d_%H%M%S).pcap.gz
# 또는 더 높은 압축률의 xz 사용
tcpdump -i eth0 -w - | xz -z > /var/log/tcpdump/compressed_$(date +%Y%m%d_%H%M%S).pcap.xz
압축률 비교:
- 원본 크기: 1GB
- gzip 압축: 약 200-300MB (70-80% 절약)
- xz 압축: 약 150-200MB (80-85% 절약)
실무 시나리오별 최적 설정
시나리오 1: 24/7 웹서버 모니터링
요구사항:
- 연중무휴 모니터링
- 최근 7일간 데이터 보관
- 디스크 사용량 5GB 이하
최적 설정:
#!/bin/bash
# 웹서버 모니터링 스크립트
# HTTP/HTTPS 트래픽만 캡처
tcpdump -i eth0 'port 80 or port 443' \\\\
-C 100 -W 50 \\\\
-w /var/log/tcpdump/webserver.pcap \\\\
-z gzip &
# 프로세스 ID 저장
echo $! > /var/run/tcpdump_web.pid
# 7일 이상 된 압축 파일 자동 삭제
find /var/log/tcpdump -name "*.pcap.gz" -mtime +7 -delete
시나리오 2: 보안 이벤트 대응
요구사항:
- 보안 이벤트 발생 시 상세 분석 가능
- 높은 해상도의 패킷 캡처
- 긴급 상황 대응 가능한 구조
설정 예시:
# 보안 모니터링 전용 설정
tcpdump -i eth0 -s 0 \\\\
-C 1000 -W 5 \\\\
-w /var/log/security/incident_$(date +%Y%m%d).pcap
# -s 0: 전체 패킷 캡처 (헤더만이 아닌)
# 1GB씩 5개 파일로 총 5GB 사용
시나리오 3: 개발 환경 디버깅
요구사항:
- 빠른 분석을 위한 작은 파일 크기
- 자주 변경되는 설정에 대응
- 개발자 친화적 파일 관리
설정 방법:
# 개발 환경용 설정
tcpdump -i lo0 port 8080 \\\\
-C 10 -W 20 \\\\
-w /tmp/debug/api_debug.pcap
# 10MB씩 20개 파일 (총 200MB)
# localhost 트래픽만 캡처하여 API 디버깅에 최적화
<a id="automation-scripts"></a>
완전 자동화 스크립트 작성
올인원 모니터링 스크립트
#!/bin/bash
# tcpdump_manager.sh - 통합 tcpdump 관리 스크립트
# 설정 변수
CONFIG_FILE="/etc/tcpdump/config"
LOG_DIR="/var/log/tcpdump"
PID_FILE="/var/run/tcpdump_manager.pid"
# 설정 로드
load_config() {
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
else
# 기본 설정
INTERFACE="eth0"
FILE_SIZE=100
FILE_COUNT=10
FILTER=""
COMPRESS=true
fi
}
# tcpdump 시작
start_capture() {
echo "Starting tcpdump with rotation..."
CAPTURE_CMD="tcpdump -i $INTERFACE"
if [ ! -z "$FILTER" ]; then
CAPTURE_CMD="$CAPTURE_CMD $FILTER"
fi
CAPTURE_CMD="$CAPTURE_CMD -C $FILE_SIZE -W $FILE_COUNT -w $LOG_DIR/capture.pcap"
if [ "$COMPRESS" = true ]; then
CAPTURE_CMD="$CAPTURE_CMD -z gzip"
fi
eval $CAPTURE_CMD &
echo $! > $PID_FILE
echo "tcpdump started with PID $(cat $PID_FILE)"
}
# tcpdump 중지
stop_capture() {
if [ -f "$PID_FILE" ]; then
PID=$(cat $PID_FILE)
kill $PID
rm $PID_FILE
echo "tcpdump stopped (PID: $PID)"
else
echo "No running tcpdump found"
fi
}
# 상태 확인
status_check() {
if [ -f "$PID_FILE" ]; then
PID=$(cat $PID_FILE)
if ps -p $PID > /dev/null; then
echo "tcpdump is running (PID: $PID)"
# 디스크 사용량 확인
DISK_USAGE=$(du -sh $LOG_DIR | cut -f1)
echo "Disk usage: $DISK_USAGE"
# 파일 목록
echo "Recent capture files:"
ls -lth $LOG_DIR/*.pcap* | head -5
else
echo "tcpdump PID file exists but process not running"
rm $PID_FILE
fi
else
echo "tcpdump is not running"
fi
}
# 로그 정리
cleanup_logs() {
echo "Cleaning up old capture files..."
find $LOG_DIR -name "*.pcap*" -mtime +7 -delete
echo "Cleanup completed"
}
# 메인 로직
case "$1" in
start)
load_config
start_capture
;;
stop)
stop_capture
;;
restart)
stop_capture
sleep 2
load_config
start_capture
;;
status)
status_check
;;
cleanup)
cleanup_logs
;;
*)
echo "Usage: $0 {start|stop|restart|status|cleanup}"
exit 1
;;
esac
systemd 서비스로 등록하기
서비스 파일 작성 (/etc/systemd/system/tcpdump-rotation.service):
[Unit]
Description=tcpdump with Rotation
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/tcpdump_manager.sh start
ExecStop=/usr/local/bin/tcpdump_manager.sh stop
ExecReload=/usr/local/bin/tcpdump_manager.sh restart
PIDFile=/var/run/tcpdump_manager.pid
Restart=always
RestartSec=5
User=root
[Install]
WantedBy=multi-user.target
서비스 활성화:
# 서비스 등록 및 시작
sudo systemctl daemon-reload
sudo systemctl enable tcpdump-rotation
sudo systemctl start tcpdump-rotation
# 상태 확인
sudo systemctl status tcpdump-rotation
문제해결 가이드
자주 발생하는 문제와 해결방법
1. 권한 문제
# 증상: Permission denied 에러
# 해결: 적절한 권한 부여
sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/tcpdump
# 또는 sudo로 실행
sudo tcpdump -C 100 -W 10 -w capture.pcap
2. 디스크 공간 부족
# 실시간 디스크 사용량 모니터링
watch -n 5 'df -h /var/log/tcpdump'
# 자동 정리 스크립트
#!/bin/bash
USAGE=$(df /var/log/tcpdump | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $USAGE -gt 80 ]; then
find /var/log/tcpdump -name "*.pcap*" -mtime +3 -delete
echo "Emergency cleanup performed - disk usage was ${USAGE}%"
fi
3. 파일 손상 방지
# 안전한 종료를 위한 신호 처리
trap 'echo "Gracefully stopping tcpdump..."; kill $TCPDUMP_PID; exit 0' TERM INT
tcpdump -C 100 -W 10 -w capture.pcap &
TCPDUMP_PID=$!
wait $TCPDUMP_PID
성능 최적화 팁
1. 인터페이스별 최적화
# 고속 네트워크 인터페이스용
tcpdump -i eth0 -C 1000 -W 5 --immediate-mode -w high_speed.pcap
# 가상 인터페이스용
tcpdump -i docker0 -C 50 -W 20 -w container.pcap
2. 버퍼 크기 최적화
# 버퍼 크기 증가로 패킷 손실 방지
tcpdump -i eth0 -B 4096 -C 100 -W 10 -w optimized.pcap
3. CPU 사용량 최적화
# 필터를 사용하여 불필요한 패킷 제외
tcpdump -i eth0 'not port 22' -C 100 -W 10 -w filtered.pcap
# 샘플링 사용 (매 10번째 패킷만 캡처)
tcpdump -i eth0 -c 1 -w /dev/null > /dev/null 2>&1;
tcpdump -i eth0 'ether[0] & 15 = 0' -C 100 -W 10 -w sampled.pcap
마무리: 안전한 네트워크 모니터링 환경 구축하기
tcpdump 로테이션 저장은 단순한 명령어 옵션이 아닌, 안정적인 네트워크 운영의 핵심 요소입니다. 이 글에서 제시한 방법들을 활용하면:
즉시 얻을 수 있는 이점:
- 🛡️ 시스템 안정성: 디스크 Full 위험 완전 차단
- ⚡ 운영 효율성: 자동화된 로그 관리
- 📊 분석 편의성: 적절한 크기의 파일로 빠른 분석
장기적인 효과:
- 예측 가능한 디스크 사용량으로 용량 계획 수립
- 표준화된 로그 관리 프로세스 확립
- 보안 사고 대응 능력 향상
다음 단계 실천 가이드:
- 테스트 환경에서 실습: 각 옵션별 동작 확인
- 점진적 적용: 개발 → 스테이징 → 운영 순서로 적용
- 모니터링 강화: 자동화 스크립트와 알람 체계 구축
- 정기 검토: 트래픽 패턴 변화에 따른 설정 최적화
네트워크 운영의 달인이 되는 길, 안전한 tcpdump 로테이션 설정부터 시작해보세요!
참고 자료:
관련 글:
- 와이어샤크 필터링 완벽 가이드
- 네트워크 보안 모니터링 실무 노하우
- Linux 시스템 로그 관리 베스트 프랙티스
💬 실무 경험 공유해주세요! tcpdump 로테이션을 사용하면서 겪은 특별한 이슈나 노하우가 있다면 댓글로 공유해주세요. 여러분의 경험이 다른 독자들에게 큰 도움이 됩니다!