tcpreplay 패킷 재전송 완벽 가이드: 네트워크 테스트의 필수 도구

"실제 네트워크 트래픽을 그대로 재현할 수 있다면 얼마나 좋을까요? tcpreplay는 캡처된 패킷을 실시간으로 재전송하여 네트워크 장비 테스트, 보안 분석, 성능 측정을 가능하게 하는 강력한 도구입니다. 전 세계 네트워크 엔지니어들이 신뢰하는 이 도구의 모든 것을 마스터해보세요."

🎯 목차

  1. tcpreplay란 무엇인가?
  2. 운영체제별 설치 가이드
  3. 기본 사용법과 핵심 옵션
  4. 고급 패킷 재전송 기법
  5. 실무 활용 시나리오
  6. 성능 최적화와 트러블슈팅
  7. 보안 테스트와 분석 활용

🌟 tcpreplay란 무엇인가?

🔍 핵심 개념과 용도

tcpreplay는 미리 캡처된 네트워크 패킷(pcap 파일)을 실제 네트워크 인터페이스로 재전송하는 오픈소스 도구입니다. Wireshark나 tcpdump로 캡처한 트래픽을 그대로 재현할 수 있어 네트워크 테스트와 분석에 필수적인 도구입니다.

🎪 왜 tcpreplay가 필요한가?

tcpreplay
tcpreplay

현실적인 네트워크 테스트 상황들:

테스트 시나리오 기존 방법의 한계 tcpreplay 해결책

방화벽 성능 테스트 인위적 트래픽으로 제한적 실제 트래픽 패턴 재현
IDS/IPS 검증 가상 공격만 테스트 실제 공격 패킷 재전송
네트워크 장비 부하 테스트 단순 ping으로만 측정 다양한 프로토콜 동시 테스트
애플리케이션 성능 분석 프로덕션 환경 직접 테스트 안전한 환경에서 실제 트래픽 재현

💡 실무 팁: tcpreplay를 사용하면 실제 프로덕션 트래픽을 99% 동일하게 재현할 수 있어, 테스트 환경에서도 현실적인 결과를 얻을 수 있습니다.

📊 tcpreplay 도구 모음

tcpreplay는 단일 도구가 아닌 패킷 처리 도구 모음입니다:

tcpreplay 패키지 구성:
├── tcpreplay     : 패킷 재전송 (단일 인터페이스)
├── tcprewrite    : 패킷 내용 수정
├── tcpprep       : 트래픽 분할 준비
├── tcpreplay-edit: 패킷 편집 후 재전송
├── tcpbridge     : 브릿지 모드 재전송
└── tcpliveplay   : 실시간 패킷 캡처/재전송


📦 운영체제별 설치 가이드

🐧 Ubuntu/Debian 설치

APT 패키지 관리자 사용

# 패키지 목록 업데이트
sudo apt update

# tcpreplay 설치
sudo apt-get install tcpreplay

# 설치 확인
tcpreplay --version

추가 유용한 패키지

# 함께 설치하면 좋은 도구들
sudo apt-get install tcpdump wireshark-cli netcat-openbsd

# 개발 도구 (소스 컴파일 시 필요)
sudo apt-get install build-essential libpcap-dev git

🎩 Fedora 설치

DNF/YUM 패키지 관리자

# Fedora (최신 버전)
sudo dnf install tcpreplay

# 또는 구버전 Fedora
sudo yum install tcpreplay

# 설치 확인 및 기능 테스트
tcpreplay --listnics

🏗️ CentOS/RHEL 설치

패키지 저장소 방식 (RHEL 7+)

# EPEL 저장소 활성화
sudo yum install epel-release

# tcpreplay 설치
sudo yum install tcpreplay

소스 컴파일 방식 (권장)

# 개발 도구 그룹 설치
sudo yum groupinstall "Development Tools"

# 의존성 패키지 설치
sudo yum install libpcap-devel libnet-devel

# 최신 소스 다운로드 및 컴파일
wget <https://github.com/appneta/tcpreplay/releases/download/v4.4.3/tcpreplay-4.4.3.tar.xz>
tar -xf tcpreplay-4.4.3.tar.xz
cd tcpreplay-4.4.3

# 컴파일 옵션 설정
./configure --enable-dynamic-link --enable-64bits --with-libpcap

# 컴파일 및 설치
make -j$(nproc)
sudo make install

# 라이브러리 경로 설정
sudo ldconfig

🍎 macOS 설치

Homebrew 사용

# Homebrew 설치 (미설치 시)
/bin/bash -c "$(curl -fsSL <https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh>)"

# tcpreplay 설치
brew install tcpreplay

# 권한 설정 (필요시)
sudo chown -R $(whoami) /usr/local/lib/pkgconfig

🔧 설치 후 환경 설정

권한 설정 및 보안

# tcpreplay를 위한 특별 권한 설정 (Linux)
sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/tcpreplay

# 또는 sudo 없이 사용하기 위한 그룹 추가
sudo usermod -a -G wireshark $USER
newgrp wireshark

# 설치 확인 및 인터페이스 목록 보기
tcpreplay --listnics


⚙️ 기본 사용법과 핵심 옵션

🎯 기본 패킷 재전송

가장 간단한 사용법

# 기본 패킷 재전송 (eth0 인터페이스 사용)
sudo tcpreplay -i eth0 captured_traffic.pcap

# 여러 pcap 파일 동시 재전송
sudo tcpreplay -i eth0 file1.pcap file2.pcap file3.pcap

# 특정 패킷 수만 재전송
sudo tcpreplay -i eth0 -L 100 large_capture.pcap

상세 정보 출력 옵션

# 자세한 재전송 정보 출력
sudo tcpreplay -i eth0 -v traffic.pcap

# 더 상세한 디버그 정보
sudo tcpreplay -i eth0 -vv traffic.pcap

# 패킷별 상세 정보 (매우 상세)
sudo tcpreplay -i eth0 -vvv traffic.pcap

🚀 속도 제어 옵션

PPS (Packets Per Second) 제어

# 초당 100개 패킷으로 제한
sudo tcpreplay -i eth0 --pps=100 traffic.pcap

# 초당 1000개 패킷 (고속 재전송)
sudo tcpreplay -i eth0 --pps=1000 heavy_traffic.pcap

# 동적 PPS 조절 스크립트
#!/bin/bash
PCAP_FILE="test_traffic.pcap"
INTERFACE="eth0"

for pps in 10 50 100 500 1000; do
    echo "PPS $pps로 테스트 중..."
    sudo tcpreplay -i $INTERFACE --pps=$pps $PCAP_FILE
    sleep 2
done

대역폭 기반 속도 제어

# 초당 10Mbps로 제한
sudo tcpreplay -i eth0 --mbps=10.0 traffic.pcap

# 초당 1Gbps (기가비트) 속도
sudo tcpreplay -i eth0 --mbps=1000.0 high_bandwidth.pcap

# 실시간 대역폭 모니터링과 함께
sudo tcpreplay -i eth0 --mbps=100.0 -v traffic.pcap &
watch -n 1 'iftop -i eth0 -t -s 5'

최고 속도 및 배속 조절

# 최대 가능한 속도로 재전송
sudo tcpreplay -i eth0 --topspeed traffic.pcap

# 원래 속도의 2배로 재전송
sudo tcpreplay -i eth0 --multiplier=2.0 traffic.pcap

# 원래 속도의 절반으로 재전송
sudo tcpreplay -i eth0 --multiplier=0.5 traffic.pcap

# 가능한 빨리 재전송 (짧은 옵션)
sudo tcpreplay -i eth0 -t traffic.pcap

🔁 반복 재전송 옵션

반복 횟수 제어

# 5번 반복 재전송
sudo tcpreplay -i eth0 -l 5 traffic.pcap

# 무한 반복 (Ctrl+C로 중지)
sudo tcpreplay -i eth0 -l 0 traffic.pcap

# 시간 기반 반복 (10분간 계속)
timeout 600 sudo tcpreplay -i eth0 -l 0 traffic.pcap

🛡️ 방화벽 설정 (RST 패킷 방지)

iptables를 이용한 RST 패킷 차단

# RST 패킷 차단 (송신)
sudo iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP

# 특정 인터페이스에서만 RST 차단
sudo iptables -A OUTPUT -o eth0 -p tcp --tcp-flags RST RST -j DROP

# 특정 포트에 대한 RST 차단
sudo iptables -A OUTPUT -p tcp --dport 80 --tcp-flags RST RST -j DROP

# 설정 확인
sudo iptables -L OUTPUT -v -n

# 설정 저장 (Ubuntu)
sudo iptables-save > /etc/iptables/rules.v4

방화벽 설정 스크립트

#!/bin/bash
# setup_tcpreplay_firewall.sh

echo "tcpreplay를 위한 방화벽 설정 중..."

# 기존 RST 차단 규칙 제거
sudo iptables -D OUTPUT -p tcp --tcp-flags RST RST -j DROP 2>/dev/null

# 새로운 RST 차단 규칙 추가
sudo iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP

# 설정 확인
echo "현재 방화벽 규칙:"
sudo iptables -L OUTPUT -v -n | grep RST

echo "방화벽 설정 완료!"
echo "tcpreplay 사용 후 다음 명령으로 규칙을 제거하세요:"
echo "sudo iptables -D OUTPUT -p tcp --tcp-flags RST RST -j DROP"


🎭 고급 패킷 재전송 기법

🔧 패킷 수정 및 편집

tcprewrite를 이용한 패킷 수정

# MAC 주소 변경
sudo tcprewrite --enet-dmac=00:11:22:33:44:55 \\
                 --enet-smac=66:77:88:99:aa:bb \\
                 --infile=original.pcap \\
                 --outfile=modified.pcap

# IP 주소 변경 (1:1 매핑)
sudo tcprewrite --srcipmap=192.168.1.0/24:10.0.1.0/24 \\
                 --dstipmap=192.168.2.0/24:10.0.2.0/24 \\
                 --infile=original.pcap \\
                 --outfile=ip_changed.pcap

# 포트 번호 변경
sudo tcprewrite --portmap=80:8080,443:8443 \\
                 --infile=web_traffic.pcap \\
                 --outfile=port_changed.pcap

패킷 편집 후 즉시 재전송

# IP 주소 변경하면서 바로 재전송
sudo tcpreplay-edit -i eth0 \\
                    --srcipmap=0.0.0.0/0:192.168.1.100 \\
                    --fixcsum \\
                    original_traffic.pcap

# 체크섬 자동 수정 옵션
sudo tcpreplay-edit -i eth0 \\
                    --fixcsum \\
                    --mtu=1500 \\
                    --mtu-trunc \\
                    large_packet.pcap

🌐 듀얼 인터페이스 재전송

tcpprep을 이용한 트래픽 분할

# 트래픽을 클라이언트/서버로 분할
sudo tcpprep --auto=bridge \\
             --pcap=bidirectional.pcap \\
             --cachefile=traffic.cache

# 분할된 트래픽을 두 인터페이스로 재전송
sudo tcpreplay --intf1=eth0 \\
               --intf2=eth1 \\
               --cachefile=traffic.cache \\
               bidirectional.pcap

네트워크 브릿지 시뮬레이션

# tcpbridge를 이용한 실시간 브릿지
sudo tcpbridge --intf1=eth0 --intf2=eth1 --mac=00:11:22:33:44:55

# 패킷 캡처하면서 동시에 브릿지
sudo tcpbridge --intf1=eth0 --intf2=eth1 \\
               --snaplen=1518 \\
               --verbose \\
               --fixcsum

📊 고급 성능 최적화

멀티스레드 재전송

# preload를 이용한 고성능 재전송
sudo tcpreplay --preload-pcap \\
               --timer=rdtsc \\
               --netmap \\
               --intf1=eth0 \\
               --topspeed \\
               high_volume.pcap

# NUMA 최적화 (고성능 서버)
sudo numactl --cpunodebind=0 --membind=0 \\
             tcpreplay --intf1=eth0 \\
             --timer=gtod \\
             --pps=1000000 \\
             massive_traffic.pcap

정밀한 타이밍 제어

# 나노초 정밀도 타이밍
sudo tcpreplay --intf1=eth0 \\
               --timer=nano \\
               --accurate \\
               --preload-pcap \\
               precise_timing.pcap

# 지터(Jitter) 추가
sudo tcpreplay --intf1=eth0 \\
               --pps=100 \\
               --jitter=50 \\
               realistic_network.pcap


💼 실무 활용 시나리오

🛡️ 방화벽 성능 테스트

단계적 부하 증가 테스트

#!/bin/bash
# firewall_stress_test.sh

PCAP_FILE="mixed_traffic.pcap"
INTERFACE="eth0"
RESULTS_FILE="firewall_test_results.txt"

echo "방화벽 성능 테스트 시작" > $RESULTS_FILE
echo "===================" >> $RESULTS_FILE

# 다양한 PPS로 테스트
for pps in 100 500 1000 5000 10000 50000; do
    echo "PPS $pps 테스트 중..." | tee -a $RESULTS_FILE

    # 시작 시간 기록
    start_time=$(date +%s)

    # 1분간 패킷 재전송
    timeout 60 sudo tcpreplay -i $INTERFACE --pps=$pps -l 0 $PCAP_FILE

    # 종료 시간 기록
    end_time=$(date +%s)
    duration=$((end_time - start_time))

    # CPU 사용률 측정
    cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | awk -F'%' '{print $1}')

    echo "지속 시간: ${duration}초, CPU 사용률: ${cpu_usage}%" >> $RESULTS_FILE

    # 다음 테스트 전 잠시 대기
    sleep 30
done

echo "테스트 완료! 결과: $RESULTS_FILE"

실제 공격 패턴 재현

# DDoS 공격 패턴 재전송
sudo tcpreplay -i eth0 \\
               --pps=10000 \\
               --loop=0 \\
               ddos_attack.pcap &

# SYN Flood 공격 시뮬레이션
sudo tcpreplay -i eth0 \\
               --topspeed \\
               --loop=100 \\
               syn_flood.pcap

# HTTP Flood 공격
sudo tcpreplay -i eth0 \\
               --mbps=100 \\
               --loop=50 \\
               http_flood.pcap

📡 네트워크 장비 테스트

스위치/라우터 처리량 테스트

#!/bin/bash
# network_device_test.sh

DEVICE_UNDER_TEST="192.168.1.1"
TEST_INTERFACE="eth0"

echo "네트워크 장비 처리량 테스트"
echo "테스트 대상: $DEVICE_UNDER_TEST"
echo "=========================="

# 다양한 패킷 크기로 테스트
for packet_size in 64 128 256 512 1024 1518; do
    echo "패킷 크기 ${packet_size}바이트 테스트..."

    # 해당 크기의 테스트 패킷 생성 및 재전송
    sudo tcpreplay -i $TEST_INTERFACE \\
                   --pps=100000 \\
                   --duration=30 \\
                   --fixcsum \\
                   packet_${packet_size}.pcap

    # 지연시간 측정
    ping_result=$(ping -c 10 -s $packet_size $DEVICE_UNDER_TEST | tail -1 | awk -F'/' '{print $5}')
    echo "평균 지연시간: ${ping_result}ms"

    sleep 10
done

🔍 애플리케이션 성능 분석

웹 서버 부하 테스트

# 웹 트래픽 패턴 재현
sudo tcpreplay -i eth0 \\
               --pps=1000 \\
               --loop=10 \\
               web_traffic_peak_hour.pcap &

# 실시간 서버 성능 모니터링
watch -n 1 'curl -w "@curl-format.txt" -o /dev/null -s <http://target-server/>'

# curl-format.txt 내용:
#     time_namelookup:  %{time_namelookup}\\n
#     time_connect:     %{time_connect}\\n
#     time_appconnect:  %{time_appconnect}\\n
#     time_pretransfer: %{time_pretransfer}\\n
#     time_redirect:    %{time_redirect}\\n
#     time_starttransfer: %{time_starttransfer}\\n
#     time_total:       %{time_total}\\n

데이터베이스 연결 테스트

#!/bin/bash
# db_connection_test.sh

DB_HOST="192.168.1.100"
DB_PORT="3306"
TEST_INTERFACE="eth0"

echo "데이터베이스 연결 부하 테스트"

# MySQL 트래픽 재전송
sudo tcpreplay -i $TEST_INTERFACE \\
               --pps=500 \\
               --loop=20 \\
               mysql_queries.pcap &

# 연결 수 모니터링
while true; do
    connections=$(mysql -h$DB_HOST -P$DB_PORT -e "SHOW STATUS LIKE 'Threads_connected';" | tail -1 | awk '{print $2}')
    echo "현재 연결 수: $connections"
    sleep 5
done

🎯 보안 테스트 시나리오

침입 탐지 시스템(IDS) 테스트

# 알려진 공격 패턴 재전송
sudo tcpreplay -i eth0 \\
               --topspeed \\
               malware_samples.pcap

# 이상 트래픽 패턴 재현
sudo tcpreplay -i eth0 \\
               --pps=1000 \\
               --jitter=100 \\
               anomalous_traffic.pcap

# 스텔스 스캔 시뮬레이션
sudo tcpreplay -i eth0 \\
               --pps=10 \\
               --duration=3600 \\
               stealth_scan.pcap


⚡ 성능 최적화와 트러블슈팅

🚀 성능 최적화 기법

시스템 레벨 최적화

# 네트워크 버퍼 크기 증가
echo 'net.core.rmem_max = 134217728' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 134217728' >> /etc/sysctl.conf
echo 'net.core.netdev_max_backlog = 30000' >> /etc/sysctl.conf

# CPU 스케일링 비활성화 (성능 모드)
echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# 인터럽트 친화성 설정
echo 2 > /proc/irq/24/smp_affinity  # eth0 인터럽트를 CPU 1에 고정

# 적용
sudo sysctl -p

tcpreplay 고성능 옵션

# 최고 성능을 위한 완전한 명령어
sudo tcpreplay --intf1=eth0 \\
               --preload-pcap \\
               --timer=rdtsc \\
               --pps-multi=1000000 \\
               --netmap \\
               --no-flow-stats \\
               --quiet \\
               high_performance.pcap

# 메모리 맵 파일 사용
sudo tcpreplay --intf1=eth0 \\
               --preload-pcap \\
               --mmap \\
               --enable-file-cache \\
               --topspeed \\
               large_file.pcap

🔧 일반적인 문제 해결

패킷 드롭 문제

# 문제 진단
# 1. 인터페이스 통계 확인
ip -s link show eth0

# 2. 버퍼 오버런 확인
cat /proc/net/dev

# 3. tcpreplay 통계 확인
sudo tcpreplay -i eth0 -v -S traffic.pcap 2>&1 | grep -E "(Successful|Failed|Truncated)"

# 해결책
# 1. 버퍼 크기 증가
sudo tcpreplay --intf1=eth0 \\
               --preload-pcap \\
               --timer=select \\
               --pps=1000 \\
               traffic.pcap

# 2. 작은 배치로 분할 전송
split -l 10000 large.pcap small_batch_
for file in small_batch_*; do
    sudo tcpreplay -i eth0 "$file"
    sleep 1
done

권한 관련 문제

# 문제: "Can't open eth0: Operation not permitted"
# 해결 1: sudo 사용
sudo tcpreplay -i eth0 traffic.pcap

# 해결 2: capabilities 설정
sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/tcpreplay

# 해결 3: 사용자 그룹 추가
sudo usermod -a -G wireshark $USER
newgrp wireshark

# 권한 확인
getcap /usr/bin/tcpreplay

메모리 부족 문제

# 대용량 pcap 파일 처리
# 1. 스트리밍 모드 사용
sudo tcpreplay --intf1=eth0 \\
               --enable-file-cache \\
               --cachefile=/tmp/tcpreplay.cache \\
               huge_file.pcap

# 2. 파일 분할
tcpdump -r huge_file.pcap -w small_file -C 100  # 100MB 단위로 분할

# 3. 압축 파일 직접 처리
zcat compressed.pcap.gz | sudo tcpreplay --intf1=eth0 -

📊 성능 모니터링

실시간 성능 측정 스크립트

#!/bin/bash
# tcpreplay_monitor.sh

INTERFACE="eth0"
INTERVAL=1

echo "tcpreplay 성능 모니터링"
echo "===================="
echo "시간,전송 패킷,수신 패킷,드롭 패킷,CPU %,메모리 MB"

while true; do
    # 네트워크 통계 수집
    tx_packets=$(cat /sys/class/net/$INTERFACE/statistics/tx_packets)
    rx_packets=$(cat /sys/class/net/$INTERFACE/statistics/rx_packets)
    tx_dropped=$(cat /sys/class/net/$INTERFACE/statistics/tx_dropped)

    # 시스템 리소스 수집
    cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | awk -F'%' '{print $1}')
    mem_usage=$(free -m | awk 'NR==2{print $3}')

    # CSV 형태로 출력
    timestamp=$(date '+%H:%M:%S')
    echo "$timestamp,$tx_packets,$rx_packets,$tx_dropped,$cpu_usage,$mem_usage"

    sleep $INTERVAL
done


🛡️ 보안 테스트와 분석 활용

🎭 펜테스트 시나리오

네트워크 스캔 시뮬레이션

# Nmap 스캔 패킷 재현
sudo tcpreplay -i eth0 \\
               --pps=100 \\
               --loop=5 \\
               nmap_scan.pcap

# 포트 스캔 탐지 테스트
sudo tcpreplay -i eth0 \\
               --pps=1000 \\
               --duration=300 \\
               port_scan_patterns.pcap

# 스텔스 스캔 (느린 속도)
sudo tcpreplay -i eth0 \\
               --pps=1 \\
               --loop=0 \\
               stealth_scan.pcap

 

댓글

Designed by JB FACTORY