Linux命令-tcpreplay(数据包重放工具)

Linux命令-tcpreplay(数据包重放工具)

tcpreplay 用于将 tcpdump 捕获的 pcap 文件中的网络数据包重新发送到网络接口上。它在网络设备测试、防火墙规则验证、入侵检测系统测试等场景中非常有用,能够以精确的速度(或原始捕获速度)重现网络流量。

快速参考

bash 复制代码
tcpreplay [选项] [接口] pcap文件...

注意 :tcpreplay 需要直接操作网络接口(发送原始数据包),通常需要 root 权限。在生产环境中使用时务必小心,避免向网络中注入异常流量。

安装

bash 复制代码
# Debian/Ubuntu
sudo apt-get install tcpreplay

# RHEL/CentOS(需要 EPEL 仓库)
sudo yum install epel-release
sudo yum install tcpreplay

# Fedora
sudo dnf install tcpreplay

# 从源码编译
wget https://github.com/appneta/tcpreplay/releases/download/v4.4.0/tcpreplay-4.4.0.tar.gz
tar xzf tcpreplay-4.4.0.tar.gz
cd tcpreplay-4.4.0
./configure && make && sudo make install

# 验证
tcpreplay --version
which tcpreplay

基本重放

bash 复制代码
# 以最高速度重放(无速度限制)
sudo tcpreplay -i eth0 capture.pcap

# 以原始捕获速度重放
sudo tcpreplay -i eth0 --timer=gtod capture.pcap
sudo tcpreplay -i eth0 --intf1=eth0 capture.pcap

# 指定速率限制
sudo tcpreplay -i eth0 --mbps=10 capture.pcap    # 10 Mbps
sudo tcpreplay -i eth0 --pps=1000 capture.pcap    # 1000 包/秒

# 多次循环重放
sudo tcpreplay -i eth0 --loop=5 capture.pcap      # 循环 5 次
sudo tcpreplay -i eth0 --loop=0 capture.pcap      # 无限循环

# 重放前检查 pcap 文件
sudo tcpreplay --preload_pcap capture.pcap

双网口模式(精确计时)

bash 复制代码
# 双网口模式:一个接口发送,一个接口接收计时
# 适用于精确还原捕获速度
sudo tcpreplay --intf1=eth0 --intf2=eth1 capture.pcap

# 指定缓存大小
sudo tcpreplay --intf1=eth0 --intf2=eth1 --cache=1024 capture.pcap

# 使用 select 计时器
sudo tcpreplay --intf1=eth0 --intf2=eth1 --timer=select capture.pcap

编辑和准备 pcap 文件

bash 复制代码
# 使用 tcprewrite 修改数据包(tcpreplay 套件)
# 修改源/目标 IP
sudo tcprewrite --dlink=enet \
    --srcipmap=192.168.1.0/24:10.0.0.0/24 \
    --dstipmap=10.0.0.0/24:192.168.1.0/24 \
    -i input.pcap -o modified.pcap

# 修改 MAC 地址
sudo tcprewrite --dlink=enet \
    --enet-dmac=00:11:22:33:44:55 \
    --enet-smac=55:44:33:22:11:00 \
    -i input.pcap -o modified.pcap

# 端口映射
sudo tcprewrite --dlink=enet \
    --portmap=80:8080 \
    -i input.pcap -o modified.pcap

# 截断/分割 pcap 文件
sudo tcpdump -r input.pcap -c 1000 -w output.pcap

# 查看 pcap 文件信息
sudo tcpdump -r capture.pcap -q
sudo capinfos capture.pcap 2>/dev/null   # Wireshark 套件

实战:防火墙规则测试

bash 复制代码
#!/bin/bash
# 防火墙规则测试脚本
# 用法: ./fw_test.sh capture.pcap eth0

PCAP="$1"
IFACE="${2:-eth0}"
LOG="/tmp/fw_test_$(date +%Y%m%d_%H%M%S).log"

if [ -z "$PCAP" ]; then
    echo "用法: $0 <pcap文件> [接口]"
    exit 1
fi

if [ ! -f "$PCAP" ]; then
    echo "错误: 文件 $PCAP 不存在"
    exit 1
fi

echo "===== 防火墙测试 ====="
echo "PCAP: $PCAP"
echo "接口: $IFACE"
echo "日志: $LOG"
echo ""

# 1. 检查 pcap 文件
echo "--- PCAP 信息 ---"
sudo tcpdump -r "$PCAP" -q 2>/dev/null | wc -l
echo "包数: $(sudo tcpdump -r "$PCAP" -q 2>/dev/null | wc -l)"

# 2. 重放流量
echo ""
echo "--- 开始重放 ---"
sudo tcpreplay --stats=1000 -i "$IFACE" "$PCAP" 2>&1 | tee "$LOG"

# 3. 检查结果
echo ""
echo "--- 检查防火墙日志 ---"
sudo tail -20 /var/log/firewall.log 2>/dev/null
sudo journalctl -u firewalld --since "1 min ago" 2>/dev/null | tail -20

echo ""
echo "详细日志: $LOG"

性能统计与调试

bash 复制代码
# 显示详细统计
sudo tcpreplay -i eth0 --stats=500 capture.pcap

# 预加载到内存再发送(减少磁盘 I/O)
sudo tcpreplay -i eth0 --preload_pcap capture.pcap

# 跳过前 N 个包
sudo tcpreplay -i eth0 --skip=100 capture.pcap

# 只发送前 N 个包
sudo tcpreplay -i eth0 --stop-after=1000 capture.pcap

# 设置精确的包间延迟(纳秒)
sudo tcpreplay -i eth0 --topspeed capture.pcap

# 查看网络接口统计
echo "--- 发送前 ---"
cat /proc/net/dev | grep eth0
sudo tcpreplay -i eth0 -c 100 capture.pcap
echo "--- 发送后 ---"
cat /proc/net/dev | grep eth0

tcpreplay 工具套件

bash 复制代码
# tcpreplay 套件包含多个工具
which tcpreplay tcpbridge tcprewrite tcpprep tcpcapinfo

# tcpprep: 创建缓存文件(用于 tcprewrite 的连接追踪)
sudo tcpprep --auto=bridge --pcap=capture.pcap --cachefile=cache.cache

# tcpbridge: 在两个接口间桥接转发
sudo tcpbridge --intf1=eth0 --intf2=eth1

# tcpcapinfo: 查看 pcap 文件信息
tcpcapinfo capture.pcap

选项速查

选项 说明
-i IFACE 指定发送接口
--intf1/2 双网口模式的两个接口
--mbps=N 限制速率(Mbps)
--pps=N 限制速率(包/秒)
--loop=N 循环次数(0=无限)
--timer=gtod 使用 gettimeofday 计时
--cache=N 设置缓存大小(MB)
--stats=N 每 N 包输出统计
--topspeed 以最大速度发送
--preload_pcap 预加载到内存

tcpreplay 是网络测试领域的专业工具,主要用于测试网络设备在高流量下的表现。配合 tcprewrite 可以灵活修改数据包的地址信息,实现各种模拟场景。

相关推荐
niuTaylor3 分钟前
飞腾 FT-2000/4 Ubuntu 内存卡 / NVMe SSD 系统制作完整指南
linux·服务器·人工智能·驱动开发·单片机
傲世仙尊1 小时前
信号量环形队列与线程池起步-把临界资源拆成很多份
linux
Huangjin007_1 小时前
【Linux 系统篇(二十五)】文件(二) 系统文件I/O详解
linux·运维·服务器
微小冷2 小时前
Mermaid画甘特图
运维·markdown·甘特图·mermaid·时间图
ShineWinsu2 小时前
对于ProtoBuffer:ProtoBuffer的介绍以及安装
linux·网络·google·协议·序列化·反序列化·protobuffer
FlightYe2 小时前
视界原理之2D视频(二):视频文件里有什么
android·linux·网络·c++·ffmpeg·音视频·aac
LBL12203 小时前
内网容器部署FTP日志监控服务
运维·服务器·容器
志栋智能3 小时前
超自动化巡检:驱动持续改进的运维飞轮
运维·自动化
海宇大数据3 小时前
零信任架构实战:基于海宇学历核验版构建自动化风控审查网关
运维·人工智能·架构·自动化
NailiConveyor3 小时前
输送机系统与WMS仓储管理系统集成的5个关键技术点
大数据·运维·自动化·制造·业界资讯