Skip to content

Latest commit

 

History

History
238 lines (170 loc) · 9.9 KB

README.JP.md

File metadata and controls

238 lines (170 loc) · 9.9 KB

tcpeek

はじめに

tcpeek(てぃーしーぴーく)は、TCPのセッション確立(3way ハンドシェイク)時に発生するエラーを監視・集計するネットワークモニタです。

以下のような機能があります。

エラー検出

接続に失敗した TCP セッションを集計できます

  • RST により接続拒否されたセッションをカウントします
  • ICMP Unreach により到達不能を検出したセッションをカウントします
  • 接続がタイムアウトしたセッションをカウントします

再送検出

再送が発生した TCP セッションを集計できます

  • SYN セグメントの再送が発生したセッションをカウントします
  • SYN/ACK セグメントの再送が発生したセッションをカウントします

フィルタ

フィルタを指定して個別に集計できます

  • 通信方向・IPアドレス・ポート番号の組合わせでフィルタを指定します
  • 複数のフィルタを指定できます
  • ※ ただしこのポートは除く、といったフィルタも指定できます

データ出力

集計したデータを UNIX ドメインソケット経由で出力します

  • スクリプトで扱いやすい JSON 形式で出力します
  • Ganglia の gmetric 経由で rrd を出力するためのスクリプト(tcpeekstat)が付属しています

インストール方法

$ git clone git://github.com/pandax381/tcpeek.git
$ cd tcpeek
$ ./configure
$ make
$ sudo make install

使い方

usage: tcpeek [option]... [expression]...
  option:
    -u --user=uid         # 指定したuserにsetuidして動作します
    -i --interface=dev    # インターフェース名を指定します(例:eth0)
    -U --socket=path      # UNIXドメインソケットのパスを指定します (デフォルト:/var/run/tcpeek/tcpeek.sock)
    -c --checksum=[0|1|2] # チェックサムの検証モードを指定します 0=検証なし 1=IPヘッダのみ 2=IPヘッダ+TCPヘッダ(デフォルト:0)
    -t --timeout=sec      # セッションのタイムアウト時間(デフォルト:60)
    -B --buffer           # libpcapのバッファサイズをMB単位で指定します(デフォルト:2)
    -l --loglevel=LEVEL   # SYSLOGレベル(デフォルト:LOG_NOTICE)※ 現状は機能していないです
    -q --quiet            # このオプションを指定すると、リアルタイムのセッション情報出力を抑制します
       --promisc          # このオプションを指定すると、プロミスキャスモードで動作します
       --icmp             # このオプションを指定すると、ICMP 到達不能メッセージを解釈するようになります
    -h --help             # ヘルプを表示して終了します
    -v --version          # バージョンを表示して終了します
  expression:
    [filter]:dir@addr:port[:port...][,...]
  example) '%' is the same as wildcard '*'
    tcpeek -i eth0 filter:RX@%:80:443
    tcpeek -i eth0 filter:[email protected]/24:%
    tcpeek -i eth0 filter1:RX@%:80:443 filter2:[email protected]/24:%

-i オプションでインターフェースだけ指定すればとりあえず動きます(デフォルトで RX:RX@*:*TX:TX@*:* のフィルタが指定されています)。

$ sudo ./tcpeek -i eth0

expression の指定方法が少し複雑ですが、以下のように指定します。

フィルタ名:通信方向(RX|TX)@IPアドレス:ポート番号

  • フィルタは複数指定できます。

    filter1:[email protected]:80 filter2:[email protected]:80

  • IPアドレスとポート番号は % でワールドカードが指定できます。

    filter:TX@%:%

  • IPアドレスにはネットワークアドレスも指定できます。

    filter:[email protected]/24:%

  • ポート番号は : 区切りで複数指定できます。

    filter:[email protected]:80:443:8080

  • IPアドレスとポート番号の組合わせは , 区切りで複数指定できます。

    filter:[email protected]:80:443:8080,192.168.0.2:80,192.168.0.3:80:8080

  • フィルタ名を省略すると除外フィルタとなり、条件にマッチするセッションは全てのフィルタに記録されません(記述順は関係ありません)。

    :RX@*:22 :TX@*:22

複数のフィルタにマッチするセッションは、該当する全てのフィルタにて集計されます

結果出力

tcpeekを実行すると、標準エラーへTCPセッションの情報がリアルタイムで出力されます。

$ sudo ./tcpeek -i eth0
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

 TIME(s) |       TIMESTAMP       |      SRC IP:PORT            DST IP:PORT     |      RESULTS      | DUP SYN  DUP S/A
----------------------------------------------------------------------------------------------------------------------
   0.002 | 12-07-06 16:39:02.552 |   192.168.2.227:48967   192.168.2.202:80    |      success      |       0        0 
   0.002 | 12-07-06 16:39:02.559 |   192.168.2.227:48968   192.168.2.202:80    |      success      |       0        0 
   0.002 | 12-07-06 16:39:11.219 |   192.168.2.227:42031   192.168.2.202:443   |      success      |       0        0 
   0.002 | 12-07-06 16:39:11.273 |   192.168.2.227:48970   192.168.2.202:80    |      success      |       0        0 
   0.002 | 12-07-06 16:39:11.279 |   192.168.2.227:42033   192.168.2.202:443   |      success      |       0        0 
   0.002 | 12-07-06 16:39:11.309 |   192.168.2.227:48972   192.168.2.202:80    |      success      |       0        0 
   0.002 | 12-07-06 16:39:11.323 |   192.168.2.227:42035   192.168.2.202:443   |      success      |       0        0 
   0.001 | 12-07-06 16:39:11.354 |   192.168.2.227:42036   192.168.2.202:443   |      success      |       0        0 
   0.002 | 12-07-06 16:39:11.385 |   192.168.2.227:42037   192.168.2.202:443   |      success      |       0        0 
   0.001 | 12-07-06 16:39:36.254 |   192.168.2.228:62876   192.168.2.227:80    | failure (reject)  |       0        0 
   0.000 | 12-07-06 16:39:38.160 |   192.168.2.228:62877   192.168.2.227:80    | failure (reject)  |       0        0 
   0.000 | 12-07-06 16:39:44.689 |   192.168.2.227:56371   192.168.2.228:8080  | failure (reject)  |       0        0
  39.947 | 12-07-06 16:41:29.723 |   192.168.2.227:58376   192.168.2.207:8080  | failure (timeout) |       2        0   
  • TIME(s)

    TCPセッションの確立(3wayハンドシェイク)に掛かった時間(秒)

  • TIMESTAMP

    TCPセッションが開始された時刻

  • SRC IP:PORT

    TCPセッションの始端(クライアント)のIPアドレスとポート番号

  • DST IP:PORT

    TCPセッションの終端(サーバ)のIPアドレスとポート番号

  • RESULTS

    TCPセッションの確立可否

  • DUP SYN

    SYNセグメントが再送された回数(再送が発生していなければ 0)

  • DUP S/A

    SYN/ACKセグメントが再送された回数(再送が発生していなければ 0)

統計出力

Ctrl+C にて、上記の統計情報を出力して終了します。

========== TCPEEK SUMMARY ==========
     from : 2012-07-02 16:48:33      # 集計開始時刻
       to : 2012-07-02 16:49:59      # 集計終了時刻
     time :        86.106 (sec)      # 集計時間(秒)
------------------------------------
 RX                                  # フィルタ名
   Success: 0 session                # 3wayハンドシェイクが成功したセッション数
     SYN Segment Duplicate :      0  # SYNセグメントの再送が発生したセッション数
     S/A Segment Duplicate :      0  # SYN/ACKセグメントの再送が発生したセッション数
   Failure: 10 session               # 3wayハンドシェイクが失敗したセッション数
     Connection Timed Out  :      0  # 接続がタイムアウトしたセッション数
     Connection Rejected   :     10  # 接続が拒否されたセッション数
------------------------------------
 TX
   Success: 783 session
     SYN Segment Duplicate :      0
     S/A Segment Duplicate :      0
   Failure: 0 session
     Connection Timed Out  :      0
     Connection Rejected   :      0
------------------------------------
 http-rx
   Success: 0 session
     SYN Segment Duplicate :      0
     S/A Segment Duplicate :      0
   Failure: 10 session
     Connection Timed Out  :      0
     Connection Rejected   :     10
------------------------------------
 http-tx
   Success: 767 session
     SYN Segment Duplicate :      0
     S/A Segment Duplicate :      0
   Failure: 0 session
     Connection Timed Out  :      0
     Connection Rejected   :      0
====================================

この統計情報は、後述する tcpeekstat コマンドを使うことで、tcpeek の実行中にも取得できます。

tcpeekstat

usage: tcpeekstat [OPTION]
  [OPTION]
    -g  --gmetric      # exec gmetric
    -U  --socket=path  # unix domain socket (default: /var/run/tcpeek/tcpeek.sock)
    -v  --version      # version
    -h  --help         # help

tcpeekstat を実行すると、動作中の tcpeek から統計情報を取得できます。

$ sudo ./tcpeekstat

-g オプションを付けて実行すると、Ganglia の gmetric コマンド経由で rrd を出力します。

$ sudo ./tcpeekstat -g

-g オプションなしの場合は起動時からの累計、-g オプションありの場合は「前回 -g オプションつきで実行したタイミング」からの差分を出力します

注意事項

libpcap がインストールされている必要があります(libpcapは最新版の仕様をおすすめします http://www.tcpdump.org/#latest-release)。

このソフトウェアを使用して発生したいかなる損害についても作者は責任を負いません。