tcpdumpの使い方

Posted at 04 Aug 2015

tcpdumpとはコンピュータのネットワークインターフェースを流れるデータを 文字通りdumpして中身を見ることを可能にする古から伝わるコマンド。

昨今はパケットキャプチャソフトに完全に押されているが、かろうじて現役。

実行オプションと環境によっては短時間に大量のデータが落ちるため容量に注意する必要がある。 基本的には通信ポートはホストを絞ってdumpする方がいい。

1. ネットワークデバイスの確認

status: activeになっているネットワークインターフェースをtcpdumpコマンドの引数に指定する。
下記の例の場合はen0が対象となる。

$ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 ::1 prefixlen 128
    inet 127.0.0.1 netmask 0xff000000
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
    nd6 options=1<PERFORMNUD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 3c:15:c2:d5:c9:5c
    inet6 fe80::3e15:c2ff:fed5:c95c%en0 prefixlen 64 scopeid 0x4
    inet 192.168.0.10 netmask 0xffffff00 broadcast 192.168.0.255
    inet6 240f:76:c06:1:3e15:c2ff:fed5:c95c prefixlen 64 autoconf
    inet6 240f:76:c06:1:f42e:d6cc:c623:4913 prefixlen 64 autoconf temporary
    nd6 options=1<PERFORMNUD>
    media: autoselect
    status: active
en1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 72:00:04:37:9a:90
    media: autoselect <full-duplex>
    status: inactive

2. dumpの実行

使い方

実行にはsudo権限が必要。tcpdump : Couldn't find user 'tcpdump'のエラーが出ないように-Zオプションで 通信を覗き見る権限を持つユーザーを指定する。

$ sudo tcpdump -Z <user> -i <interface> -w <filename> -s <data length (default :64KB)> '条件式'

使用例

$ sudo tcpdump -Z root -i en0 -w 1.dump                     
$ sudo tcpdump -Z root -i en0 -w 1.dump -s 1600 'port 80'  # port 80を指定

3. dump結果の確認

dump結果はバイナリで保存されるのでそのままでは一部を除きほとんど何が書かれているかわからない。 保存したファイルを指定してtcpdumpコマンドを介して中身を見る。

$ sudo tcpdump -r 1.dump      # dump結果の確認
$ sudo tcpdump -r 1.dump -X   # dump結果の確認(ASCII + 16進表示)
$ sudo tcpdump -r 1.dump 'host smile.example.com'  # 特定のホスト(smile.example.com)との通信を抽出
もどる