tcpdump でパケットキャプチャ

No Photo

イメージ

風邪のような風邪でないような体調がここ数日続いています。nakamura です。みなさんも季節の変わり目は体調管理に気を付けましょう。

さて今日は tcpdump というパケットキャプチャツールをご紹介しようと思います。パケットキャプチャというとなんだか敷居が高いような気がしますが、使い方自体はそれ程難しいものではありません。基本的な使い方だけでも覚えておくと何かと重宝しますよ!

はじめに

tcpdump はほとんどの UNIX システム上で動作するパケットキャプチャツールで、自身の所属するネットワーク上を流れるパケットを全て横取りして表示する事が出来ます。tcpdump を動作させるにはスーパーユーザである必要があり、これはネットワークカードのプロミスキャスモードという機能を使用する為で、プロミスキャスモードというのは自分宛てでないパケットも全て取得して処理をするというネットワークカードの動作モードのひとつです。

現在はほとんどの Linux 系ディストリビューションでパッケージが存在するはずですがソースからインストールしたい、という方は こちら からどうぞ。

使ってみよう

tcpdump コマンドには多くのオプションが存在しますが実際によく使うものは概ね限られています。(オプションの詳細については man tcpdump 等で確認してください)

まずは下記の例を元に解説しましょう。

$ tcpdump -ne -i eth0 not port 22

-n オプションは『名前解決をしない』という意味です。これを指定しないと IP アドレスから逆引きしたりポート番号をサービス名に変換したりと余計な処理に手間を掛ける事になるので僕は必ず指定しています。-e オプションは『リンクレベルヘッダを表示』という意味で MAC アドレスやパケット長等の情報を表示する事が出来ます。-i オプションは監視するインターフェイスを指定するのに使います。オプションの後にはフィルタリングの条件を指定します。ここではポート 22 番以外のパケットを監視するよう指定しています。条件を指定しないと全てのパケットを表示します。

このコマンドの実行結果はこんな感じになります。

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 68 bytes
11:11:27.832621 00:30:1b:35:7e:21 > 00:09:41:a5:ba:20, ethertype ARP (0x0806), length 42: arp who-has 192.168.0.1 tell 192.168.0.149
11:11:27.832809 00:09:41:a5:ba:20 > 00:30:1b:35:7e:21, ethertype ARP (0x0806), length 60: arp reply 192.168.0.1 is-at 00:09:41:a5:ba:20
11:11:28.770248 00:1a:a0:7f:42:2c > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: arp who-has 192.168.0.175 tell 192.168.0.104
11:11:30.073213 00:1a:a0:7f:e2:ae > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 243: 192.168.0.162.138 > 192.168.0.255.138: NBT UDP PACKET(138)
11:11:31.176400 00:1e:c2:ba:0e:ad > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 92: 192.168.0.191.49275 > 192.168.0.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
11:11:57.834631 00:30:1b:35:7e:21 > 00:09:41:a5:ba:20, ethertype IPv4 (0x0800), length 90: 192.168.0.149.123 > 219.57.112.38.123: NTPv4, Client, length 48
11:11:57.859439 00:09:41:a5:ba:20 > 00:30:1b:35:7e:21, ethertype IPv4 (0x0800), length 90: 219.57.112.38.123 > 192.168.0.149.123: NTPv4, Server, length 48

最初の 2 行は tcpdump コマンドの開始メッセージです。特に気にする必要はありません。次の 3 行は ARP というプロトコルのパケットを表示したものですね。ARP は IP アドレスと MAC アドレスの紐付けを行う為のプロトコルで、イーサネット環境であれば必ず大量に行き来しているパケットです。次の 2 行は Windows マシンの NetBIOS のパケットでしょうか。最後の 2 行は NTP を使って時刻同期をしようとしているパケットです。

その他にもこんな使い方が

tcpdump コマンドの肝は何と言ってもフィルタリングにあると言っても良いでしょう。うまいこと条件を指定してあげることで自分の必要とする情報だけを効率よく表示させる事が出来ます。

tcpdump -ne -i eth0 not arp and not port 123

先程も書きましたが ARP のパケットはネットワーク上に大量に流れています。必要な情報を効率よく見つけるにはこれらのパケットは表示しないようにするのが望ましいでしょう。上記のように指定する事で ARP と NTP のパケットを除外する事が可能です。

tcpdump -ne -i eth0 host 192.168.0.100 and port 80 or port 443

これは 192.168.0.100 が接続元もしくは接続先となる HTTP 及び HTTPS のパケットのみを表示する例です。

#!/bin/bash
/usr/sbin/tcpdump -nev -i eth0 not arp and not port 22 >> /var/log/tcpdump.log &

こんな感じのスクリプトを用意して tcpdump をデーモン化しておけばパケットキャプチャのログを取り続ける事も可能です。ちなみに -w オプションでもファイルに書き込む事は出来ますが、ファイルの中身を表示するのに tcpdump -r ファイル名 としないといけないのでリダイレクトの方が楽でしょう。-v オプションは詳細表示するオプションで更に v をもうひとつ増やすとむちゃくちゃ表示の量が増えます。

最後に

tcpdump 以外にもパケットキャプチャツールは存在します。Windows では tcpdump が使えない代わりに Wireshark というツールが一般的なようですね。また、Wireshark の CUI 版で tshark というコマンドもあります。どれもやっている事は tcpdump とそう変わらないので一度使ってみて好みで決めるのも良いでしょう。

パケットキャプチャツールはネットワーク周りのトラブルシューティングに絶大な力を発揮します。『ホスト A からだけホスト B に SSH 接続が出来ない!』とか『上位ルータを入れ替えたらサイトが見えなくなった!』というような時にパケットをキャプチャする事によって、リクエストはサーバに到達しているのか、サーバはレスポンスを返そうとしているのか、レスポンスはどこまで到達しているのか、というようなネックとなっている箇所を特定する為の情報が集めやすくなります。日頃からよく使うものではないですが、大まかな使い方を覚えておくと問題が起きたときにとても便利ですよ!

参考 URL

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ