Ubuntu Weekly Recipe

第367回 Ubuntuでネットワークトラフィックを視覚化する

この記事を読むのに必要な時間:およそ 5 分

PCを使ううえでインターネットをはじめとするネットワーク機能は欠かせません。ネットワーク上ではさまざまなプロトコルやサービスに応じたパケットやフレームを機器間でやりとりしています。そこで今回はそんなネットワークのトラフィックの中身を見るために定番の,tcpdumpとWiresharkの基本的な使い方について紹介します。

Ubuntuなら常にインストールされているtcpdump

tcpdumpはlibpcapを利用したネットワークトラフィックをキャプチャ・表示するツールです。Ubuntuのstandardタスクに属しているため,普通のUbuntuやそのフレーバーであれば,常にインストールされているツールでもあります。

とりあえず実際に実行してみましょう。

$ sudo tcpdump -c 10

おそらくいろんなホストとの通信メッセージが表示されるはずです。⁠-c 10」は10パケット受信したら終了と言うオプションで,これがないとCtrl-Cを入力するまで延々とパケット情報を表示します。

出力の先頭フィールドは時刻です。その後ろについては,パケット種別によってフォーマットが異なります。たとえばARPパケットなら,問い合わせ内容と問い合わせ元のアドレスを表示します。

01:41:00.281097 ARP, Request who-has 192.168.10.3 tell 192.168.10.10, length 28
01:41:00.312383 ARP, Reply 192.168.10.3 is-at b8:27:eb:12:30:70, length 460

上記だと192.168.10.10から192.168.10.3のMACアドレスを問い合わせ,その結果が返ってきていることがわかります。

IPパケットであれば「送信元 > 送信先」のあとに,その内容を解析して概要を表示しています。

01:39:00.666424 IP 192.168.10.4.ssh > 192.168.10.10.54012:
    Flags [P.], seq 692251127:692251519, ack 2792381807, win 1810,
    options [nop,nop,TS val 932541213 ecr 44643234], length 392
01:39:00.666458 IP 192.168.10.10.54012 > 192.168.10.4.ssh:
    Flags [.], ack 392, win 1436,
    options [nop,nop,TS val 44643486 ecr 932541213], length 0

上記は192.168.10.4と192.168.10.10の間でssh通信が行われているときの様子です。

フィルタリング機能

tcpdumpは特にオプションを指定していない場合,そのホストが接続されているネットワーク上のパケットを表示します。しかしながら,その量は膨大であるため,必要な情報はすぐに流れてしまいます。そのため,tcpdumpには強力なパケットフィルタリング機能が存在します。

「-i」オプションはキャプチャするネットワークインターフェースを指定します。

$ sudo tcpdump -i eth0

「-P」オプションは受信パケットか送信パケットかを制約します。inなら受信パケットのみ,outなら送信パケットのみ,inoutなら送受信両方です。

$ sudo tcpdump -P in

なおこの「-P」オプションは14.04までのtcpdumpでのみ有効です。14.10で採用している4.6.2以降のtcpdumpは「-Q」オプションに名前が変わっているので注意してください。

オプションでは基本的なルールしか設定できませんが,コマンドの末尾にpcap準拠のフィルタリングルールを記載できます。パケットをフィルタする場合はこちらを使うほうが多いでしょう。

特定のホストに関連するパケットだけを表示したい場合はhostフィルタを使用します。また,各フィルタはandやor,notなどで連結可能です。

ホスト名emaの通信だけを表示
$ sudo tcpdump host ema

ホスト名emaと,miiもしくはriiとの通信を表示
$ sudo tcpdump host ema and \( mii or rii \)

ホスト名emaの通信のうち,taroに関連するものだけを除外
$ sudo tcpdump host ema and not taro

IPアドレスでの指定も可能
$ sudo tcpdump host 192.168.0.1

特定のポートの通信だけを表示する場合は,portフィルタを使用します。ポート番号でも指定できますし,/etc/servicesに列挙されていれば名前を使うこともできます。さらに各フィルタは「dst」「src」を追加すると,宛先,送信元それぞれのポートに限定できますし,⁠tcp」「udp」などプロトコル指定も可能です。

zukaホストでポート番号5060に関連する通信だけを表示
$ sudo tcpdump host zuka and port 5060

ftpもしくはftp-dataのポート」が宛先になっている通信だけ表示
$ sudo tcpdump dst port ftp or ftp-data

sshポートの通信のうちTCPパケットのみ表示
$ sudo tcpdump tcp port ssh

oiホストから送られるIPv4のブロードキャストパケットのみ表示
$ sudo tcpdump ip broadcast and src host oi

その他にもいろいろなルールを指定できます。詳しいことはpcap-filterのマニュアルを参照してください。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入