【パケット解析】tcpdump の ARM クロスコンパイル

リソース的な都合でCUI環境しかない組み込みデバイス開発, ループバックアドレス内で通信していて Wireshark ではパケットダンプできないケースに tcpdump は役立ちます。
ただしディストリビューション環境であれば, クロスコンパイルよりパッケージマネージャでのインストールの方が楽です。また, wiresahrkのCUI版の tshark という選択肢もあります。

digital

# 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 をにらめっこしながらなんとか実装完了。