
캡처된 네트워크 트래픽을 임의의 속도로 편집하고 재생 — *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] 같은 도구로 미리 캡처한 네트워크 트래픽을 편집하고 재생하기 위한 [GPLv3] 라이선스 유틸리티 모음으로, UNIX(및 [Cygwin] 환경의 Windows)에서 사용할 수 있습니다. 트래픽을 클라이언트 또는 서버로 분류하고, Layer 2/3/4 헤더를 재작성한 뒤, 스위치, 라우터, 방화벽, NIDS 및 IPS를 통해 네트워크로 다시 재생합니다. 속도는 아주 느린 속도부터 회선 최대 속도까지 지원합니다. Tcpreplay는 스니핑 장치와 인라인 장치 모두를 테스트할 수 있도록 단일 NIC 모드와 이중 NIC 모드를 모두 지원합니다.
Tcpreplay는 수많은 방화벽, IDS, IPS, NetFlow 및 기타 네트워킹 벤더, 기업, 대학, 연구소, 오픈 소스 프로젝트에서 사용됩니다. 여러분의 조직에서 Tcpreplay를 사용하고 있다면, 어떤 조직인지 그리고 어떤 용도로 사용하는지 알려 주세요. 중요한 기능의 우선순위를 계속 정하는 데 도움이 됩니다.
4.0 이후 Tcpreplay는 [IP Flow][flow]/[NetFlow] 어플라이언스 테스트를 특별히 겨냥합니다. 정확한 고속 재생 타이밍과 결과 보고, 초당 플로우(fps) 통계, 그리고 플로우 제품의 타임아웃 설정을 튜닝하기 위한 플로우 만료 분석을 제공하며, pcap 파일의 플로우 크기에 따라 초당 수십만 개의 플로우까지 처리할 수 있습니다.
📖 **전체 문서는 <https://tcpreplay.appneta.com>에 있습니다** — 시작 가이드, 도구별 페이지, 활용 레시피, 이 모음의 배경 개념, 매뉴얼 페이지, 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)
- [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`는 보통 Layer 2에 머뭅니다.
Pcap 파일 편집기 및 유틸리티:
--------------------------------
* **tcpprep** — 패킷을 클라이언트 또는 서버로 분류하고 tcpreplay/tcprewrite가 사용하는 캐시 파일을 작성하는 다중 패스 pcap 전처리기
* **tcprewrite** — pcap 파일의 TCP/IP 및 Layer 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 라이브러리
* WireGuard 및 tun 장치와 같은 [원시 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 자체는 여전히 하나의
내부 헤더(`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로 직접 전송하는
오버헤드가 더 낮은 세 가지 방법이 있습니다. 대략 다음 순서대로 시도해 보세요 —
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 버퍼에 직접 기록합니다. 이는 세 가지 옵션 중 가장 침습적입니다 —
활성화된 동안 해당 인터페이스의 네트워크 스택이 꺼지므로 **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 태그를 포함한 이더넷, Linux SLL, 루프백 등)는 자동으로 제거되며, 패킷은 WireGuard와 같은 드라이버가 요구하는 올바른 프로토콜의 순수 IPv4/IPv6로 전송됩니다:
```
sudo tcpreplay -i wg0 test.pcap
```
IP가 아닌 패킷(예: ARP)은 이러한 인터페이스에서 전송할 수 없으며
실패로 보고되고, `--io-uring`은 이들 인터페이스에서 지원되지 않는다는 점에 유의하라.
libtcpreplay C 라이브러리
-----------------------
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 소켓/패킷 주입)이 필요하며 구성된 테스트 NIC에서 실제 트래픽을 전송합니다. 연결에 사용 중인 인터페이스에 대해서는 실행하지 마십시오. `make test`는 autotools 전용입니다. `--with-testnic`/`--with-testnic2`로 테스트 NIC를 구성하는 방법은 [`docs/INSTALL`](https://github.com/appneta/tcpreplay/blob/master/docs/INSTALL)을 참조하십시오.
도움 받기
============
버그를 발견했다고 생각하거나 질문이 있으십니까? 먼저
[기존 이슈](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)를 따라 주십시오.
또한 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