通信内容をわかりやすくキャプチャできるngrep | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

だいぶ古いコマンドみたいなんですが、結構便利なので。


ngrepは、サーバーに対して通信した情報をわかりやすくキャプチャしてくれるコマンドです。

こういうのって、クライアントサイドで可視化してくれるツールはあったりもしますが(FireBugとか)、サーバーサイドで動かした方が便利であったり、取れない情報もあったりしますので、場合によってはかなり便利に使えると思います。


見え方はこんな感じ。


T 192.168.0.1:80 -> 192.168.0.2:1978 [A]
HTTP/1.1 200 OK.
Date: Wed, 18 Nov 2009 15:34:44 GMT.
Server: Apache/2.2.3 (CentOS).
Last-Modified: Tue, 26 Aug 2008 15:20:20 GMT.
ETag: "3954c06-4486-711f3500".
Accept-Ranges: bytes.
Content-Length: 17542.
Connection: close.
Content-Type: text/plain.
.

HTTPの通信に限らず、色んなパケットをキャプチャできます。



ngrepのインストール


まずは、ソースをダウンロード し、サーバー内で展開します。

後は、お決まりの呪文でとりあえずいけるかと。

私の環境では、関連するライブラリが不足していたため、configureでエラーがでましたが、それをインストールすることで回避できました。(後述のおまけ参照)


# tar -jxvf ngrep-1.45.tar.bz2

# ./configure

# make

# make install


ngrepを使ってみる


幾つかオプションがありますが、基本的な使い方は下記のような感じになります。


# ngrep -W byline 'HTTP' -q

行単位で出力するようにし(-W bylineオプション)、キャプチャしたパケットの中身をみてHTTPのものだけを表示し('HTTP'で指定)、関係ないものを表示しなく(-qオプション)しています。


この他にも


# ngrep -W byline -q port 80

とすることで、80番ポートの通信だけを見てみたり、


# ngrep -W byline 'HTTP' -q -d eth0

とすることで、eth0のNICの通信だけを対象にして見てみたりすることもできます。


また、POSTしてきた内容を見ることもできますので、デバッグしてみたりという用途にも便利です。

例えば、テキストボックスからデータを送信したときのパケットをキャプチャしてみると、


T 192.168.0.2:2458 -> 192.168.0.1:80 [AP]
GET /hoge/form.html HTTP/1.1.
Host: 192.168.0.1.
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729).
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.
Accept-Language: ja,en-us;q=0.7,en;q=0.3.
Accept-Encoding: gzip,deflate.
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7.
Keep-Alive: 300.
Connection: keep-alive.
If-Modified-Since: Wed, 18 Nov 2009 15:33:50 GMT.
If-None-Match: "1e7c008-93-f8263380".
.

T 192.168.0.2:2460 -> 192.168.0.1:80 [AP]
POST /hoge/post.php HTTP/1.1.
Host: 192.168.0.1.
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729).
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.
Accept-Language: ja,en-us;q=0.7,en;q=0.3.
Accept-Encoding: gzip,deflate.
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7.
Keep-Alive: 300.
Connection: keep-alive.
Referer: http://192.168.0.1/hoge/form.html.
Content-Type
: application/x-www-form-urlencoded.
Content-Length: 51.
.
form1=%E3%81%BB%E3%81%92%E3%81%BB%E3%81%92%EF%BD%9E

T 192.168.0.1:80 -> 192.168.0.2:2460 [AP]
HTTP/1.1 200 OK.
Date: Wed, 18 Nov 2009 15:58:27 GMT.
Server: Apache/2.2.3 (CentOS).
X-Powered-By: PHP/5.1.6.
Content-Length: 15.
Connection: close.
Content-Type: text/html.
.


というような通信内容が見れます。(POSTした内容はエンコードされてますけどね)


おまけ - インストール時のエラーの対処 -


configure時に、下記のようなエラーが出ました。


# ./configure
-snip-
checking for a broken redhat glibc udphdr declaration... no
checking for a complete set of pcap headers... no
!!! couldn't find a complete set of pcap headers

原因は、下記の関連するライブラリが無かったためで、yumでインストールし再度configureしなおしてみると上手くいきました。


libpcap
libpcap-devel