一般に、ヘッダとペイロードから成る構造を「パケット」と呼び、これをレベル(層)で使い分ける。
UDP/TCP | セグメント |
IP | データグラム |
データリンク | フレーム |
RedHat Linux 7.2 で動かしたいが、インストールされておらず、rpm も見つからなさそうなのでソースを get してビルドした。
-rwxrwxr-x 1 xxxxx xxxxx 424567 6月 14 19:42 tcpdump-3.8.1/tcpdump
インストールはと言うと install-sh があるのだが、そうじゃなくて make install で行うらしい。
[root@xxxxx tcpdump]# ll /usr/local/sbin/ -rwxr-xr-x 1 root root 424567 6月 14 19:48 tcpdump
これで目出度く tcpdump が動くようになった。
[root@xxxxxx ~]# tcpdump -n ip multicast -T rtp 19:54:24.064740 IP 192.168.0.x.32772 > 239.xxx.0.xxx.9999: udp/rtp 1316 c33 36311 1436815718 19:54:24.074740 IP 192.168.0.x.32772 > 239.xxx.0.xxx.9999: udp/rtp 1316 c33 36312 1436815808 19:54:24.084740 IP 192.168.0.x.32772 > 239.xxx.0.xxx.9999: udp/rtp 1316 c33 36313 1436815988 19:54:24.094740 IP 192.168.0.x.32772 > 239.xxx.0.xxx.9999: udp/rtp 1316 c33 36314 1436816078 19:54:24.104740 IP 192.168.0.x.32772 > 239.xxx.0.xxx.9999: udp/rtp 1316 c33 36315 1436816258
ポート番号は何か適当な文字列で表示されるかと思ったが、数値で表示された。何故か判らない...
因みに -nn とすると強制的に数値表示になる。これ、大抵のマニュアルに書かれていない。
マニュアルを見ても詳しい解説が無いのでソースを見る。print-udp.c に rtp_print() がそれらしい。後半を示す。
+--------------------------- 半固定 | +-------------------- UDPヘッダから取ったサイズ? | | +---------------- 固定の c の後にペイロードタイプが付く。 | | | +------------- 拡張フラグなら +、マーカ有りなら * が入るらしい。 | | | | +---------- sequence number | | | | | +-- time-stamp | | | | | | udp/rtp 1316 c33 36311 1436815718
保存は -w file だけど、その時に 68bytes でカットされない為には -s 0 とするそうな。中身が重要な時は必須。
言わずと知れた Wireshark。
しょっちゅう使う訳でもなく、それでもたまに使っても何とかなるのが素晴らしいが、それに甘んじているせいか、効率的な使用法がいつまで経っても身に付かない... orz
今回はフレーム間を跨いだデータを見なきゃならなくなって、その場合、フレーム毎に(ダンプデータの)アドレス表示される処が、どうにも具合が悪い。
つまりフラグメント化されたようなデータを眺めたい時にアドレス表示が連続しないのとヘッダー部分の読み飛ばしがメンドイ。
早いとこ見たいので、まず考えたのが Analyze メニューにある Follow UDP Stream(TCP も有り)。
ここで Hex Dump Raw 表示にして Save As でファイルに落とす。
要らないデータも混在してしまったが、ま、多少は我慢してテキストを AWK なんかでフィルタリングする。
(Wireshark でちゃんとフィルタリングすれば良いんだろうが...)
なんとも情ない方法のような気がしつつ、また、フレーム情報を残しながら連続したデータ表示する方法は無いものか?と思う。
Wireshark 表示向け AWK なんてのが有れば最高なんだけどなぁ~。
(2014-2-2) 久し振りにやってみると適当な表示フィルタを掛けてくれ、望むデータが得られた。
e.g. (ip.addr eq x.x.x.x and ip.addr eq y.y.y.y) and (udp.port eq 1072 and udp.port eq 5004)
フィルタが設定されてからダイアログ起動するので、気に入らなければ予め自分で修正しておけば良いのか?と思うが、Follow UDP Stream を起動する度に設定されてしまう...
フィルタは兎も角、ヘッダ類を削除してくれるツールは無いものか…
色々付いてるが良く判らない
因みに capinfos ツールの出力表示例
>capinfos xxx File name: xxx File type: Wireshark/tcpdump/... - libpcap File encapsulation: Ethernet Number of packets: 582 File size: 793442 bytes Data size: 784106 bytes Capture duration: 23 seconds Start time: Sun Feb 02 15:27:51 2014 End time: Sun Feb 02 15:28:13 2014 Data byte rate: 34657.79 bytes/sec Data bit rate: 277262.30 bits/sec Average packet size: 1347.26 bytes Average packet rate: 25.72 packets/sec
キャプチャファイル xxx は Linux側 tcpdump で採ったもの。
tcpdump -nn udp port 5004 -wxxx
Wireshark(Ethereal)は受信データをファイルへ書き出す事が出来るが、何か特別な方法を使ってるかも知れない、と思ってソースを見てみた。
wireshark-1.2.2.tar.bz2
ぱっと見て理解できるような量でないが、何となぁくルートにある pcapio.c な気もする。
このソースの冒頭に書かれてあるコメントを見ると、libpcap や WinPcap にあるものが使えない場合があるので書いたんだ、みたいな理由が書かれてある。
さて、知りたかった書き込み関数は fwrite() を使ってるようで、ん~、特別なトリックなんて無いって事だろうか...