誰のせいでもなくnetsniff-ng

Posted on 2013/03/08(Fri) 02:00 in technical

tcpdumpは許されている。

では、netsniff-ngはどうか。

はい、公式。

http://netsniff-ng.org/

RX_RING, TX_RINGを用いたゼロコピーメカニズムにより、今までに無いパフォーマンスでパケットキャプチャ、ジェネレート、統計取得などなどをしていくぜ、って話である。(良く分からないまま喋ってる典型的な台詞)

それでは以下うんぬん。

netsniff-ng自体はtcpdumpの類似アプリであるが、周辺ツール郡として、パケットジェネレータや統計取得、暗号化トンネルのテストツールも含まれている。

まずは基本的なところから見ていこうと思います。

一応インストールから。

Ubuntu server 12.04.2 amd64にインストールする。

$ sudo apt-get install git ccache flex bison libnl-3-dev
libnl-genl-3-dev libgeoip-dev libnetfilter-conntrack-dev
libncurses5-dev liburcu-dev libpcap-dev zlib1g-dev
$ git clone https://github.com/borkmann/netsniff-ng
$ cd netsniff-ng/
$ make nacl
$ source ~/.bashrc
$ make
$ sudo make install \tee install.log

libpcapもソースからインストールする場合は、以下のコミュニティページを見るのがいいと思う。

https://help.ubuntu.com/community/Netsniff-NG

インストールを終えたら、簡単に試せるところから見ていこう。

まず、簡単にパケットキャプチャでこんな感じ。3パケットだけ。

$ sudo netsniff-ng -d eth0 -n 3
Running! Hang up with ^C!

> eth0 122 1362673618s.927171672ns
[ Eth MAC (4c:72:b9:26:e9:ca => 78:e7:d1:72:0a:8c), Proto
(0x0800, IPv4) ]
[ Vendor (Pegatron Corporation => Hewlett-Packard Company) ]
[ IPv4 Addr (192.168.122.147 => 192.168.122.150), Proto (6), TTL
(64), TOS (0), Ver (4), IHL (5), Tlen (108), ID (38809), Res (0),
NoFrag (1), MoreFrag (0),
FragOff (0), CSum (0x2c78) is ok ]
[ TCP Port (22 (ssh) => 49259), SN (0x5d6431c2), AN (0x7ff57826),
DataOff (5), Res (0), Flags (PSH ACK ), Window (156), CSum (0x76d9),
UrgPtr (0) ]
[ Chr
._O....1./J...5F.2..X.;...].".....e......8(.)C:f"SmDg.Rq.e9S?y..$...
]
[ Hex f7 5f 4f 13 e5 bd 95 31 19 2f 4a 8e 9f d8 35 46 1d 32 2e d1
58 90 3b e1 2e 99 5d c3 22 96 b9 01 a5 0f 65 89 0a 10 df 1a 1d 38 28
b0 29 43 3a 66 22 53
6d 44 67 b6 52 71 9a 65 39 53 3f 79 c7 c0 24 98 81 e5 ]

> eth0 106 1362673618s.927332076ns
[ Eth MAC (4c:72:b9:26:e9:ca => 78:e7:d1:72:0a:8c), Proto
(0x0800, IPv4) ]
[ Vendor (Pegatron Corporation => Hewlett-Packard Company) ]
[ IPv4 Addr (192.168.122.147 => 192.168.122.150), Proto (6), TTL
(64), TOS (0), Ver (4), IHL (5), Tlen (92), ID (38810), Res (0),
NoFrag (1), MoreFrag (0), F
ragOff (0), CSum (0x2c87) is ok ]
[ TCP Port (22 (ssh) => 49259), SN (0x5d643206), AN (0x7ff57826),
DataOff (5), Res (0), Flags (PSH ACK ), Window (156), CSum (0x76c9),
UrgPtr (0) ]
[ Chr ..\*.].6.j..~.....3n...o...Qne........X=.P-..l...I.AO ]
[ Hex 08 f9 2a 08 5d df 36 f3 6a 8f d5 7e 11 9d a3 d7 b5 33 6e 89
1b cf 6f 18 e4 12 51 6e 65 fd 98 ea f9 86 ca 09 9f 58 3d d6 50 2d 1a
1c 6c 07 ba 05 49 10
41 4f ]

> eth0 106 1362673618s.927352962ns
[ Eth MAC (4c:72:b9:26:e9:ca => 78:e7:d1:72:0a:8c), Proto
(0x0800, IPv4) ]
[ Vendor (Pegatron Corporation => Hewlett-Packard Company) ]
[ IPv4 Addr (192.168.122.147 => 192.168.122.150), Proto (6), TTL
(64), TOS (0), Ver (4), IHL (5), Tlen (92), ID (38811), Res (0),
NoFrag (1), MoreFrag (0), F
ragOff (0), CSum (0x2c86) is ok ]
[ TCP Port (22 (ssh) => 49259), SN (0x5d64323a), AN (0x7ff57826),
DataOff (5), Res (0), Flags (PSH ACK ), Window (156), CSum (0x76c9),
UrgPtr (0) ]
[ Chr &..8.........\\.e.....G....-.:.........mk.f}..."?K..P ]
[ Hex 26 9d 9c 38 b7 f1 99 00 b0 db df e4 d4 5c 84 65 98 94 9b 8f
f1 47 c0 bc dd c8 2d 04 3a f6 bd f5 e0 11 d6 e6 1c 0a 6d 6b f1 66 7d
c1 f9 1b 22 3f 4b cd
b4 50 ]

857 packets incoming
857 packets passed filter
0 packets failed filter (out of space)
0.0000% packet droprate
0 sec, 10235 usec in total

普通にファイルキャプチャした場合。

今回はnanosec pcap形式。

$ sudo netsniff-ng -d eth0 -o dump.pcap --magic 0xa1b23c4d -s

ほーら、こんな感じだよー。

trafgen_06.png

対応しているパケットキャプチャファイル形式はこんなもんか。:

$ sudo netsniff-ng -D
tcpdump-capable pcap:
magic: 0xa1b2c3d4 (swapped: 0xd4c3b2a1)
features:
timeval in us
packet length
packet cap-length
tcpdump-capable pcap with ns resolution:
magic: 0xa1b23c4d (swapped: 0x4d3cb2a1)
features:
timeval in ns
packet length
packet cap-length
Alexey Kuznetzov's pcap:
magic: 0xa1b2cd34 (swapped: 0x34cdb2a1)
features:
timeval in us
packet length
packet cap-length
packet ifindex
packet protocol
packet type
netsniff-ng pcap:
magic: 0xa1e2cb12 (swapped: 0x12cbe2a1)
features:
timeval in ns
packet length
packet cap-length
packet ifindex
packet protocol
hardware type
packet type

後は、パケット生成とその統計情報習得。

eth2とeth3を直結しておく。

$ trafgen -e > trafgen.cfg
$ ifconfig \grep -e "eth2" -e "eth3" -A 8
eth2 Link encap:イーサネット ハードウェアアドレス
a0:36:9f:02:63:d0
inet6アドレス: fe80::a236:9fff:fe02:63d0/64 範囲:リンク
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:79 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:232 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:25890 (25.8 KB) TXバイト:39104 (39.1 KB)
メモリ:f0000000-f0100000

eth3 Link encap:イーサネット ハードウェアアドレス
a0:36:9f:02:63:d1
inet6アドレス: fe80::a236:9fff:fe02:63d1/64 範囲:リンク
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:157 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:131 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:24667 (24.6 KB) TXバイト:32384 (32.3 KB)
メモリ:f0100000-f0200000
$ sudo ifpps -d eth2 -clp > eth2.log &
$ sudo ifpps -d eth3 -clp > eth3.log &
$ sudo trafgen --dev eth2 --conf trafgen.cfg --cpp -n 100000000
$ sudo killall ifpps

ifppsは、普通に使うとtopに似た感じで出力が出る。

trafgen_04.png

-cオプションを使うとCSV出力が出来るので、上で取得したeth2.logとeth3.logを使うとグラフも書ける(gnuplotで書けよ、って話はさておいて)

trafgen_05.png

デバイスがIPを持っている必要もないので、パケットレートを測定するには非常に都合がいい。

trafgen -e > trafgen.cfgで出力したファイルは、中を見ると分かるけど16進数を頑張って書けばいい、ということが分かる。

また、部分的にランダム、インクリメント、チェックサム計算をさせたい場合に必要なコマンド群も有効なので、シーケンス番号を付与してパケット通過の前後関係を見るのにも適している。

GUI欲しいかなぁ、とか思ったんだけど、Q&A見てたら

http://netsniff-ng.org/faq.html#d8

Will you ship a GUI like Wireshark?
Nope, GUIs suck.

あ、ハィ...すいません...

じゃあWindows版とか...

http://netsniff-ng.org/ のContribute。

Currently, netsniff-ng is only available for Linux platforms. If you
have a port for \*BSD, let us know for merging your port into the
main source tree. However, please do not port netsniff-ng to Windows
or other proprietary junk software! Here is a nice explanation why;
we share Felix von Leitner's point of view.

あ、ハィ...すいません...

チューニングというか、狙えば割と良いレートが出せそうなので、参考までに載せておく。

転送レートの調整は、パケット間のギャップ(microsecond)で指定するっぽいので、計算がちょっと面倒なんですよねぇ。

環境: DQ77KB + E3-1265L v2 + DDR3 1600Mhz 8G*2 = 16G Mem + Ubuntu 12.04.2 + netsniff-ng 0.5.8-next + libpcap 1.1.1-10

こんな感じで投げて、

trafgen_01.png

これっくらいのレートは見えたりしつつ、

trafgen_02.png

これくらいの統計が見えたりする。

trafgen_03.png

そんなわけで、まぁ使えるんじゃないかと思っているので、ちゃんと測定に使ってみたいですね。