Blog ブログ
パケットみえますかー
どうも、CCS田中でございます。
帰り道で鹿を見かけては「ふへい!」と運転の手をとられる日々でございます。
あれはー、突っ込んでこられたらー、まじであかんよー。
お題
今回、今までと違うログの内容を取り扱います。
何のログかと言いますと…
「ネットワークのパケットをキャプチャしたログ」です (デデーン)
どんなデータが流れているのか、楽しみですね。
それでは、早速行ってみましょう。
通信データの中身を見る
普段、何気なくWebブラウザを利用して検索を行ったり、コミットを行ったりしておりますが、操作の裏には様々なパケットが流れております。Webブラウザで閲覧しているページ, ゲームの通信内容, 各アプリケーションの通信等… 様々な種類のデータが各機器に的確に割り当てられて、流れております。
(ルータやスイッチングハブ等の話もありますが、今回は割愛)
利用するだけでは特に意識せずとも良いのですが、通信プログラムを作成する上では、実際にどのようなデータを流れているかを知っておく事は必須になります。いざ、バグが発生したり通信がうまくいかない…となった際に、流れているデータが見れたら原因すぐに掴めそうですよね。デバッガーで変数の値を見るのと同様に、送信時, 受信時にデータがおかしくなってる事も見る事で把握する事が出来ます。
そんな重要なパケットですが、こんな声が聞こえてきました。
「 でも、ネットワークに流れているデータ見るのって大変なんでしょう?」
そんな事ございません。下記を実行してみましょう。
sudo tcpdump
ログがサクサク流れ行く事が確認出来ると思います。
内容をよく見てみると、IPアドレスや日時にプロトコルと表示されている事が確認出来ます。これが、現在PC上でやり取りが行われているパケットになります。
たったこれだけで、パケットを見る事が出来るようになりました。
めでたし、めでたし。
しかし、このままではデータの流れがはやすぎて内容がわかりにくいですね。そもそも、適当なログ垂れ流して通信を送受信してないんじゃないかとの疑惑もございます。それでは、本当にデータのやり取りが出来ているか確認してみましょう。
送信したデータが本当に流れているのかを見る
sudo tcpdump -i lo0
-iがキャプチャ先のインターフェイスの指定になります。
lo0がループバック用のインターフェイスになりますので、基本的に何か特殊な事をしていない限り無駄なデータがやってこない想定です。
(少し話が脱線しますが、インターフェイス一覧「ifconfig -l」で取得可能です
PCによってインターフェイス一覧が違いますので、確認してからのが良いかもしれません)
それでは、「ping 127.0.0.1」を実行してみましょう。
出ましたか? 待ち受け状態のtcpdumpから出ましたか?
そう。これですよ、これ。
こんな感じにpingパケットの中身が見れちゃいます。
IP localhost > localhost: ICMP echo request, id 27167, seq 0, length 64
ICMPだらIPアドレスだらサイズだらなんだら…
これで、本当にデータがやり取り出来ている事を確認とれました。
他PCから送ってみるとアドレスの所が変わると思います。
ping以外にも通信送ればキャプチャ可能なので、色々試してみましょう。
もっと細かい通信内容を見る
先程、通信プロトコルや送信元, 送信先IPアドレス等、わかりやすい形式で出力される事を確認しました。ただし、あくまで表示されるのがヘッダ情報のみになります。パケットの全内容を閲覧したい場合は tcpdump引数に -X を加える事で、より詳細なパケット情報閲覧が可能になります。
それでは、先程と同様にpingの詳細を閲覧してみましょう。
sudo tcpdump -i lo0 -X
# pingを別途、localhostに送ってみて下さい
きました、きました。
一例ですが、こんなデータがとれると思います。
0x0000: 4500 0054 6a5a 0000 4001 0000 7f00 0001 E..TjZ..@.......
0x0010: 7f00 0001 0800 c58d fe17 0000 54e4 745f ............T.t_
0x0020: 0007 800c 0809 0a0b 0c0d 0e0f 1011 1213 ................
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"#
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
0x0050: 3435 3637 4567
パッと見たら何かわかりにくいですが、プロトコルに当てはめてしまえば、どんなデータかわかります。せっかくなので、一部かいつまんでみていきましょう。
パケット解析
- プロトコル
byte offset : 9
0: IP, 1: ICMP, 6: TCP, 17: UDP …byte offset 9 「01」なので、ICMPになりますね
- 送信元IPアドレス
byte offset : 12byte offset 12 「7f00 0001」なので
0111 1111 0000 0000 0000 0000 0000 0001 = 127.0.0.1
送信元のアドレスになりますね
これらの情報を最初に取得した情報と照らし合わせてみます。
ちゃんとICMP, localhost(127.0.0.1) とあってますね。
データの収集方法と、見方もこれで大丈夫かと思います。
HTTP通信
画像情報等の余計な情報を省くために、w3mを利用してアクセスしたいと思います。
まず初めに、tcpdumpを立ち上げておきますがポート番号を指定して起動しておきましょう。引数で「port ポート番号」を追加する事で、キャプチャするポート番号指定が可能です。
# sudo tcpdump -i en0 -X port 80でもOK
sudo tcpdump -i en0 -X port http
キャプチャの準備が整いました。
続いて、w3mでWebページへアクセスを行ってみます。
# どこか好きなサイトへアクセスを...
w3m google.com
w3mでWebページが表示された事を確認した後、tcpdumpの結果を見てみます。
0x0000: 4500 05be 9dbf 0000 3606 0772 d83a dd03 E.......6..r.:..
0x0010: c0a8 6422 0050 d632 580d cf4b eb3d 2856 ..d".P.2X..K.=(V
0x0020: 8010 0155 e7d8 0000 0101 080a 8dc6 f5b7 ...U............
0x0030: 1ecc 748d 6666 663b 636f 6c6f 723a 626c ..t.fff;color:bl
0x0040: 6163 6b7d 617b 636f 6c6f 723a 2331 3163 ack}a{color:#11c
0x0050: 3b74 6578 742d 6465 636f 7261 7469 6f6e ;text-decoration
0x0060: 3a6e 6f6e 657d 613a 686f 7665 722c 613a :none}a:hover,a:
0x0070: 6163 7469 7665 7b74 6578 742d 6465 636f active{text-deco
0x0080: 7261 7469 6f6e 3a75 6e64 6572 6c69 6e65 ration:underline
0x0090: 7d2e 666c 2061 7b63 6f6c 6f72 3a23 3336 }.fl.a{color:#36
0x00a0: 637d 613a 7669 7369 7465 647b 636f 6c6f c}a:visited{colo
どうでしょうか?
ヘッダ部分はあqswでfrtgひゅjですが、0x0030あたりから見たことのある単語が出てきました。
「a{color:#11c;text-deco…」これは…CSSっぽい! いや、むしろCSSだ! となります。
HTTP通信でWebページを取得するまでの一連の流れがコチラで確認が可能です。ackやseq, 3 way handshake等、実際に流れているデータを見る事でより理解も深まると思います。HTTP以外にも、他にも普段利用している通信内容見てみるのも面白いと思います。
ログと化す
sudo tcpdump -i en0 -w ~/tcpdump.log
最後に
さて、ログと全然関係ない内容になってしまいました。
本来はtcpdumpで収集したログを解析しようとしたんですが、長くなったので分割します。
tcpdumpが手軽に利用出来ますが、もっとGUI上でバリバリ分析を行いたい場合、専用のツールございます。
Wiresharkもしくはパケットキャプチャツールでの検索で出てきます。
今後も少しづつ、ネットワーク関係の内容も入れていきたいと思います。
(ログソフトウェアどこいったーい)