Linux命令-tcpreplay(数据包重放工具)
-
- 快速参考
- 安装
- 基本重放
- 双网口模式(精确计时)
- [编辑和准备 pcap 文件](#编辑和准备 pcap 文件)
- 实战:防火墙规则测试
- 性能统计与调试
- [tcpreplay 工具套件](#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可以灵活修改数据包的地址信息,实现各种模拟场景。