リソース的な都合でCUI環境しかない組み込みデバイス開発, ループバックアドレス内で通信していて Wireshark ではパケットダンプできないケースに tcpdump は役立ちます。
ただしディストリビューション環境であれば, クロスコンパイルよりパッケージマネージャでのインストールの方が楽です。また, wiresahrkのCUI版の tshark という選択肢もあります。
# RHEL
$ yum install wireshark
# Debian
$ sudo apt-get install tshark
tsharkでも wオプション でループバックアドレス内での通信は拾える模様。
$ tshark -i lo -w tshark.log
tcpdumpを wオプション でキャプチャ結果をpcap形式でファイル出力させれば, それを Wireshark に喰わせることもできます。
$ tcpdump -i lo -w tcpdump.log
他にも tcpdump には下記のようなオプションがあります。
- -i: キャプチャするNICを指定する
- -c: 受信パケット数を指定する, 受信後にプロセスは終了する
- -s: キャプチャのバッファサイズを指定する
- -F: tcpdumpで指定可能な条件式を記述したファイルから条件式を読み込む
tcpdumpのクロスコンパイル
ホストPCはUbuntu 12.10です。
公式から tar.gz をダウンロードもしくはGithubから。
$ git clone https://github.com/the-tcpdump-group/libpcap.git
$ git clone https://github.com/the-tcpdump-group/libpcap.git
構文解析器 bison と字句解析器 flex がなければインストールします。
$ sudo apt-get install bison
$ sudo apt-get install flex
Version: 4.5.1 / 1.5.3 ではクロスコンパイル失敗, 以下のエラーがどうしても解決できませんでした。
checking for pcap_loop... no
configure: error: Report this to tcpdump-workers () lists tcpdump org, and
include the
config.log file in your report. If you have downloaded libpcap from
tcpdump.org, and built it yourself, please also include the config.log
file from the libpcap source directory, the Makefile from the libpcap
source directory, and the output of the make process for libpcap, as
this could be a problem with the libpcap that was built, and we will
not be able to determine why this is happening, and thus will not be
able to fix it, without that information, as we have not been able to
reproduce this problem ourselves.
なので Version: 4.3 / 1.3 で今回は確認しました。
まずは libcap から。make install の必要はないです。
$ CC=arm-none-linux-gnueabi-gcc ac_cv_linux_vers=2 ./configure --host=arm-none-linux-gnueabi --with-pcap=linux
$ make
tcpdumpを libcap と同じディレクトリ階層に配置します。
$ ac_cv_linux_vers=2 ./configure --target=arm-none-linux-gnueabi --host=arm-none-linux-gnueabi --prefix /path/to/your/xxx --disable-ipv6
$ make && make install
確認します。
$ file tcpdump
tcpdump: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.14, not stripped
localhost to localhost で組んだ RTP/RTSP over HTTP は RFC2326 と tcpdump をにらめっこしながらなんとか実装完了。