Tcpreplay 是一套以 [GPLv3] 许可发布的实用工具集,适用于 UNIX(以及在 [Cygwin] 下的 Windows),用于编辑和重放此前由 [tcpdump] 和 [Wireshark] 等工具捕获的网络流量。它会将流量分类为客户端或服务器,重写第 2/3/4 层头部,并通过交换机、路由器、防火墙、NIDS 和 IPS 将其重放回网络——速率可从涓涓细流直至全线路速率。Tcpreplay 支持单网卡和双网卡模式,可用于测试嗅探设备和在线(in-line)设备。
Tcpreplay 被众多防火墙、IDS、IPS、NetFlow 及其他网络厂商、企业、大学、实验室和开源项目所使用。如果您的组织使用 Tcpreplay,请告知我们您是谁以及将其用于何种用途,以便我们持续优先开发真正重要的功能。
自 4.0 起,Tcpreplay 还专门面向 [IP Flow][flow]/[NetFlow] 设备测试:精确的高速重放时序与结果报告、每秒流数(fps)统计,以及用于调优流产品超时设置的流过期分析——根据 pcap 文件中的流大小,最高可达每秒数十万条流。
📖 完整文档位于 https://tcpreplay.appneta.com —— 包括入门指南、每个工具一页的说明、操作配方、套件背后的概念、手册页以及常见问题解答。本 README 是快速导览;该网站才是参考手册。
tcpreplay-edit)或随机化 IP 地址(tcpreplay)tcpreplay 通常停留在第 2 层)完整的发布历史请参阅 CHANGELOG。
下载最新的发布 tarball (也在 SourceForge 上提供镜像), 然后:
tar xf tcpreplay-*.tar.xz && cd tcpreplay-*
./configure && make && sudo make install
发布压缩包中已附带预生成的 CLI 解析器和手册页,因此除 C 编译器和 libpcap 外无需其他依赖——仅当你从 git 检出构建,或需要 CMake、netmap、AF_XDP 或 io_uring 支持时,才需参考下方的从源码构建。
更详细的平台特定说明见压缩包中附带的 INSTALL 文件(内容与这里的 docs/INSTALL 相同)。
从 git 检出构建需要 python3 和 asciidoctor(任一构建系统均可),以便从 *_opts.def 文件生成 CLI 选项解析器和手册页——这在 4.6 中取代了 GNU AutoGen 用于此目的(AutoGen 已停止维护;而这些工具并未停止维护)。AutoGen 本身仅仍用于一个内部头文件(src/tcpedit/tcpedit_stub.h)——参见 scripts/autoopts/README.md。构建发布压缩包时无需任何上述内容,因为其中已附带这些生成好的文件。
./autogen.sh # only needed once, from a git checkout
./configure
make
sudo make install
自 4.6 起,该套件也可以使用 CMake(3.16+)构建——这是编译 Tcpreplay 的推荐且首选方式。 Autotools 仍然提供并用于发布 tarball,但最终将被弃用,因此新的脚本/打包应以 CMake 为目标。
cmake -B build
cmake --build build
sudo cmake --install build
每个 ./configure 标志都有对应的 CMake 等效项——请参阅 CMakeLists.txt 顶部的表格。以下是几个示例:
# debug build with support for the -d option
cmake -B build -DENABLE_DEBUG=ON
# AddressSanitizer or ThreadSanitizer build
cmake -B build -DENABLE_ASAN=ON
cmake -B build -DENABLE_TSAN=ON
# custom libpcap install, static linking, custom tcpdump path
cmake -B build -DWITH_LIBPCAP=/usr/local/opt/libpcap \
-DENABLE_STATIC_LINK=ON -DWITH_TCPDUMP=/usr/sbin/tcpdump
# force a specific packet injection method
cmake -B build -DFORCE_INJECT_PCAP_SENDPACKET=ON
# several configurations side by side
cmake -B build-debug -DENABLE_DEBUG=ON
cmake -B build-release
cmake --build build --target manpages 会重新生成 man 手册页
(需要 python3 + asciidoctor);直接运行 cmake --build build 不会改动它们。
使用 CMake Tools 扩展的 VS Code 用户只需打开仓库文件夹,并在提示时选择一个配置预设即可。
如果默认的套接字路径速度不够快,Tcpreplay 有三种开销更低的方式将数据包直接推送到网卡。大致按以下顺序尝试——io_uring 需要的配置最少,netmap 需要的配置最多:
liburing-dev——无需打补丁的驱动)在安装了 liburing-dev 且内核支持
io_uring 的 Linux 系统上会被检测到。
数据包仍然通过常规的 PF_PACKET 原始套接字发出,但发送操作通过 io_uring 队列异步提交,从而减少每个数据包的系统调用开销。
sudo apt-get install liburing-dev
cmake -B build && cmake --build build && sudo cmake --install build
sudo tcpreplay -i eth0 --io-uring test.pcap
libxdp-dev/libbpf-dev 以及支持 eBPF 的驱动)在安装了 libxdp-dev 和 libbpf-dev 的 Linux 系统上检测到。当
选中(--xdp)时,内核网络栈被绕过,数据包
直接通过支持 eBPF 的驱动发送——在普通
网卡上达到全线速,可与商业流量生成器相媲美,且无需修改
驱动。
sudo apt-get install libxdp-dev libbpf-dev
cmake -B build && cmake --build build && sudo cmake --install build
sudo tcpreplay -i eth0 --xdp test.pcap
[netmap] 在重放期间绕过网络驱动,直接写入网卡的 TX 缓冲区。这是三种方案中侵入性最强的一种——该接口处于活动状态时,其上的网络栈会完全失效,所以不要在你通过 SSH 登录所用的接口上进行测试——但在受支持的硬件上具有最高的吞吐量上限。
从[项目页面][netmap]下载并安装 netmap。如果你将其解压到 /usr/src 或 /usr/local/src,它会被自动识别;否则请在构建时指定其路径:
cmake -B build -DWITH_NETMAP=/home/fklassen/git/netmap
cmake --build build
sudo cmake --install build
在 Linux 上,tcpreplay 可以直接重放到仅支持第三层的接口,例如 WireGuard 和 tun 设备——无需构建选项或命令行标志。输入文件中的任何 第二层头部(包括 VLAN 标签的以太网、Linux SLL、 回环等)都会被自动剥离,数据包以裸 IPv4/IPv6 形式发送,并带有正确的协议,这正是 WireGuard 等驱动所要求的:
sudo tcpreplay -i wg0 test.pcap
请注意,非 IP 数据包(例如 ARP)无法在这些接口上发送,并会被报告为失败,而且这些接口不支持 --io-uring。
自 4.6 起,该套件会安装 libtcpreplay,这是一个静态库,通过 tcpreplay_api.h 暴露与 tcpreplay 二进制文件所使用的相同的重放引擎。
应用程序可以通过编程方式重放 pcap 文件并读取实时统计信息,而无需 fork 该二进制文件并抓取其输出:
cc myapp.c $(pkg-config --cflags --libs --static libtcpreplay) -o myapp
头文件安装到 include/tcpreplay/ 下;两套构建系统都会安装该库及其 libtcpreplay.pc。完整示例程序见 examples/。