tcpdump 로테이션 저장 완벽 가이드 2026 | 디스크 공간 걱정 없는 패킷 캡처

서버 모니터링 중 디스크가 꽉 찬 경험이 있나요? 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 위험 완전 차단
  • 운영 효율성: 자동화된 로그 관리
  • 📊 분석 편의성: 적절한 크기의 파일로 빠른 분석

장기적인 효과:

  • 예측 가능한 디스크 사용량으로 용량 계획 수립
  • 표준화된 로그 관리 프로세스 확립
  • 보안 사고 대응 능력 향상

다음 단계 실천 가이드:

  1. 테스트 환경에서 실습: 각 옵션별 동작 확인
  2. 점진적 적용: 개발 → 스테이징 → 운영 순서로 적용
  3. 모니터링 강화: 자동화 스크립트와 알람 체계 구축
  4. 정기 검토: 트래픽 패턴 변화에 따른 설정 최적화

네트워크 운영의 달인이 되는 길, 안전한 tcpdump 로테이션 설정부터 시작해보세요!


참고 자료:

관련 글:

  • 와이어샤크 필터링 완벽 가이드
  • 네트워크 보안 모니터링 실무 노하우
  • Linux 시스템 로그 관리 베스트 프랙티스

💬 실무 경험 공유해주세요! tcpdump 로테이션을 사용하면서 겪은 특별한 이슈나 노하우가 있다면 댓글로 공유해주세요. 여러분의 경험이 다른 독자들에게 큰 도움이 됩니다!

댓글

Designed by JB FACTORY