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

相关推荐
青禾8376 小时前
Linux 操作系统入门指南:从目录结构到常用命令
linux·运维·服务器
zhengqweasd6 小时前
流量没跑满、带宽空闲,业务依然卡顿
运维·服务器·网络
闖647 小时前
入门Linux操作系统|零基础吃透原理、目录、权限、常用命令
linux
bruk_spp7 小时前
linux pinctrl
linux
Y3815326628 小时前
Docker Compose 服务依赖与健康检查:healthcheck 让容器按正确顺序启动
运维·docker·容器
稳联技术老娜8 小时前
伺服内嵌EtherNet IP方案:嵌入式小板SPI通讯固件Demo程序适配改造
运维·服务器·网络
en.en..9 小时前
Linux系统编程:fcntl 与 ioctl
linux·运维·服务器
自动化监测Learner9 小时前
Navicat Premium 17 中文版安装教程(2026最新版)
java·linux·数据库
荣合技术服务10 小时前
Codex 实战:用 AI 写运维脚本
运维·codex
李昊哲小课10 小时前
Deepin 25 上安装 Docker CE 实战记录
运维·docker·容器·deepin