それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

10分で僕にも出来た。tcpdump でパケットをのぞき見る方法まとめ。

TCPDumpをつかってLDAPをDumpしてみた

準備

apt 一発で入る

aptitude install tcpdump

まずは実行

sudo tcpdump
7:31:52.063902 IP 192.168.11.2.50088 > sys-watch.local.ssh: . ack 9395940 win 30284
17:31:52.064041 IP sys-watch.local.ssh > 192.168.11.2.50088: P 9406776:9407004(228) ack 45101 win 8576
17:31:52.064145 IP sys-watch.local.ssh > 192.168.11.2.50088: P 9407004:9407152(148) ack 45101 win 8576
17:31:52.064149 IP 192.168.11.2.50088 > sys-watch.local.ssh: . ack 9396316 win 29908
17:31:52.064302 IP sys-watch.local.ssh > 192.168.11.2.50088: P 9407152:9407380(228) ack 45101 win 8576
17:31:52.064400 IP 192.168.11.2.50088 > sys-watch.local.ssh: . ack 9396692 win 29532
17:31:52.064419 IP sys-watch.local.ssh > 192.168.11.2.50088: P 9407380:9407528(148) ack 45101 win 8576
17:31:52.064555 IP sys-watch.local.ssh > 192.168.11.2.50088: P 9407528:9407756(228) ack 45101 win 8576
17:31:52.064655 IP sys-watch.local.ssh > 192.168.11.2.50088: P 9407756:9407904(148) ack 45101 win 8576
17:31:52.064666 IP 192.168.11.2.50088 > sys-watch.local.ssh: . ack 9397068 win 30660
17:31:52.064815 IP sys-watch.local.ssh > 192.168.11.2.50088: P 9407904:9408132(228) ack 45101 win 8576
17:31:52.064914 IP 192.168.11.2.50088 > sys-watch.local.ssh: . ack 9397444 win 30284
17:31:52.064933 IP sys-watch.local.ssh > 192.168.11.2.50088: P 9408132:9408232(100) ack 45101 win 8576
17:31:52.065179 IP 192.168.11.2.50088 > sys-watch.local.ssh: P 45101:45153(52) ack 9397656 wCn 30072^

うががががーーってたくさん出る。LAN上に流れるパケットが見える。SSHで接続しているので、無限ループ。

とまらないtcpdump
  1. パケットをキャプチャして表示
  2. 流れるパケットをSSH経由でPuttyに送る。
  3. 送り出したパケットキャプチャ
  4. キャプチャしたパケットを表示させる
  5. その送り出したパケットキャプチャ
  6. そのキャプチャしたパケットを表示させる
  7. その送り出したパケットキャプチャ
  8. そのキャプチャしたパケットを表示させる
  9. その送り出したパケットキャプチャ
  10. そのキャプチャしたパケットを表示させる

...以下無限

他にもブロードキャストやらなんやら、何でも見える。スイッチハブってそうなんだ。って実感。

ヘッダ情報が見えてる。

ヘッダ情報を見ています。パケットの中身は省略されています。→ココ重要。

17:31:52.064914 IP 192.168.11.2.50088 > sys-watch.local.ssh: . ack 9397444 win 30284
17:31:52.064933 IP sys-watch.local.ssh > 192.168.11.2.50088: P 9408132:9408232(100) ack 45101 win 8576
17:31:52.065179 IP 192.168.11.2.50088 > sys-watch.local.ssh: P 45101:45153(52) ack 9397656 wCn 30072^

表示されたのは、これらは、ヘッダ情報です。

  • いつ
  • どこから
  • どこへ
  • どんなパケットか(応答か新規か、順番は。サイズは。。)

を表すのがヘッダ情報。

  • ナニを送った

のかを知るのは、中身を表示するオプションを使います。

多すぎて使い物にならないのでフィルタをかける。

tcpdumpでログを取っておいて後で集計が出来ることが分かった。
ログを取っておくには素晴らしく良いんだ。けど、パケットを見て作業をしたい。これだと多すぎて死にそう・・・パケット多すぎて目が疲れるしナニがなにやら分からない。パケ死です。

注意点:tcpdumpでハマるところ。

複数起動できません。

1つのInterfaceに1つだけです。1つだけなんです。当たり前だけどハマります。Dumpしてメッセージ出てこないから「条件おかしかった?」と考える前に他にTCPDUMPしてないか調べることも忘れずに・・・・複数起動で警告してくれりゃぁ良いのに。

なんか出来た。あれー昔は出来なかったと思ってたけど・・・2年前のメモにそう書いてた。今試したら出来ました。

http ポートだけに限定する。
sudo tcpdump port http

やってみた

takuya@sys-watch:~$ sudo tcpdump port http
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
17:36:18.231533 IP 9231D5DF89.local.zebrasrv > sys-watch.local.www: P 930:1424(494) ack 999 win 64537
17:36:18.232184 IP sys-watch.local.www > 9231D5DF89.local.zebrasrv: P 999:1429(430) ack 1424 win 8576
17:36:18.253826 IP 9231D5DF89.local.zebrasrv > sys-watch.local.www: P 1424:1961(537) ack 1429 win 64107
17:36:18.254467 IP sys-watch.local.www > 9231D5DF89.local.zebrasrv: P 1429:1996(567) ack 1961 win 9666
17:36:18.439558 IP 9231D5DF89.local.zebrasrv > sys-watch.local.www: . ack 1996 win 65535
17:36:18.758964 IP 9231D5DF89.local.zebrasrv > sys-watch.local.www: P 1961:2455(494) ack 1996 win 65535
17:36:18.759466 IP sys-watch.local.www > 9231D5DF89.local.zebrasrv: P 1996:2426(430) ack 2455 win 10740
17:36:18.784589 IP 9231D5DF89.local.zebrasrv > sys-watch.local.www: P 2455:2992(537) ack 2426 win 65105
17:36:18.785191 IP sys-watch.local.www > 9231D5DF89.local.zebrasrv: P 2426:2993(567) ack 2992 win 11814
17:36:18.947316 IP 9231D5DF89.local.zebrasrv > sys-watch.local.www: . ack 2993 win 64538
17:36:29.700884 IP m4-219-112-246-198.mixi.jp.www > sys-watch.local.42253: . 1:1381(1380) ack 96 win 12
17:36:33.889740 IP sys-watch.local.www > 9231D5DF89.local.zebrasrv: . ack 2993 win 11814
...(適当に省略)
SRC/DISTを指定する。

自ホスト発でHTTPのパケットだけに限定する。条件をANDでつなぎます(後で例が出てきます。

パケットの中身も表示する。

オプションを使えば パケットの中身を表示して、ASCII文字を可能な限りASCII文字で表示しようとしてくれます。

-X 16 進表示されるときに、 ASCII 文字も表示する。従って、 -x オプションもセットされると、パケットは 16 進と ASCII 文字の両方で表示 される。これは新しいプロトコルを解析するときに非常に便利である。 -x オプションが設定されていなくても、パケットの部分によっては 16 進と ASCII 文字の両方で表示されることもある。
man tcpdumpより

やってみた

takuya@sys-watch:~$ sudo tcpdump port http -X
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
17:47:39.736416 IP sys-watch.local.53739 > m4-219-112-246-198.mixi.jp.www: S 2630664552:2630664552(0) win 5840 <mss 1460,sackOK,timestamp 39019
6524 0,nop,wscale 5>
        0x0000:  4500 003c 2c44 4000 4006 708d c0a8 0b0b  E..<,D@.@.p.....
        0x0010:  db70 f6c6 d1eb 0050 9ccc c168 0000 0000  .p.....P...h....
        0x0020:  a002 16d0 5e68 0000 0204 05b4 0402 080a  ....^h..........
        0x0030:  1741 ed2c 0000 0000 0103 0305            .A.,........
17:47:39.749840 IP m4-219-112-246-198.mixi.jp.www > sys-watch.local.53739: S 2610186715:2610186715(0) ack 2630664553 win 5840 <mss 1460,nop,nop
,sackOK,nop,wscale 9>
        0x0000:  4500 0034 0000 4000 3306 a9d9 db70 f6c6  E..4..@.3....p..
        0x0010:  c0a8 0b0b 0050 d1eb 9b94 49db 9ccc c169  .....P....I....i
        0x0020:  8012 16d0 a462 0000 0204 05b4 0101 0402  .....b..........
        0x0030:  0103 0309                                ....
17:47:39.749861 IP sys-watch.local.53739 > m4-219-112-246-198.mixi.jp.www: . ack 1 win 183
        0x0000:  4500 0028 2c45 4000 4006 70a0 c0a8 0b0b  E..(,E@.@.p.....
        0x0010:  db70 f6c6 d1eb 0050 9ccc c169 9b94 49dc  .p.....P...i..I.
        0x0020:  5010 00b7 fb4f 0000                      P....O..
17:47:39.749932 IP sys-watch.local.53739 > m4-219-112-246-198.mixi.jp.www: P 1:96(95) ack 1 win 183
        0x0000:  4500 0087 2c46 4000 4006 7040 c0a8 0b0b  E...,F@.@.p@....
        0x0010:  db70 f6c6 d1eb 0050 9ccc c169 9b94 49dc  .p.....P...i..I.
        0x0020:  5018 00b7 9e64 0000 4745 5420 2f20 4854  P....d..GET./.HT
        0x0030:  5450 2f31 2e30 0d0a 5573 6572 2d41 6765  TP/1.0..User-Age #UA が見える
        0x0040:  6e74 3a20 5767 6574 2f31 2e31 312e 340d  nt:.Wget/1.11.4.

便利そうなオプションのまとめ

man tcpdump を除いてみて便利そうなものを抜粋

見やすくするもの
  • -n アドレス(ホストアドレス、ポート番号など)を名前に変換しない。
  • -t ダンプ行に時間情報を表示しない。
  • -X 16 進表示されるときに、 ASCII 文字も表示する。
  • -i interface を監視する。指示のない場合は tcpdump はシステムの番号の小さい順
ログファイルを扱う系
  • -w パケットを解析、表示するかわりに生のまま file に書き出す。
  • -r パケットを(-w オプションで作成した)fileから読み込む。'-'は標準入力

中身が全部表示されないので、パケットの中身を全部見てみる。

転送されたHTMLを中身を見ようとしたら途中で切れてた。HTMLを全部表示したいとか。比較的大きいパケットを見る場合

 -s オプションをつける

やってみた

sudo tcpdump -X -s 5120 port http
#中略
        0x02f0:  2f74 723e 2729 3b0d 0a64 6f63 756d 656e  /tr>');..documen
        0x0300:  742e 7772 6974 6528 273c 2f54 4142 4c45  t.write('</TABLE
        0x0310:  3e27 293b 0d0a 646f 6375 6d65 6e74 2e77  >');..document.w
        0x0320:  7269 7465 2827 3c2f 666f 726d 3e27 293b  rite('</form>');
        0x0330:  0d0a 3c2f 7363 7269 7074 3e0d 0a3c 6e6f  ..</script>..<no
        0x0340:  7363 7269 7074 3e0d 0a3c 424f 4459 2062  script>..<BODY.b
        0x0350:  6763 6f6c 6f72 3d22 2366 6666 6666 6622  gcolor="#ffffff"
        0x0360:  2074 6578 743d 2223 3230 3237 3562 2220  .text="#20275b".
        0x0370:  6c65 6674 6d61 7267 696e 3d22 3022 2074  leftmargin="0".t
        0x0380:  6f70 6d61 7267 696e 3d22 3022 3e0d 0a82  opmargin="0">...
        0x0390:  b182 cc83 7583 8983 4583 5582 f08a 4a82  ....u...E.U...J.
        0x03a0:  ad82 c982 cd4a 6176 6153 6372 6970 7482  .....JavaScript.
        0x03b0:  f097 4c8c f882 c982 b782 e995 4b97 7682  ..L.........K.v.
        0x03c0:  aa82 b282 b482 a282 dc82 b781 420d 0a3c  ............B..<
        0x03d0:  2f6e 6f73 6372 6970 743e 0d0a 3c2f 424f  /noscript>..</BO
        0x03e0:  4459 3e0d 0a3c 2f68 746d 6c3e 0d0a       DY>..</html>..
19:14:06.372837 IP sys-watch.local.38085 > ..www: . ack 3015 win 11264
        0x0000:  4500 0028 de07 4000 4006 c56b c0a8 0b0b  E..(..@.@..k....
        0x0010:  c0a8 0b01 94c5 0050 8bd4 6898 0000 35d1  .......P..h...5.
        0x0020:  5010 2c00 2d24 0000                      P.,.-$..
19:14:06.526104 IP ..www > sys-watch.local.38085: F 3015:3015(0) ack 101 win 6000
#以下略

ちゃんと見えた。

出力をフィルタリングする。

そのまま使うことはないけど、tcpdump -w ログファイルをとり、その後に解析するときに便利だ。

条件をANDでつなげる
  • and でつなげて複数条件を書くことが出来る。
  • or でつなげて複数条件を並列することが出来る。
tcpdump -n "src 192.168.11.11 and dst ( 192.168.11.9 or 192.168.11.1 )"

フィルタリングの内容は()などBashがつかう記号と被るので""などを書くと便利

2017-09-05 追記 tcpdump でパケット見えない・・・

現象1 なんかパケット見えない!!って事があったので、いろいろ考えたら、名前解決がタイムアウト待ちでパケットがリアルタイムに表示されてなかった

tcpdump -n 
  • n のオプションを付け忘れると、パケットがすぐに表示されないのでパケットが届いてるか見るときには -nを付け忘れないようにした方がいい。

パケットの中身を解析するときには -n は無くても動くので忘れがち。疎通確認に使うなら -n を忘れないようにしたい。

現象2 -i を付けないと見えない。

tcpdump -i enp0s1

NIC device 指定をしないとキャプチャするデバイスが自動で取得される。なのでデバイスをちゃんと見れないことが有るので注意したい

とりあえず、全部見たいときは anyすること!

tcpdump -i any

ネットワークデバイスの指定をしないときは any しておくべきだと思う。