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 可以灵活修改数据包的地址信息,实现各种模拟场景。

相关推荐
Titan20243 小时前
Linux网络基础知识
linux·服务器·网络·c++·学习
皮皮蟹虾饺3 小时前
NCCL 源码解析:通信器从出生到消亡的完整一生
linux·人工智能·ubuntu·语言模型·kubernetes
Java&Develop4 小时前
QuantDinger 宝塔 Linux 部署完整指南
linux·运维·状态模式
RisunJan4 小时前
Linux命令-tcpdump(网络数据包捕获)
linux·网络·tcpdump
头茬韭菜4 小时前
第 9 篇:「Fluss 运维实战」—— 部署、监控与故障排查
运维·fluss
Titan20244 小时前
Linux网络学习:套接字、UDP的封装与应用
linux·服务器·开发语言·网络·c++
.冰块.5 小时前
两套完整 Linux 建站实战:Wordpress 博客(LAMP)+ECShop 电商(LNMP)全套手册
linux·运维·项目实战·lnmp·lamp·电商平台·博客平台
杨云龙UP5 小时前
生产环境MySQL多实例XtraBackup全量备份与rsync异地自动传输实践
linux·运维·数据库·mysql·xtrabackup·主从复制·备份恢复
XR1234567885 小时前
医院有线无线一体化运维选型指南
运维
拂拉氏5 小时前
【知识讲解】 Linux中vim编辑器的学习与使用
linux·编辑器·vim