netsniff-ng toolkit / trafgen

netsniff-ng toolkit に含まれるトラフィック(パケット)ジェネレータ
socket mmap とか駆使して高速に動作するのと独自の簡易構文で任意のパケットパターンを組み立てられてるのが特徴

Kernelに同梱されてる pktgen も高速に動作するが、L3レベル(IPv4,IPv6)でペイロード内容はランダムにしか生成できないから性能評価には使えても、プロトコルスタックのテストには使えない。その点 trafgen なら任意のパケットパターンを組み立てられる

インストール方法
----

よくある手順でインストールできる
Ubuntu 12.04 LTS で実験。
apt にも登録されているけど、コマンドが少なかったりしたのでソースからコンパイルする方がよさそう

```sh
git clone git://github.com/borkmann/netsniff-ng.git

# 依存パッケージのインストール (INSTALLに書いてあるコマンドそのまま)
sudo apt-get install ccache flex bison libnl-3-dev \
libnl-genl-3-dev libgeoip-dev libnetfilter-conntrack-dev \
libncurses5-dev liburcu-dev libnacl-dev libpcap-dev \
zlib1g-dev libcli-dev libnet1-dev

configure
make
make install
```

使ってみる
----

ヘルプ通りに実行してみる
`-e`オプションでパケットパターンのサンプルが出力されるのでそれをパイプしてloインターフェイスに出力している

```
% trafgen -e | sudo trafgen -i - -o lo --cpp -n 1
     1 packets to schedule
    73 bytes in total
Running! Hang up with ^C!


           1 packets outgoing
          73 bytes outgoing
           0 sec, 9435 usec on CPU0 (1 packets)
```

`trafgen`に限らず netsniff-ng toolkit でNICを使うコマンドは`PF_PACKET`を使うので`root`で実行する必要があることに注意 

おまけ nacl のビルド
----

```
% ./configure
[*] Checking pkg-config ... [YES]
[*] Checking ccache ... [YES]
[*] Checking flex ... [YES]
[*] Checking bison ... [YES]
[*] Checking nacl ... [NO]
[*] Checking libnl ... [YES]
[*] Checking tpacket_v2 ... [YES]
[*] Checking tpacket_v3 ... [YES]
[*] Checking libnetfilter-conntrack ... [YES]
[*] Checking ncurses ... [YES]
[*] Checking libGeoIP ... [YES]
[*] Checking libz ... [YES]
[*] Checking liburcu ... [YES]
[*] Checking libpcap ... [YES]
[*] Checking hw timestamping ... [YES]
[*] Checking libcli ... [YES]
[*] Checking libnet ... [YES]
[*] Generating config.h ...
[!] The NaCl crypto library is currently not present on your system or
    could not be found. Either install it from your distro or build it
    manually using 'make nacl' and make sure that the NACL_INC_DIR and
    NACL_LIB_DIR environment variables are set appropriately.
[!] The following tools will *not* be built: curvetun
[*] The following tools will be built: netsniff-ng trafgen astraceroute flowtop ifpps bpfc mausezahn
[!] There were errors in the configure script. Please check the file
    config.log for details.
```

実験環境ではこんな感じで`nacl`がないと怒られた。
このままでも`curvetun`がビルドできないだけで`trafgen`を使うには支障がないが使うならメッセージに書いてある対処方法通りに実行する。(親切！)

```
% make nacl
--2014-01-05 18:21:17--  http://hyperelliptic.org/nacl/nacl-20110221.tar.bz2
Resolving hyperelliptic.org (hyperelliptic.org)... 131.155.71.33
Connecting to hyperelliptic.org (hyperelliptic.org)|131.155.71.33|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 163415 (160K) [application/x-bzip2]
Saving to: `/tmp/nacl-20110221.tar.bz2'

100%[============================================================================================================================================>] 163,415     24.4K/s   in 6.8s

2014-01-05 18:21:25 (23.4 KB/s) - `/tmp/nacl-20110221.tar.bz2' saved [163415/163415]

Building NaCl for arch x86 on host ubuntu1204 (grab a coffee, this takes a while) ...
NaCl lib path /home/devel/nacl/nacl-20110221/build/ubuntu1204/lib/x86
NaCl include path /home/devel/nacl/nacl-20110221/build/ubuntu1204/include/x86
Done!
/bin/sh: 1: source: not found
make: *** [nacl] Error 127
```

そうすると自動でソースをダウンロードしてきてビルドしてくれる。
ビルドが成功すると`~/.bashrc`に`NACL_INC_DIR`と`NACL_LIB_DIR`を勝手に追加されるので再度`configure`から実行すると認識される

上のログでは`make nacl`の最後では自動で`~/.bashrc`を`source`してくれるんだけど構文エラーで失敗している。その場合は手動で設定するか読み込み直すばOK。

参考URL
----

* [netsniff-ng.org](http://netsniff-ng.org/)
* [A look at the netsniff-ng toolkit](http://jonschipp.com/talks/derbycon2013.pdf)
* [Pktgen](http://hkatou.orz.hm/cisco/Pktgen)