tcpreplay 是干什么的
tcpreplay 把抓包文件里的报文重新从本机网卡发出去,可选按原始时序、按倍速或按指定带宽/包速率发送。它工作在二层,发送的是抓到的原始帧,因此 MAC、IP、端口都保持原样,除非先用配套工具改写。典型用途是把真实流量搬到测试环境复现故障、验证防火墙或 IDS 策略、给接收端做吞吐压测。
基本信息
| 适用平台 | Linux / BSD 等类 Unix,依赖 libpcap |
|---|---|
| 权限要求 | root 或具备 CAP_NET_RAW、CAP_NET_ADMIN 能力 |
| 基本语法 | tcpreplay -i <网卡> [速率与循环选项] 文件.pcap |
| 速率选项 | -x 倍速、--mbps 兆比特每秒、-p 包每秒、-t 尽快发送 |
| 常见配套 | tcprewrite 改写地址与端口,tcpreplay-edit 边改边放,tcpprep 预分流 |
| 安全前提 | 只在授权范围内重放,生产网需审批 |
典型使用场景
- 复现线上故障:把出问题时段的包重放到测试环境,让后端在相同报文序列下重现
- 验证策略:确认新增的防火墙、IPS 规则会按预期放行或阻断真实形态的流量
- 容量评估:把一段稳定态流量按数倍速重放,观察接收端的吞吐与连接数上限
- 回归测试:把历史请求样本当作固定输入,验证协议解析改动后行为没变化
- 协议开发:对手写采集的边界样本做定向重放,覆盖正常业务流量触及不到的分支
常用命令
常用命令
tcpreplay --listnics # 先看有哪些网卡可选
tcpreplay -i eth1 cap.pcap # 按文件原始时序重放
tcpreplay -i eth1 -x 2 -l 3 cap.pcap # 2 倍速,共放 3 轮
tcpreplay -i eth1 --mbps=100 cap.pcap # 限速 100 Mbps
tcpreplay -i eth1 -t cap.pcap # 尽快发送,用于压测
tcprewrite --infile=cap.pcap --outfile=new.pcap --srcipmap=10.0.0.0/8:192.168.1.0/24 # 改地址段输出与关键指标读法
| 指标 | 含义 | 异常表现 |
|---|---|---|
| actual | 实际发送速率与包数 | 明显低于设定值说明本机发不出去 |
| failed | 发送失败次数 | 非零要查网卡队列、驱动或权限 |
| truncated | 被截断的包数 | 抓包时 snaplen 太小导致,重放内容不完整 |
| skipped | 按过滤跳过的包数 | 与预期不符时核对过滤表达式 |
| bytes sent | 成功发出的字节数 | 与文件大小对照可判断是否有丢帧 |
在真实生产网重放真实流量可能触发告警、影响业务甚至造成业务侧重复交易,必须取得授权与时间窗约定;测试环境也要先确认目标网段与广播域,避免误打到无关设备。
统计重放效果时同时看发送侧 failed 字段和接收侧抓包量,只信一边容易漏掉网卡队列溢出导致的静默丢包。