誰のせいでもなくnetsniff-ng
Posted on 2013/03/08(Fri) 02:00 in technical
tcpdumpは許されている。
では、netsniff-ngはどうか。
はい、公式。
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
ほーら、こんな感じだよー。
対応しているパケットキャプチャファイル形式はこんなもんか。:
$ 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に似た感じで出力が出る。
-cオプションを使うとCSV出力が出来るので、上で取得したeth2.logとeth3.logを使うとグラフも書ける(gnuplotで書けよ、って話はさておいて)
デバイスが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
こんな感じで投げて、
これっくらいのレートは見えたりしつつ、
これくらいの統計が見えたりする。
そんなわけで、まぁ使えるんじゃないかと思っているので、ちゃんと測定に使ってみたいですね。