前へ << telnet の際の注意点 | TCP/IP と OSI 参照モデル >> 次へ |
「Netscape Navigator は今どういう HTTP プロトコルを送っているのかな」 とか「POP3 サーバはどういうレスポンスを返しているのだろうか」 と思ったことはありませんか? 「それさえわかれば楽にプロトコルを理解できるのに…」。 そういうときは tcpdump を使って調べることができます。
以下の説明の一部(カーネル再構築など)は FreeBSD に特化した 内容になっていますが、オプション類などは他の UNIX でも 参考になるでしょう。
tcpdump は bpfilter という疑似デバイスを使って パケットの内容を表示します。GENERIC カーネルには bpfilter は含まれていないので、カーネルの再構築が必要です。 ここでは細かい説明はしませんが、カーネルコンフィギュレーションに
pseudo-device bpfilter 4を加えて、カーネルの再構築をしてください。例えば以下のような感じになります。
# cd /usr/src/sys/i386/conf/ (カーネルコンフィグのディレクトリに移動) # cp GENERIC mykernel (新しいカーネルコンフィグを作成) # echo "pseudo-device bpfilter 4" >> mykernel # config mykernel (コンフィグファイルにあったMakefileを作成) # cd ../../mykernel (コンパイルディレクトリに移動) # make depend (依存関係チェック) # make (カーネル再構築) # make install (/kernelの置き換え)カーネルの更新ができたら、リブートします。
% telnet localhost echo Trying 127.0.0.1... flushoutput character is 'off'. Connected to localhost. Escape character is '^]'.一方、別ウィンドウで root になって、
# tcpdump -l -s 1600 -x -i lo0と tcpdump を実行します。では先程の telnet で何か 適当に文字を打ってください。すると tcpdump は
09:51:42.562095 localhost.miteksys-lm > localhost.echo: P 1:7(6) ack 1 win 57344と表示します。これがパケットの情報と内容です。(DF) [tos 0x10] 4510 0042 5c5a 4000 4006 e049 7f00 0001 7f00 0001 05ca 0007 0248 8030 0249 a535 a018 e000 85de 0000 0101 080a 0001 5ffd 0001 5fea 0101 0b06 0000 0229 7465 7374 0d0a 09:51:42.562533 localhost.echo > localhost.miteksys-lm: P 1:23(22) ack 7 win 57344 (DF) 4500 0052 5c5b 4000 4006 e048 7f00 0001 7f00 0001 0007 05ca 0249 a535 0248 8036 a018 e000 b4ad 0000 0101 080a 0001 5ffd 0001 5ffd 0101 0b06 0000 022a 6f72 6967 696e 616c 2065 6368 6f64 3a20 7465 7374 0d0a 09:51:42.568522 localhost.miteksys-lm > localhost.echo: . ack 23 win 57322 (DF) [tos 0x10] 4510 003c 5c5c 4000 4006 e04d 7f00 0001 7f00 0001 05ca 0007 0248 8036 0249 a54b a010 dfea 7ab7 0000 0101 080a 0001 5ffd 0001 5ffd 0101 0b06 0000 0229
localhost の miteksys-lm ポートから localhost の echo ポートへ、 それに対するレスポンス、さらにもう一度 echo ポートへ、という 3つのパケットが流れたことがわかります。なぜ miteksys-lm と 表示されているのかというと、/etc/services に
miteksys-lm 1482/tcp #Miteksys License Managerと書いてあるからです。echo クライアント (telnet) はたまたま ポート 1482 番を割り当てられたのですが、tcpdump が /etc/services を 参照して miteksys-lm という表示をしたのでしょう。
1: #!/usr/local/bin/perl 2: 3: # $Id: tcpdump-filter.pl,v 1.2 2002/02/17 11:07:28 68user Exp $ 4: 5: while(<STDIN>){ 6: if(m/^[ \t]/){ 7: $store .= $_ 8: } else { 9: s/^[^ ]* //; 10: s/:[^:]*$//; 11: print "$_\n"; 12: $_ = $store; 13: s/\s//g; 14: s/^.{120}//; 15: s/[0-9A-Fa-f][0-9A-Fa-f]/pack("C", hex $&)/eg; 16: s/[\x00-\x08\x0a-\x1f\x7f-\xff]/ /g; 17: print "$_\n"; 18: $store = ""; 19: } 20: }このスクリプトを使うと、
# tcpdump -l -s 1600 -x -i lo0 | tcpdump-filter.pl localhost.miteksys-lm > localhost.echo: P 38305852 localhost.echo > localhost.miteksys-lm: P 1 data localhost.miteksys-lm > localhost.echo my echod: dataという見やすい形式に変換されます。
しかし少なくとも tcpdump-3.8 にはデータを ASCII 表示する -X オプションがありますので、 まずはこれを試してみるのがよいでしょう。例えば web サーバに
GET / HTTP/1.0というデータを送信したときの出力は以下のようになります。
# tcpdump -s 1600 -X -i lo0 07:09:41.140676 localhost.49372 > localhost.http: P 1:17(16) ack 1 win 35840 (略) 0x0000 4510 0044 4ba3 4000 4006 f0fe 7f00 0001 E..DK.@.@....... 0x0010 7f00 0001 c0dc 0050 6205 e642 4076 0ccc .......Pb..B@v.. 0x0020 8018 8c00 f622 0000 0101 080a 00ad 6734 ....."........g4 0x0030 00ad 65a4 4745 5420 2f20 4854 5450 2f31 ..e.GET./.HTTP/1 0x0040 2e30 0d0a .0..IP データグラム部分も表示されてしまうので慣れないうちはわかりづらいですが、 これで十分な場合も多いでしょう。
# tcpdump -l -s 1600 -x -i lo0 port http | tcpdump-filter.plまた、SMTP クライアントの送るデータだけを見たいなら (SMTP サーバのレスポンスは必要ないなら)、
# tcpdump -l -s 1600 -x -i lo0 dst port smtp | tcpdump-filter.pl逆に SMTP サーバのレスポンスだけを見たいなら、
# tcpdump -l -s 1600 -x -i lo0 src port smtp | tcpdump-filter.plなどと色々指定できます。オプションの意味は以下の通り。
tcpdump は、使い方次第では非常に危険なツールになります。 真面目な目的でモニタリングするつもりでも、 他人の見てはいけないデータを誤って見てしまうこともありえます。 慎重に使うようにしてください。
前へ << telnet の際の注意点 | TCP/IP と OSI 参照モデル >> 次へ |
ご意見・ご指摘は Twitter: @68user までお願いします。