<p align="center">
<img src="https://raw.githubusercontent.com/appneta/tcpreplay/master/docs/guide/assets/images/logo.svg" alt="" width="96" height="96">
</p>
<h1 align="center">Tcpreplay</h1>
[](https://github.com/appneta/tcpreplay/actions/workflows/github-actions-ci.yml)
[](https://scan.coverity.com/projects/12017)
[](https://github.com/appneta/tcpreplay/actions/workflows/codeql.yml)
[](https://github.com/appneta/tcpreplay/actions/workflows/c-linter.yml)
[](https://tcpreplay.appneta.com)
[](https://github.com/appneta/tcpreplay/releases)
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 是快速导览;该网站才是参考手册。
- [套件](#the-suite)
- [4.6 版新特性](#whats-new-in-46)
- [安装发行版](#installing-a-release)
- [从源码构建](#building-from-source)
- [Autotools](#autotools)
- [CMake](#cmake-recommended)
- [性能:netmap、AF\_XDP、io\_uring](#performance-netmap-af_xdp-io_uring)
- [重放到原始 IP(L3)接口](#replaying-onto-raw-ip-l3-interfaces)
- [libtcpreplay C 库](#libtcpreplay-c-library)
- [运行测试套件](#running-the-test-suite)
- [获取帮助](#getting-help)
- [贡献](#contributing)
- [许可证](#license)
- [作者](#authors)
套件
=========
网络重放:
--------------------------
* **tcpreplay** / **tcpreplay-edit** —— 以任意速度将 pcap 文件重放到网络上,可选择在重放过程中即时编辑数据包(`tcpreplay-edit`)或随机化 IP 地址(`tcpreplay`)
* **tcpliveplay** —— 在实时网络上重放捕获的 TCP 会话,使远程服务器真正做出响应(由 Yazan Siam 贡献,[Cisco] 赞助,用于测试直至应用层的完整网络栈——普通的 `tcpreplay` 通常停留在第 2 层)
Pcap 文件编辑器与实用工具:
--------------------------------
* **tcpprep** —— 多遍 pcap 预处理器,将数据包分类为客户端或服务器,并写出供 tcpreplay/tcprewrite 使用的缓存文件
* **tcprewrite** —— 重写 pcap 文件中的 TCP/IP 和第 2 层数据包头部
* **tcpbridge** —— 使用 tcprewrite 的重写逻辑桥接两个网段
* **tcpcapinfo** —— 原始 pcap 文件解码器与调试器
4.6 版本的新特性
==================
* [CMake](#cmake-recommended) 现在是主要且推荐的构建系统
(发布 tarball 仍使用 autotools)
* [io_uring](#performance-netmap-af_xdp-io_uring) 和
[AF_XDP](#performance-netmap-af_xdp-io_uring) 快速路径数据包注入,
与现有的 netmap 支持并存——两者所需的配置都比 netmap 更少,
且无需打补丁的驱动
* [libtcpreplay](#libtcpreplay-c-library),一个静态 C 库,可将
重放引擎直接嵌入到你自己的程序中
* 自动支持[重放到原始 IP (L3) 接口](#replaying-onto-raw-ip-l3-interfaces),
如 WireGuard 和 tun 设备
完整的发布历史请参阅 [CHANGELOG](https://github.com/appneta/tcpreplay/blob/master/docs/CHANGELOG)。
安装发布版本
=====================
[](https://github.com/appneta/tcpreplay/releases)
[](https://sourceforge.net/projects/tcpreplay)
下载最新的[发布 tarball](https://github.com/appneta/tcpreplay/releases/latest)
(也在 [SourceForge](https://sourceforge.net/projects/tcpreplay) 上提供镜像),
然后:
```
tar xf tcpreplay-*.tar.xz && cd tcpreplay-*
./configure && make && sudo make install
```
发布压缩包中已附带预生成的 CLI 解析器和手册页,因此除 C 编译器和 libpcap 外无需其他依赖——仅当你从 git 检出构建,或需要 CMake、netmap、AF_XDP 或 io_uring 支持时,才需参考下方的[从源码构建](#building-from-source)。
更详细的平台特定说明见压缩包中附带的 `INSTALL` 文件(内容与这里的 [`docs/INSTALL`](https://github.com/appneta/tcpreplay/blob/master/docs/INSTALL) 相同)。
从源码构建
=====================
从 git 检出构建需要 `python3` 和 `asciidoctor`(任一构建系统均可),以便从 `*_opts.def` 文件生成 CLI 选项解析器和手册页——这在 4.6 中取代了 GNU AutoGen 用于此目的(AutoGen 已停止维护;而这些工具并未停止维护)。AutoGen 本身仅仍用于一个内部头文件(`src/tcpedit/tcpedit_stub.h`)——参见 [`scripts/autoopts/README.md`](https://github.com/appneta/tcpreplay/blob/master/scripts/autoopts/README.md)。构建发布压缩包时无需任何上述内容,因为其中已附带这些生成好的文件。
Autotools
---------
```
./autogen.sh # only needed once, from a git checkout
./configure
make
sudo make install
```
CMake(推荐)
--------------------
自 4.6 起,该套件也可以使用 [CMake](https://cmake.org)(3.16+)构建——**这是编译 Tcpreplay 的推荐且首选方式**。
Autotools 仍然提供并用于发布 tarball,但最终将被弃用,因此新的脚本/打包应以 CMake 为目标。
```
cmake -B build
cmake --build build
sudo cmake --install build
```
每个 `./configure` 标志都有对应的 CMake 等效项——请参阅 [`CMakeLists.txt`](https://github.com/appneta/tcpreplay/blob/master/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 用户只需打开仓库文件夹,并在提示时选择一个配置预设即可。
性能:netmap、AF_XDP、io_uring
--------------------------------------
如果默认的套接字路径速度不够快,Tcpreplay 有三种开销更低的方式将数据包直接推送到网卡。大致按以下顺序尝试——io_uring 需要的配置最少,netmap 需要的配置最多:
<details>
<summary><b>io_uring</b>(Linux,需要 <code>liburing-dev</code>——无需打补丁的驱动)</summary>
在安装了 `liburing-dev` 且内核支持
[io_uring](https://man7.org/linux/man-pages/man7/io_uring.7.html) 的 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
```
</details>
<details>
<summary><b>AF_XDP</b>(Linux,需要 <code>libxdp-dev</code>/<code>libbpf-dev</code> 以及支持 eBPF 的驱动)</summary>
在安装了 `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
```
</details>
<details>
<summary><b>netmap</b>(Linux/BSD,需要打过 netmap 补丁的网络驱动——侵入性最强,上限最高)</summary>
[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
```
</details>
重放到原始 IP(L3)接口
--------------------------------------
在 Linux 上,tcpreplay 可以直接重放到仅支持第三层的接口,例如
WireGuard 和 tun 设备——无需构建选项或命令行标志。输入文件中的任何
第二层头部(包括 VLAN 标签的以太网、Linux SLL、
回环等)都会被自动剥离,数据包以裸
IPv4/IPv6 形式发送,并带有正确的协议,这正是 WireGuard 等驱动所要求的:
```
sudo tcpreplay -i wg0 test.pcap
```
请注意,非 IP 数据包(例如 ARP)无法在这些接口上发送,并会被报告为失败,而且这些接口不支持 `--io-uring`。
libtcpreplay C 库
-----------------------
自 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/`](https://github.com/appneta/tcpreplay/blob/master/examples)。
运行测试套件
------------------------
```
cd test
sudo make test
```
需要 root 权限(原始套接字/数据包注入),并会在配置的测试网卡上发送实时流量——不要针对你正在使用的接口运行它。`make test` 仅支持 autotools;有关使用 `--with-testnic`/`--with-testnic2` 配置测试网卡的信息,请参阅 [`docs/INSTALL`](https://github.com/appneta/tcpreplay/blob/master/docs/INSTALL)。
获取帮助
============
认为你发现了 bug,或者有疑问?请先搜索
[现有 issue](https://github.com/appneta/tcpreplay/issues),如果尚未涵盖,
再[新建一个](https://github.com/appneta/tcpreplay/issues/new)。请包含:
* Tcpreplay 版本(`-V`/`--version`)和平台
* 如果是构建问题:`configure`/`cmake` 和 `make` 的输出
* 如果是运行时问题:确切的命令行,以及你尝试做什么的描述(或
附上 pcap)
* 其他任何看起来相关的内容——细节越多,我们能越快提供帮助
发现了特定的安全漏洞?请遵循
[`SECURITY.md`](https://github.com/appneta/tcpreplay/blob/master/SECURITY.md),而不是提交公开 issue。
我们也鼓励你先查看
[文档站点](https://tcpreplay.appneta.com)——包括
[指南](https://tcpreplay.appneta.com/guides/)、
[FAQ](https://tcpreplay.appneta.com/faq/) 和
[man 手册](https://tcpreplay.appneta.com/reference/man-pages/)——然后再发帖到
tcpreplay-users
[邮件列表](https://lists.sourceforge.net/lists/listinfo/tcpreplay-users),
并且请不要直接给维护者发邮件,这样其他人也能从你的问题中受益
(并帮助解答)。
贡献
============
1. [Fork] 仓库,如果尚未设置,请[设置 git][git]
2. 为你的功能或 bug 修复创建一个分支
3. 进行修改——有关编码
标准以及贡献代码在许可证方面的含义,请参阅 [`docs/HACKING`](https://github.com/appneta/tcpreplay/blob/master/docs/HACKING)
4. 推送到你的 fork,并针对 `master` [发送 pull request][pr]
我们会在 GitHub 上与你一起审查和讨论;一旦被接受,它会被直接应用到
`master`。另请参阅
[开发者指南](https://tcpreplay.appneta.com/developers/),了解架构层面的材料——编写 DLT 插件、嵌入
libtcpreplay/libtcpedit,以及插件设计。
许可证
=======
Tcpreplay 采用 [GPLv3] 许可,并包含由
加利福尼亚大学伯克利分校、劳伦斯伯克利实验室及其
贡献者开发的软件。完整文本请参阅 [`LICENSE`](https://github.com/appneta/tcpreplay/blob/master/LICENSE)。
这涵盖为该项目编写的文件;随
Tcpreplay 套件分发的某些文件由其他作者拥有版权,并带有不同的
许可证,并在文件内作了相应标记。有关适用于特定文件或模块的
许可证问题,可以发送到
[tcpreplay-users 邮件列表](https://sourceforge.net/p/tcpreplay/mailman/tcpreplay-users/)。
作者
=======
Tcpreplay 由 Aaron Turner 创建。Fred Klassen([AppNeta by Broadcom][AppNeta])
于 2013 年接手维护,从 4.0 版本开始,添加了上文所述的
性能和流量测试功能。
[GPLv3]: http://www.gnu.org/licenses/gpl-3.0.html
[netmap]: https://github.com/luigirizzo/netmap
[flow]: https://en.wikipedia.org/wiki/Traffic_flow_(computer_networking)
[NetFlow]: http://www.cisco.com/go/netflow
[Cygwin]: http://www.cygwin.com/
[Wireshark]: https://www.wireshark.org
[tcpdump]: http://www.tcpdump.org
[Cisco]: http://www.cisco.com
[AppNeta]: https://www.broadcom.com/products/software/network-management/appneta
[git]: https://help.github.com/articles/set-up-git
[Fork]: https://help.github.com/articles/fork-a-repo
[pr]: https://help.github.com/articles/using-pull-requests