Murayama blog.

プログラミングと、その次の話

tcpdumpの使い方

tcpdumpはネットワークのトラフィックを監視するツールです。

tcpdump

で監視がスタートします。
ただい、この場合、NICに流れるいろんなパケットが出力されちゃいます。
特に、sshでログインしてtcpdumpってするとびっくりします。


監視対象のパケットを絞り込む場合は、ホストやポート、プロトコルを指定します。

tcpdump host 192.168.24.73 and port 80

上記の場合であればホストが192.168.24.73、ポート80番(HTTP)のパケットを監視できます。
この場合、送信元、送信先の指定はしていないので、送信元、送信先のいずれかに該当するものが監視対象となります。


送信元の指定のみをフィルタリングの対象としたい場合はsrcと修飾します。同様に送信先を指定する場合はdstを指定します。

tcpdump src host 192.168.24.73

実際に試してみる

HTTPサーバとの通信を監視してみます。
・HTTPサーバ(192.168.24.62)
・クライアント(192.168.24.73)


クライアントのブラウザからhttp://192.168.24.62/index.htmlへアクセスすることにします。
192.168.24.62のドキュメントルートにあるindex.htmlは以下のファイルです。

<html>
<head>
<title>test page title</title>
</head>
<body>
test page data
</body>
</html>

ひねりなし。


サーバ側でtcpdumpを起動します。

# tcpdump host 192.168.24.73 and port 80 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

 -nオプションはホスト名の名前解決を防ぐ指定です。


ブラウザからhttp://192.168.24.62/index.htmlへアクセスします。


そんで、サーバ側のtcpdumpを確認します。

# tcpdump host 192.168.24.73 and port 80 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
21:48:36.476894 IP 192.168.24.73.4697 > 192.168.24.62.http: S 1751526227:1751526227(0) win 65535 <mss 1260,nop,nop,sackOK>
21:48:36.477798 IP 192.168.24.62.http > 192.168.24.73.4697: S 1906616760:1906616760(0) ack 1751526228 win 5840 <mss 1460,nop,nop,sackOK>
21:48:36.476970 IP 192.168.24.73.4697 > 192.168.24.62.http: . ack 1 win 65535
21:48:36.477150 IP 192.168.24.73.4697 > 192.168.24.62.http: P 1:408(407) ack 1 win 65535
21:48:36.477191 IP 192.168.24.62.http > 192.168.24.73.4697: . ack 408 win 6432
21:48:36.477586 IP 192.168.24.62.http > 192.168.24.73.4697: P 1:353(352) ack 408 win 6432
21:48:36.477710 IP 192.168.24.62.http > 192.168.24.73.4697: F 353:353(0) ack 408 win 6432
21:48:36.477817 IP 192.168.24.73.4697 > 192.168.24.62.http: . ack 354 win 65183
21:48:36.478516 IP 192.168.24.73.4697 > 192.168.24.62.http: F 408:408(0) ack 354 win 65183
21:48:36.478526 IP 192.168.24.62.http > 192.168.24.73.4697: . ack 409 win 6432
21:48:36.880898 IP 192.168.24.73.4700 > 192.168.24.62.http: S 661388559:661388559(0) win 65535 <mss 1260,nop,nop,sackOK>
21:48:36.880951 IP 192.168.24.62.http > 192.168.24.73.4700: S 1910275433:1910275433(0) ack 661388560 win 5840 <mss 1460,nop,nop,sackOK>
21:48:36.881060 IP 192.168.24.73.4700 > 192.168.24.62.http: . ack 1 win 65535
21:48:36.881234 IP 192.168.24.73.4700 > 192.168.24.62.http: P 1:379(378) ack 1 win 65535
21:48:36.881264 IP 192.168.24.62.http > 192.168.24.73.4700: . ack 379 win 6432
21:48:36.881645 IP 192.168.24.62.http > 192.168.24.73.4700: P 1:467(466) ack 379 win 6432
21:48:36.881709 IP 192.168.24.62.http > 192.168.24.73.4700: F 467:467(0) ack 379 win 6432
21:48:36.881856 IP 192.168.24.73.4700 > 192.168.24.62.http: . ack 468 win 65069
21:48:36.882013 IP 192.168.24.73.4700 > 192.168.24.62.http: F 379:379(0) ack 468 win 65069
21:48:36.882025 IP 192.168.24.62.http > 192.168.24.73.4700: . ack 380 win 6432

おぉ。いいかんじに出力されています。
ちょっと詳細を見ると、先頭3行がいわゆる3-way handshakeというやつです。

21:48:36.476894 IP 192.168.24.73.4697 > 192.168.24.62.http: S 1751526227:1751526227(0) win 65535 <mss 1260,nop,nop,sackOK>
21:48:36.477798 IP 192.168.24.62.http > 192.168.24.73.4697: S 1906616760:1906616760(0) ack 1751526228 win 5840 <mss 1460,nop,nop,sackOK>
21:48:36.476970 IP 192.168.24.73.4697 > 192.168.24.62.http: . ack 1 win 65535

"S"ってのがSYNフラグ。ackてのが"ACK"フラグ。
その他もろもろの読み方はこちらが参考になります。
http://net-newbie.com/tcpip/tcp/tcpdump.html


もうちょっと便利な使い方 -X オプションを指定すると、転送データのASCII表示が可能です。

# tcpdump host 192.168.24.73 and port 80 -Xn
	tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
21:54:53.825183 IP 192.168.24.73.syscomlan > 192.168.24.62.http: S 1698457150:1698457150(0) win 65535 <mss 1260,nop,nop,sackOK>
        0x0000:  4500 0030 dce0 4000 8006 6c0f c0a8 1849  E..0..@...l....I
        0x0010:  c0a8 183e 0429 0050 653c 663e 0000 0000  ...>.).Pe<f>....
        0x0020:  7002 ffff 021c 0000 0204 04ec 0101 0402  p...............
21:54:53.825710 IP 192.168.24.62.http > 192.168.24.73.syscomlan: S 2292024228:2292024228(0) ack 1698457151 win 5840 <mss 1460,nop,nop,sackOK>
        0x0000:  4500 0030 0000 4000 4006 88f0 c0a8 183e  E..0..@.@......>
        0x0010:  c0a8 1849 0050 0429 889d 83a4 653c 663f  ...I.P.)....e<f?
        0x0020:  7012 16d0 de30 0000 0204 05b4 0101 0402  p....0..........
21:54:53.826016 IP 192.168.24.73.syscomlan > 192.168.24.62.http: . ack 1 win 65535
        0x0000:  4500 0028 dce1 4000 8006 6c16 c0a8 1849  E..(..@...l....I
        0x0010:  c0a8 183e 0429 0050 653c 663f 889d 83a5  ...>.).Pe<f?....
        0x0020:  5010 ffff 21c5 0000 0000 0000 0000       P...!.........
21:54:53.826292 IP 192.168.24.73.syscomlan > 192.168.24.62.http: P 1:398(397) ack 1 win 65535
        0x0000:  4500 01b5 dce2 4000 8006 6a88 c0a8 1849  E.....@...j....I
        0x0010:  c0a8 183e 0429 0050 653c 663f 889d 83a5  ...>.).Pe<f?....
        0x0020:  5018 ffff 2a19 0000 4745 5420 2f20 4854  P...*...GET./.HT
        0x0030:  5450 2f31 2e31 0d0a 486f 7374 3a20 3139  TP/1.1..Host:.19
        0x0040:  322e 3136 382e 3234 2e36 320d 0a55 7365  2.168.24.62..Use
        0x0050:  722d                                     r-
21:54:53.826776 IP 192.168.24.62.http > 192.168.24.73.syscomlan: . ack 398 win 6432
        0x0000:  4500 0028 19c3 4000 4006 6f35 c0a8 183e  E..(..@.@.o5...>
        0x0010:  c0a8 1849 0050 0429 889d 83a5 653c 67cc  ...I.P.)....e<g.
        0x0020:  5010 1920 0718 0000                      P.......
(省略)

後半でGET./.HTTPといった出力が読み取れます。HTTPリクエストヘッダの出力です。
ですが、表示が切れてしまっていて歯がゆいかんじです。
そんなときは-sオプションを指定します。-sオプションにはキャプチャサイズを指定できます。省略した場合のデフォルトとは96バイトみたい。
ここでは1000バイト指定してみます。

# tcpdump host 192.168.24.73 and port 80 -Xns 1000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 1000 bytes
22:00:31.186721 IP 192.168.24.73.pdps > 192.168.24.62.http: S 3308465474:3308465474(0) win 65535 <mss 1260,nop,nop,sackOK>
        0x0000:  4500 0030 0309 4000 8006 45e7 c0a8 1849  E..0..@...E....I
        0x0010:  c0a8 183e 0522 0050 c533 2d42 0000 0000  ...>.".P.3-B....
        0x0020:  7002 ffff da27 0000 0204 04ec 0101 0402  p....'..........
(省略)
22:00:31.187297 IP 192.168.24.73.pdps > 192.168.24.62.http: P 1:398(397) ack 1 win 65535
        0x0000:  4500 01b5 030b 4000 8006 4460 c0a8 1849  E.....@...D`...I
        0x0010:  c0a8 183e 0522 0050 c533 2d43 9f5b db01  ...>.".P.3-C.[..
        0x0020:  5018 ffff 940a 0000 4745 5420 2f20 4854  P.......GET./.HT
        0x0030:  5450 2f31 2e31 0d0a 486f 7374 3a20 3139  TP/1.1..Host:.19
        0x0040:  322e 3136 382e 3234 2e36 320d 0a55 7365  2.168.24.62..Use
        0x0050:  722d 4167 656e 743a 204d 6f7a 696c 6c61  r-Agent:.Mozilla
        0x0060:  2f35 2e30 2028 5769 6e64 6f77 733b 2055  /5.0.(Windows;.U
        0x0070:  3b20 5769 6e64 6f77 7320 4e54 2035 2e31  ;.Windows.NT.5.1
        0x0080:  3b20 6a61 3b20 7276 3a31 2e39 2e30 2e31  ;.ja;.rv:1.9.0.1
        0x0090:  3829 2047 6563 6b6f 2f32 3031 3030 3230  8).Gecko/2010020
        0x00a0:  3232 3020 4669 7265 666f 782f 332e 302e  220.Firefox/3.0.
        0x00b0:  3138 2028 2e4e 4554 2043 4c52 2033 2e35  18.(.NET.CLR.3.5
        0x00c0:  2e33 3037 3239 290d 0a41 6363 6570 743a  .30729)..Accept:
        0x00d0:  2074 6578 742f 6874 6d6c 2c61 7070 6c69  .text/html,appli
        0x00e0:  6361 7469 6f6e 2f78 6874 6d6c 2b78 6d6c  cation/xhtml+xml
        0x00f0:  2c61 7070 6c69 6361 7469 6f6e 2f78 6d6c  ,application/xml
        0x0100:  3b71 3d30 2e39 2c2a 2f2a 3b71 3d30 2e38  ;q=0.9,*/*;q=0.8
        0x0110:  0d0a 4163 6365 7074 2d4c 616e 6775 6167  ..Accept-Languag
        0x0120:  653a 206a 612c 656e 2d75 733b 713d 302e  e:.ja,en-us;q=0.
        0x0130:  372c 656e 3b71 3d30 2e33 0d0a 4163 6365  7,en;q=0.3..Acce
        0x0140:  7074 2d45 6e63 6f64 696e 673a 2067 7a69  pt-Encoding:.gzi
        0x0150:  702c 6465 666c 6174 650d 0a41 6363 6570  p,deflate..Accep
        0x0160:  742d 4368 6172 7365 743a 2053 6869 6674  t-Charset:.Shift
        0x0170:  5f4a 4953 2c75 7466 2d38 3b71 3d30 2e37  _JIS,utf-8;q=0.7
        0x0180:  2c2a 3b71 3d30 2e37 0d0a 4b65 6570 2d41  ,*;q=0.7..Keep-A
        0x0190:  6c69 7665 3a20 3330 300d 0a43 6f6e 6e65  live:.300..Conne
        0x01a0:  6374 696f 6e3a 206b 6565 702d 616c 6976  ction:.keep-aliv
        0x01b0:  650d 0a0d 0a                             e....
22:00:31.187325 IP 192.168.24.62.http > 192.168.24.73.pdps: . ack 398 win 6432
        0x0000:  4500 0028 1b72 4000 4006 6d86 c0a8 183e  E..(.r@.@.m....>
        0x0010:  c0a8 1849 0050 0522 9f5b db01 c533 2ed0  ...I.P.".[...3..
        0x0020:  5010 1920 7109 0000                      P...q...
22:00:31.190546 IP 192.168.24.62.http > 192.168.24.73.pdps: P 1:353(352) ack 398 win 6432
        0x0000:  4500 0188 1b73 4000 4006 6c25 c0a8 183e  E....s@.@.l%...>
        0x0010:  c0a8 1849 0050 0522 9f5b db01 c533 2ed0  ...I.P.".[...3..
        0x0020:  5018 1920 cd9d 0000 4854 5450 2f31 2e31  P.......HTTP/1.1
        0x0030:  2032 3030 204f 4b0d 0a44 6174 653a 204d  .200.OK..Date:.M
        0x0040:  6f6e 2c20 3232 2046 6562 2032 3031 3020  on,.22.Feb.2010.
        0x0050:  3133 3a30 303a 3331 2047 4d54 0d0a 5365  13:00:31.GMT..Se
        0x0060:  7276 6572 3a20 4170 6163 6865 2f32 2e32  rver:.Apache/2.2
        0x0070:  2e33 2028 4365 6e74 4f53 290d 0a4c 6173  .3.(CentOS)..Las
        0x0080:  742d 4d6f 6469 6669 6564 3a20 4d6f 6e2c  t-Modified:.Mon,
        0x0090:  2032 3220 4665 6220 3230 3130 2031 323a  .22.Feb.2010.12:
        0x00a0:  3237 3a34 3920 474d 540d 0a45 5461 673a  27:49.GMT..ETag:
        0x00b0:  2022 3161 6634 642d 3562 2d38 6661 6164  ."1af4d-5b-8faad
        0x00c0:  6234 3022 0d0a 4163 6365 7074 2d52 616e  b40"..Accept-Ran
        0x00d0:  6765 733a 2062 7974 6573 0d0a 436f 6e74  ges:.bytes..Cont
        0x00e0:  656e 742d 4c65 6e67 7468 3a20 3931 0d0a  ent-Length:.91..
        0x00f0:  436f 6e6e 6563 7469 6f6e 3a20 636c 6f73  Connection:.clos
        0x0100:  650d 0a43 6f6e 7465 6e74 2d54 7970 653a  e..Content-Type:
        0x0110:  2074 6578 742f 6874 6d6c 3b20 6368 6172  .text/html;.char
        0x0120:  7365 743d 5554 462d 380d 0a0d 0a3c 6874  set=UTF-8....<ht
        0x0130:  6d6c 3e0a 3c68 6561 643e 0a3c 7469 746c  ml>.<head>.<titl
        0x0140:  653e 7465 7374 2070 6167 6520 7469 746c  e>test.page.titl
        0x0150:  653c 2f74 6974 6c65 3e0a 3c2f 6865 6164  e</title>.</head
        0x0160:  3e0a 3c62 6f64 793e 0a74 6573 7420 7061  >.<body>.test.pa
        0x0170:  6765 2064 6174 610a 3c2f 626f 6479 3e0a  ge.data.</body>.
        0x0180:  3c2f 6874 6d6c 3e0a                      </html>.
(省略)

とすると、HTTPリクエスト、レスポンスの通信データが確認できます。

補足

まだ試していないですが、-wオプションとか熱いみたい。

6つ目が-wです。tcpdumpは、受信したパケットを解析し、解析結果を人間が確認しやすい書式に整形して出力します。しかし、-wオプションを指定するとtcpdumpは解析を行わずに受信したパケットの情報をそのまま書き出します。[-w ]の形式で、出力するファイルをに指定します。-wオプションを指定して取得したパケット情報は、 Wiresharkhttp://www.wireshark.org/)などのGUIベースのプログラムでも読み込むことができます。そのため、パケットの収集のみtcpdumpで行い、解析などそれ以外の作業はGUIで行うと言った使い方もできます。
http://thinkit.jp/article/721/1/

パケット収集のみtcpdumpで行い、Wiresharkを使って解析を行うのが便利っぽい。