
キャプチャしたネットワークトラフィックを任意の速度で編集・再生 — *NIX および Windows 向けの pcap ツールスイート。
<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 は、[tcpdump] や [Wireshark] などのツールで事前にキャプチャしたネットワークトラフィックを編集および再生するための、UNIX(および [Cygwin] 上の Windows)向けの [GPLv3] ライセンスユーティリティ群です。トラフィックをクライアントまたはサーバーとして分類し、レイヤー2/3/4 ヘッダーを書き換え、スイッチ、ルーター、ファイアウォール、NIDS、IPS を経由してネットワーク上に再生します。その速度はごく少量のトラフィックからワイヤーレートまで対応します。Tcpreplay はシングル NIC モードとデュアル NIC モードの両方をサポートしており、スニッフィングデバイスとインラインデバイスの両方をテストできます。
Tcpreplay は、多数のファイアウォール、IDS、IPS、NetFlow などのネットワークベンダー、企業、大学、研究所、オープンソースプロジェクトで使用されています。あなたの組織で Tcpreplay を使用している場合は、組織名と用途をお知らせください。重要な機能の優先順位付けを続けることができます。
バージョン 4.0 以降、Tcpreplay は [IP Flow][flow]/[NetFlow] アプライアンスのテストにも特化しています。正確な高速再生タイミングと結果レポート、Flows Per Second (fps) 統計、フロー製品のタイムアウト設定をチューニングするためのフロー期限切れ分析を提供し、pcap ファイル内のフローサイズに応じて毎秒数十万フローまで対応します。
📖 **完全なドキュメントは <https://tcpreplay.appneta.com> にあります** — はじめにガイド、各ツールのページ、ハウツーレシピ、スイートの背景にある概念、man ページ、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)
- [raw IP (L3) インターフェースへの再生](#replaying-onto-raw-ip-l3-interfaces)
- [libtcpreplay C ライブラリ](#libtcpreplay-c-library)
- [テストスイートの実行](#running-the-test-suite)
- [ヘルプの入手](#getting-help)
- [コントリビューション](#contributing)
- [ライセンス](#license)
- [作者](#authors)
The Suite
=========
ネットワーク再生:
--------------------------
* **tcpreplay** / **tcpreplay-edit** — pcap ファイルを任意の速度でネットワーク上に再生します。オプションでパケットをオンザフライで編集したり(`tcpreplay-edit`)、IP アドレスをランダム化したりできます(`tcpreplay`)
* **tcpliveplay** — キャプチャした TCP セッションを、リモートサーバーが実際に応答する形でライブネットワーク上に再生します(Yazan Siam 氏によるコントリビューション、[Cisco] のスポンサー。アプリケーションまでのネットワークスタック全体をテストするためのもので、通常の `tcpreplay` はレイヤー2 にとどまります)
Pcap ファイルエディターとユーティリティ:
--------------------------------
* **tcpprep** — パケットをクライアントまたはサーバーとして分類し、tcpreplay/tcprewrite が使用するキャッシュファイルを書き出すマルチパス pcap プリプロセッサ
* **tcprewrite** — pcap ファイル内の TCP/IP およびレイヤー2 パケットヘッダーを書き換えます
* **tcpbridge** — tcprewrite の書き換えロジックを使用して 2 つのネットワークセグメントをブリッジします
* **tcpcapinfo** — raw 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 ライブラリ
* WireGuard や tun デバイスのような
[raw IP (L3) インターフェースへのリプレイ](#replaying-onto-raw-ip-l3-interfaces)を自動サポート
完全なリリース履歴は [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
```
リリース tarball には生成済みの CLI パーサーと man ページが同梱されているため、C コンパイラと libpcap 以外は不要です。git チェックアウトから作業する場合や、CMake、netmap、AF_XDP、io_uring のサポートが必要な場合に限り、後述の[ソースからのビルド](#building-from-source)を参照してください。
プラットフォーム固有のより詳細な手順は、tarball に含まれる `INSTALL` ファイルに記載されています(ここの [`docs/INSTALL`](https://github.com/appneta/tcpreplay/blob/master/docs/INSTALL) と同じ内容です)。
ソースからのビルド
=====================
git チェックアウトからのビルドでは、`*_opts.def` ファイルから CLI オプションのパーサーと man ページを生成するために `python3` と `asciidoctor`(いずれかのビルドシステム)が必要です。これは 4.6 でこの目的のために GNU AutoGen に取って代わりました(AutoGen は EOL ですが、これらは違います)。AutoGen 自体は、1 つの内部ヘッダー(`src/tcpedit/tcpedit_stub.h`)のためにのみ依然として必要です — [`scripts/autoopts/README.md`](https://github.com/appneta/tcpreplay/blob/master/scripts/autoopts/README.md) を参照してください。リリース tarball をビルドする場合は、これらはすでに生成済みで同梱されているため、いずれも不要です。
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` では man ページには一切触れません。
CMake Tools 拡張機能を使っている VS Code ユーザーは、リポジトリのフォルダを開いて
プロンプトが表示されたら configure preset を選択するだけで済みます。
パフォーマンス: netmap、AF_XDP、io_uring
--------------------------------------
デフォルトのソケットパスで速度が足りない場合、Tcpreplay にはパケットを
NIC に直接送り込むためのオーバーヘッドの低い方法が 3 つあります。おおよそ
次の順序で試してください — 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 raw ソケットを通じて送信されますが、送信は
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] はリプレイ中、ネットワークドライバをバイパスし、
NIC の TX バッファに直接書き込みます。これは 3 つの選択肢の中で最も侵襲的です
— 有効な間はそのインターフェース上のネットワークスタックが停止するため、
**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 デバイスのようなレイヤー3専用のインターフェースに直接リプレイできます — ビルドオプションやコマンドラインフラグは不要です。入力ファイル内のレイヤー2ヘッダー (VLAN タグを含む Ethernet、Linux SLL、ループバックなど) は自動的に除去され、パケットは正しいプロトコルを持つベアの IPv4/IPv6 として送信されます。これは WireGuard のようなドライバーが要求する形式です:
```
sudo tcpreplay -i wg0 test.pcap
```
IP以外のパケット(例: ARP)はこれらのインターフェース上で送信できず、失敗として報告される点、およびこれらでは `--io-uring` がサポートされていない点に注意してください。
libtcpreplay C ライブラリ
-----------------------
バージョン 4.6 以降、このスイートは **libtcpreplay** をインストールします。これは `tcpreplay` バイナリが `tcpreplay_api.h` 経由で使用するのと同じリプレイエンジンを公開する静的ライブラリです。アプリケーションは、バイナリを fork してその出力をスクレイピングする代わりに、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ソケット/パケットインジェクション)が必要で、設定されたテスト用NIC上に実際のトラフィックを送信します。接続に使用しているインターフェースに対して実行しないでください。`make test` はautotools専用です。`--with-testnic`/`--with-testnic2` でテスト用NICを設定する方法については [`docs/INSTALL`](https://github.com/appneta/tcpreplay/blob/master/docs/INSTALL) を参照してください。
ヘルプの入手
============
バグを見つけたと思われる場合や質問がある場合は、まず
[既存のissue](https://github.com/appneta/tcpreplay/issues)を検索し、まだ
取り上げられていない場合は[新しいissueを開いて](https://github.com/appneta/tcpreplay/issues/new)ください。以下を含めてください:
* Tcpreplayのバージョン(`-V`/`--version`)とプラットフォーム
* ビルドの問題の場合: `configure`/`cmake` と `make` の出力
* 実行時の問題の場合: 正確なコマンドライン、および何をしようとしていたかの説明(または
添付のpcap)
* その他関連しそうなこと — 詳細が多いほど、より早く対応できます
特にセキュリティ脆弱性を見つけた場合は、公開issueを立てる代わりに
[`SECURITY.md`](https://github.com/appneta/tcpreplay/blob/master/SECURITY.md) に従ってください。
また、tcpreplay-users
[メーリングリスト](https://lists.sourceforge.net/lists/listinfo/tcpreplay-users)に
投稿する前に、[ドキュメントサイト](https://tcpreplay.appneta.com) —
[ガイド](https://tcpreplay.appneta.com/guides/)、
[FAQ](https://tcpreplay.appneta.com/faq/)、
[manページ](https://tcpreplay.appneta.com/reference/man-pages/) — を
確認することをお勧めします。また、他の人もあなたの質問から恩恵を受けられる(そして回答を手伝える)よう、
メンテナーに直接メールを送らないでください。
コントリビューション
============
1. まだの場合はリポジトリを[フォーク][Fork]し、[gitをセットアップ][git]してください
2. 機能またはバグ修正用のブランチを作成してください
3. 変更を加えてください — コーディング標準と、コードをコントリビュートすることがライセンス上何を意味するかについては
[`docs/HACKING`](https://github.com/appneta/tcpreplay/blob/master/docs/HACKING) を参照してください
4. フォークにプッシュし、`master` に対して[プルリクエストを送信][pr]してください
GitHub上でレビューと議論を行います。承認されると、`master` に直接適用されます。
アーキテクチャレベルの資料 — DLTプラグインの作成、
libtcpreplay/libtcpeditの組み込み、プラグイン設計 — については
[開発者ガイド](https://tcpreplay.appneta.com/developers/)も参照してください。
ライセンス
=======
Tcpreplayは[GPLv3]の下でライセンスされており、University of California, Berkeley、
Lawrence Berkeley Laboratoryおよびその貢献者によって開発されたソフトウェアを含みます。
全文は[`LICENSE`](https://github.com/appneta/tcpreplay/blob/master/LICENSE)を参照してください。
これはプロジェクトのために書かれたファイルを対象としています。Tcpreplay Suiteとともに
配布される一部のファイルは他の著者が著作権を有し、異なるライセンスを持っており、
ファイル内でそのように明記されています。特定のファイルやモジュールに適用される
ライセンスに関する質問は、
[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