2018年4月9日月曜日

tcpdump入門② (パケットキャプチャからTCP通信を読み解く)

前回、tcpdumpの基本的な使い方を説明したが、今回は実際に通信のキャプチャを確認し、どのような通信が行われているかを確認してみることにする。

★前回はこちら↓
tcpdump入門① (tcpdumpでよく使うオプションたち)
https://tech-mmmm.blogspot.jp/2018/04/tcpdump-tcpdump.html

SMTPのパケットをキャプチャしてみる

実際にSMTPのパケットをキャプチャしてみよう。環境としては以下の通りとなる。

・メール送信元:192.168.11.110
・メール送信先:192.168.11.112

メール送信元からメール送信先に、1通のメールを送信する際のパケットをキャプチャ結果を以下に記載する。

# tcpdump -i 3 -nn host 192.168.11.112 and port 25
------------------------------
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eno16780032, link-type EN10MB (Ethernet), capture size 65535 bytes
22:38:40.599031 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [S], seq 2738265213, win 29200, options [mss 1460,sackOK,TS val 1417334469 ecr 0,nop,wscale 7], length 0
22:38:40.599564 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [S.], seq 1404691787, ack 2738265214, win 28960, options [mss 1460,sackOK,TS val 2698190197 ecr 1417334469,nop,wscale 7], length 0
22:38:40.599583 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [.], ack 1, win 229, options [nop,nop,TS val 1417334469 ecr 2698190197], length 0

・・・★①

22:38:40.615489 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [P.], seq 1:42, ack 1, win 227, options [nop,nop,TS val 2698190213 ecr 1417334469], length 41
22:38:40.615511 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [.], ack 42, win 229, options [nop,nop,TS val 1417334485 ecr 2698190213], length 0
22:38:40.615568 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [P.], seq 1:29, ack 42, win 229, options [nop,nop,TS val 1417334485 ecr 2698190213], length 28
22:38:40.615584 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [.], ack 29, win 227, options [nop,nop,TS val 2698190214 ecr 1417334485], length 0
22:38:40.616588 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [P.], seq 42:171, ack 29, win 227, options [nop,nop,TS val 2698190215 ecr 1417334485], length 129
22:38:40.616663 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [P.], seq 29:140, ack 171, win 237, options [nop,nop,TS val 1417334486 ecr 2698190215], length 111
22:38:40.632369 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [P.], seq 171:236, ack 140, win 227, options [nop,nop,TS val 2698190230 ecr 1417334486], length 65
22:38:40.632458 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [P.], seq 140:753, ack 236, win 237, options [nop,nop,TS val 1417334502 ecr 2698190230], length 613
22:38:40.637043 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [P.], seq 236:287, ack 753, win 236, options [nop,nop,TS val 2698190235 ecr 1417334502], length 51

・・・★②

22:38:40.637068 IP 192.168.11.112.25 > 192.168.11.110.53830:  Flags [F.], seq 287, ack 753, win 236, options [nop,nop,TS val 2698190235 ecr 1417334502], length 0
22:38:40.637186 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [F.], seq 753, ack 288, win 237, options [nop,nop,TS val 1417334507 ecr 2698190235], length 0
22:38:40.637247 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [.], ack 754, win 236, options [nop,nop,TS val 2698190235 ecr 1417334507], length 0

・・・★③

^C
15 packets captured
15 packets received by filter
0 packets dropped by kernel
------------------------------

★①までが、TCPの通信開始時に実施される3-Wayハンドシェイクとなる。


------------------------------
22:38:40.599031 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [S], seq 2738265213, win 29200, options [mss 1460,sackOK,TS val 1417334469 ecr 0,nop,wscale 7], length 0
22:38:40.599564 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [S.], seq 1404691787, ack 2738265214, win 28960, options [mss 1460,sackOK,TS val 2698190197 ecr 1417334469,nop,wscale 7], length 0
22:38:40.599583 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [.], ack 1, win 229, options [nop,nop,TS val 1417334469 ecr 2698190197], length 0
------------------------------

上記のオレンジ網掛け箇所がTCPパケットのフラグとなっている。フラグについては、tcpdumpのmanページの「TCP Packets」の項目に説明がある。

------------------------------
Flags are some combination of S (SYN), F (FIN), P (PUSH),  R  (RST),  U (URG),  W  (ECN  CWR), E (ECN-Echo) or `.' (ACK), or `none' if no flags are set.
------------------------------

以上より、"S":SYN、".":ACKとなることがわかる。つまり、SYN→SYN/ACK→ACKの3-Wayハンドシェイクが実施されていることがわかる。

また、緑網掛け箇所はデータ長を表すが、3-Wayハンドシェイクではデータを持たないため、0となっている。詳細は割愛するが、length 0の場合、前回受信したシーケンス番号+1の値でackを返す。

★②からは、実際のデータパケットのやり取りとなる。

------------------------------
22:38:40.615489 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [P.], seq 1:42, ack 1, win 227, options [nop,nop,TS val 2698190213 ecr 1417334469], length 41
22:38:40.615511 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [.], ack 42, win 229, options [nop,nop,TS val 1417334485 ecr 2698190213], length 0
22:38:40.615568 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [P.], seq 1:29, ack 42, win 229, options [nop,nop,TS val 1417334485 ecr 2698190213], length 28
22:38:40.615584 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [.], ack 29, win 227, options [nop,nop,TS val 2698190214 ecr 1417334485], length 0
22:38:40.616588 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [P.], seq 42:171, ack 29, win 227, options [nop,nop,TS val 2698190215 ecr 1417334485], length 129
22:38:40.616663 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [P.], seq 29:140, ack 171, win 237, options [nop,nop,TS val 1417334486 ecr 2698190215], length 111
22:38:40.632369 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [P.], seq 171:236, ack 140, win 227, options [nop,nop,TS val 2698190230 ecr 1417334486], length 65
22:38:40.632458 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [P.], seq 140:753, ack 236, win 237, options [nop,nop,TS val 1417334502 ecr 2698190230], length 613
22:38:40.637043 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [P.], seq 236:287, ack 753, win 236, options [nop,nop,TS val 2698190235 ecr 1417334502], length 51
------------------------------


PフラグはPSHフラグとなり、TCPで受信した情報をバッファにためずに、上位アプリケーションに引き渡すように要求するフラグとなる。

tcpdumpではシーケンス番号は相対表示になり1から開始して表示される。1つめのパケットでは、seq1:42までのシーケンス番号でデータ送信を行っており、2つめのパケットではシーケンス番号42までを受け取ったことを示すack 42を返している。

3-Wayハンドシェイクのようなlength 0の場合は、受け取ったシーケンス番号+1をackで返していたが、実際にデータを含むlength 0ではないパケットの場合は、ackは受信済みのシーケンス番号となる点に注意。

このようにTCPの通信では、送信側が送ったシーケンス番号に対して、受信側でどのシーケンス番号まで受信したかを返すことで、データの抜けのない正確な通信が実現できるように設計されている。

★③で通信の終了となるFINパケットのやり取りを実施している。

------------------------------
22:38:40.637068 IP 192.168.11.112.25 > 192.168.11.110.53830:  Flags [F.], seq 287, ack 753, win 236, options [nop,nop,TS val 2698190235 ecr 1417334502], length 0
22:38:40.637186 IP 192.168.11.110.53830 > 192.168.11.112.25: Flags [F.], seq 753, ack 288, win 237, options [nop,nop,TS val 1417334507 ecr 2698190235], length 0
22:38:40.637247 IP 192.168.11.112.25 > 192.168.11.110.53830: Flags [.], ack 754, win 236, options [nop,nop,TS val 2698190235 ecr 1417334507], length 0
------------------------------


お互いにFINフラグを立てたパケットを送信して、TCPの通信をクローズしている。3-Wayハンドシェイクと同様にlength 0のパケットとなり、ack番号は前回受信したシーケンス番号+1の値となっている。

このように、tcpdumpで通信をキャプチャすることで、3-Wayハンドシェイクから始まり、FINパケットてクローズするTCPの通信の流れを確認することができた。

パケットの中身をASCIIで表示させると、もっとわかりやすい!

-Aオプションを使って、パケットの中身を表示させると、もっとわかりやすい。以下キャプチャ例となる。オレンジ網掛けが送信したSMTPコマンドとなり、黄色網掛けが応答となる。

------------------------------
17:40:21.059074 IP 192.168.11.112.25 > 192.168.11.110.54942: Flags [P.], seq 1:42, ack 1, win 227, options [nop,nop,TS val 3717090657 ecr 2436234912], length 41
E..]..@.@..q...p...n....n....N.,...........
..Ma.5..220 t1112rh72.localdomain ESMTP Postfix

↑★SMTP接続に成功して220を返している

17:40:21.059133 IP 192.168.11.110.54942 > 192.168.11.112.25: Flags [.], ack 42, win 229, options [nop,nop,TS val 2436234929 ecr 3717090657], length 0
E..4..@.@......n...p.....N.,n........U.....
.5....Ma
17:40:21.059428 IP 192.168.11.110.54942 > 192.168.11.112.25: Flags [P.], seq 1:29, ack 42, win 229, options [nop,nop,TS val 2436234929 ecr 3717090657], length 28
E..P..@.@......n...p.....N.,n........q.....
.5....MaEHLO t1110rh72.localdomain

↑★EHLOを送信

17:40:21.059526 IP 192.168.11.112.25 > 192.168.11.110.54942: Flags [.], ack 29, win 227, options [nop,nop,TS val 3717090657 ecr 2436234929], length 0
E..4..@.@......p...n....n....N.H...........
..Ma.5..
17:40:21.060047 IP 192.168.11.112.25 > 192.168.11.110.54942: Flags [P.], seq 42:171, ack 29, win 227, options [nop,nop,TS val 3717090658 ecr 2436234929], length 129
E.....@.@......p...n....n....N.H...........
..Mb.5..250-t1112rh72.localdomain
250-PIPELINING
250-SIZE 1048576
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

↑★EHLOの応答

17:40:21.060227 IP 192.168.11.110.54942 > 192.168.11.112.25: Flags [P.], seq 29:146, ack 171, win 237, options [nop,nop,TS val 2436234930 ecr 3717090658], length 117
E.....@.@......n...p.....N.Hn..U...........
.5....MbMAIL FROM:<ex-1@example.com> SIZE=632 BODY=8BITMIME
RCPT TO:<ex-1@example.com> ORCPT=rfc822;ex-1@example.com
DATA

↑★MAIL FROM、RCPT TO、DATAを送信

17:40:21.078089 IP 192.168.11.112.25 > 192.168.11.110.54942: Flags [P.], seq 171:236, ack 146, win 227, options [nop,nop,TS val 3717090676 ecr 2436234930], length 65
E..u..@.@..V...p...n....n..U.N.............
..Mt.5..250 2.1.0 Ok
250 2.1.5 Ok
354 End data with <CR><LF>.<CR><LF>

↑★MAIL FROM、RCPT TO、DATAの応答
------------------------------

以上のように、SMTPのコマンドのやり取りを確認することができる。

Wiresharkでみると、さらにわかりやすい!

文字で見るよりも、GUIでグラフィカルに見た方が当然わかりやすい。ということで、前回説明した-wオプションにてパケットキャプチャをファイル出力し、Wiresharkで確認すると、もっと見やすくなる。



0 件のコメント:

コメントを投稿

人気の投稿