
Редактирование и воспроизведение перехваченного сетевого трафика на произвольных скоростях — набор инструментов для работы с pcap для *NIX и Windows.
<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 (и Windows под
[Cygwin]) для редактирования и воспроизведения сетевого трафика, ранее
захваченного такими инструментами, как [tcpdump] и [Wireshark]. Он классифицирует
трафик как клиентский или серверный, перезаписывает заголовки уровней 2/3/4 и
воспроизводит его обратно в сеть через коммутаторы, маршрутизаторы, межсетевые
экраны, NIDS и IPS — со скоростью от минимальной вплоть до полной пропускной
способности канала. Tcpreplay поддерживает как режим с одним, так и с двумя
сетевыми интерфейсами (NIC), что позволяет тестировать как устройства
прослушивания, так и встроенные (in-line) устройства.
Tcpreplay используется множеством производителей межсетевых экранов, IDS, IPS,
NetFlow и других сетевых решений, предприятиями, университетами, лабораториями и
проектами с открытым исходным кодом. Если ваша организация использует Tcpreplay,
пожалуйста, сообщите нам, кто вы и для чего используете его, чтобы мы могли
продолжать уделять приоритетное внимание важным функциям.
Начиная с версии 4.0, Tcpreplay также специально ориентирован на тестирование
устройств [IP Flow][flow]/[NetFlow]: точная синхронизация воспроизведения на
высоких скоростях и отчётность о результатах, статистика потоков в секунду (fps)
и анализ истечения потоков для настройки параметров тайм-аута продуктов,
работающих с потоками — вплоть до сотен тысяч потоков в секунду, в зависимости
от размеров потоков в pcap-файле.
📖 **Полная документация доступна по адресу <https://tcpreplay.appneta.com>** —
руководство по началу работы, отдельная страница для каждого инструмента,
практические рецепты, концепции, лежащие в основе набора, страницы руководства
(man pages) и FAQ. Этот 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)
- [Библиотека C libtcpreplay](#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** — перезаписывает заголовки пакетов TCP/IP и уровня 2 в
pcap-файле
* **tcpbridge** — объединяет два сегмента сети, используя логику перезаписи
tcprewrite
* **tcpcapinfo** — декодер и отладчик необработанных pcap-файлов
Что нового в 4.6
==================
* [CMake](#cmake-recommended) теперь является основной, рекомендуемой системой сборки
(autotools по-прежнему используется для релизных tarball-архивов)
* Быстрая инъекция пакетов через [io_uring](#performance-netmap-af_xdp-io_uring) и
[AF_XDP](#performance-netmap-af_xdp-io_uring)
наряду с существующей поддержкой netmap — обе требуют меньше настройки, чем netmap,
и не нуждаются в пропатченных драйверах
* [libtcpreplay](#libtcpreplay-c-library), статическая библиотека на C для встраивания
движка воспроизведения непосредственно в вашу программу
* Автоматическая поддержка [воспроизведения на raw 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 и man-страницы, поэтому для сборки не требуется ничего, кроме компилятора C и libpcap — см. раздел [Сборка из исходников](#building-from-source) ниже, только если вы работаете с git-репозиторием или хотите включить поддержку CMake, netmap, AF_XDP или io_uring.
Более подробные инструкции для конкретных платформ приведены в файле `INSTALL`, включённом в архив (то же содержимое, что и в [`docs/INSTALL`](https://github.com/appneta/tcpreplay/blob/master/docs/INSTALL) здесь).
Сборка из исходников
=====================
Сборка из git-репозитория требует `python3` и `asciidoctor` (для любой из систем сборки) для генерации парсеров опций CLI и man-страниц из файлов `*_opts.def` — это заменило GNU AutoGen для данной цели в версии 4.6 (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 по-прежнему предоставляется и используется для релизных архивов, но
со временем будет выведен из эксплуатации, поэтому новые скрипты/пакеты должны ориентироваться на 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` перегенерирует страницы руководства
(python3 + asciidoctor); обычная команда `cmake --build build` их никогда не трогает.
Пользователи VS Code с расширением CMake Tools могут просто открыть папку
репозитория и выбрать пресет конфигурации, когда появится запрос.
Производительность: netmap, AF_XDP, io_uring
--------------------------------------
Если стандартный путь через сокет недостаточно быстр, у Tcpreplay есть три
способа отправки пакетов напрямую в сетевой адаптер с меньшими накладными расходами. Пробуйте их примерно в
таком порядке — io_uring требует наименьшей настройки, netmap — наибольшей:
<details>
<summary><b>io_uring</b> (Linux, требуется <code>liburing-dev</code> — патченный драйвер не нужен)</summary>
Определяется в системах Linux с установленным `liburing-dev` и ядром с
поддержкой [io_uring](https://man7.org/linux/man-pages/man7/io_uring.7.html).
Пакеты по-прежнему отправляются через обычный raw-сокет 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>
Обнаруживается в системах Linux с установленными `libxdp-dev` и `libbpf-dev`. При
выборе (`--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-буферы NIC. Это самый инвазивный из
трёх вариантов — сетевой стек отключается на этом интерфейсе, пока он
активен, поэтому **не тестируйте на интерфейсе, через который вы подключились по SSH** — но у него
самый высокий потолок пропускной способности на поддерживаемом оборудовании.
Скачайте и установите netmap со [страницы проекта][netmap]. Если вы
распаковали его в `/usr/src` или `/usr/local/src`, он будет обнаружен
автоматически; в противном случае укажите сборке путь к нему:
```
cmake -B build -DWITH_NETMAP=/home/fklassen/git/netmap
cmake --build build
sudo cmake --install build
```
Воспроизведение на интерфейсах с «сырым» IP (L3)
--------------------------------------
В Linux tcpreplay может воспроизводить трафик напрямую на интерфейсах, работающих только на уровне 3, таких как
устройства WireGuard и tun — без необходимости в опциях сборки или флагах командной строки. Любой
заголовок уровня 2 во входном файле (Ethernet, включая теги VLAN, Linux SLL,
loopback, ...) автоматически удаляется, и пакеты отправляются как «голые»
IPv4/IPv6 с правильным протоколом, что требуется таким драйверам, как WireGuard:
```
sudo tcpreplay -i wg0 test.pcap
```
Обратите внимание, что не-IP пакеты (например, ARP) не могут быть отправлены через эти интерфейсы и
сообщаются как неудавшиеся, а `--io-uring` на них не поддерживается.
Библиотека libtcpreplay
-----------------------
Начиная с версии 4.6, в состав пакета устанавливается **libtcpreplay** — статическая библиотека, предоставляющая
тот же движок воспроизведения, который использует бинарный файл `tcpreplay`, через `tcpreplay_api.h`.
Приложения могут воспроизводить pcap-файлы и читать статистику в реальном времени
программно, вместо того чтобы запускать бинарный файл как отдельный процесс и парсить его вывод:
```
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 (raw-сокеты/инъекция пакетов) и отправляется живой трафик на
настроенные тестовые сетевые интерфейсы — не запускайте его на интерфейсе, через который
вы подключены. `make test` работает только с autotools; см. [`docs/INSTALL`](https://github.com/appneta/tcpreplay/blob/master/docs/INSTALL)
для настройки тестовых сетевых интерфейсов с помощью `--with-testnic`/`--with-testnic2`.
Получение помощи
================
Думаете, что нашли ошибку, или есть вопрос? Сначала поищите в
[существующих issues](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
[mailing list](https://lists.sourceforge.net/lists/listinfo/tcpreplay-users),
и, пожалуйста, не пишите сопровождающим напрямую, чтобы другие тоже могли получить пользу
от вашего вопроса (и помочь с ответом).
Участие в разработке
====================
1. [Сделайте форк][Fork] репозитория и [настройте git][git], если ещё не сделали этого
2. Создайте ветку для вашей функции или исправления ошибки
3. Внесите изменения — см. [`docs/HACKING`](https://github.com/appneta/tcpreplay/blob/master/docs/HACKING) для стандартов
кодирования и того, что подразумевает ваш вклад с точки зрения лицензии
4. Отправьте изменения в свой форк и [создайте pull request][pr] в `master`
Мы рассмотрим и обсудим его с вами на GitHub; после принятия он применяется
напрямую к `master`. См. также
[руководства для разработчиков](https://tcpreplay.appneta.com/developers/) для
материалов архитектурного уровня — написание DLT-плагина, встраивание
libtcpreplay/libtcpedit и проектирование плагинов.
Лицензия
========
Tcpreplay распространяется под лицензией [GPLv3] и включает программное обеспечение, разработанное
Калифорнийским университетом в Беркли, Лабораторией Лоуренса в Беркли и её
участниками. Полный текст см. в [`LICENSE`](https://github.com/appneta/tcpreplay/blob/master/LICENSE).
Это относится к файлам, написанным для проекта; некоторые файлы, распространяемые с
Tcpreplay Suite, защищены авторским правом других авторов и имеют другую
лицензию, что отмечено в самих файлах. Вопросы о лицензировании, применимом
к конкретному файлу или модулю, можно задать в
[списке рассылки tcpreplay-users](https://sourceforge.net/p/tcpreplay/mailman/tcpreplay-users/).
Авторы
======
Tcpreplay был создан Аароном Тёрнером. Фред Классен ([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