TCP/IP通信の概要
TCP通信は、まず通信をしたい要求元から相手先にTCPコネクションを設定し、そのコネクション上で実際のデータのやり取りがなされます。TCPのコネクションは、パケットの中にあるフラグを使って以下のようなフェーズで設定されます。下記のキャプチャデータの「info」欄の[
]の中が、そのフラグを示しています。
- 要求元から相手先へSYNフラグをセットしたパケットを送信
- SYNパケットを受け取った相手先は、要求元にSYN/ACKフラグをセットしたパケットを送信
- 相手先からACKフラグがセットされたパケットを要求元が受け取る
従って、ルータのフィルタリングでこのフラグを扱えると、WAN側から通信が始まるケースだけ遮断するといったことができます。つまり、外部からランダムにポートスキャンされても、ルータで明示的に通過設定していないものについては遮断できますので、アタックには強くなります。おやじが使用しているTE4121Cはこういった設定ができますので、設定できる量には限界がありますが、きめ細かく設定しています。
なお、フラグについては以下のものがあります。(下記のキャプチャデータでは、RequestとResponseについている[PSH,ACK]は、スペースの関係で省略しています。)
フラグ
概 要
SYN
TCPコネクションの確立を要求する最初のパケットに付与されるフラグ。
ACK
応答確認のためのフラグであり、接続要求以外の全てのパケットに付与されるフラグ。
PSH
受信したデータをバッファリングせず、直ちにアプリケーションに渡すことを要求するフラグ。大きなデータをフラグメントした場合は、最後のパケットに付与される。
FIN
コネクションの切断を要求するフラグ。
RST
コネクションの強制切断用のフラグ。データ転送中にキャンセルボタンを押した時などに送出される。
実際のTCP通信の状況を見てみましょう。下表は、おやじのFTPサーバテストの状況をサーバのEtherealでキャプチャしたものを見やすく編集したものです。この通信は、FTPサーバ(server)にクライアント(client)から、PORTモードでFTPサーバテストを行ったときのものです。ここからわかることの概要を以下に示します。
FTPサーバの公開も合わせて見ていただくと、理解しやすいかもしれません。
- 制御コネクションは、通信の最初に設定され最後まで保持されるが、データコネクションは、転送毎に設定・開放され、ポート番号は
1224、1225、・・・とインクリメントされていく。
- データコネクションはダウンロード(No.33-37)やアップロード(No.49-51)にかかわらず、サーバ側から設定されている。従って、サーバとしては21番をサーバにスタティックNATしフィルタを開けてあれば良く、データコネクションに関しては、ブラウザで外部サイトをアクセスするのと同様の通信形態であり、ルータでアウトフィルタをかけていない限り、特に設定しなくても通信が可能となる。むしろ、データコネクションに関してルータで問題になるのは、家庭内のFTPクライアントが外部にアクセスするときであり、ルータのFTP対応機能(PORTコマンドのアドレス書き換え等)よりフィルタ機能が優先的に処理されるルータでは、20番が要求元となる外部から通信を開けてあげないと、家庭内クライアントから外部のFTPサーバにPORT(Active)モードでアクセスできない。(おやじのTE4121Cの設定が該当する)
FTP通信のイメージ
[凡例]
・Src. : パケットの送信元
・Dst. : パケットの送信先
・Prot : 全てTCPであるが、コネクション制御は「TCP」、制御コネクションは「FTP」、データコネクションは「FTPD」で表記
・Info : パケットの使用ポート番号や実際のデータ。Res.:Responce Req:Request
緑:制御コネクションの設定・開放
黒:制御コネクション上でやり取りされる制御情報
青:データコネクションの設定・開放
赤:データコネクション上で実際にやり取りされるデータ(リスト、test.txt等)
No.
Src. Dst. Prot
info
概 要
1
2
3
client server TCP 1223 > ftp [SYN]
server client TCP ftp > 1223 [SYN, ACK]
client server TCP 1223 > ftp [ACK]
クライアント側の1223番ポートから、サーバ側の21番ポートに向かって制御コネクションを設定するフェーズ。フラグが上記のとおり設定されている様子がわかる。
4
5
6
server client FTP Res: 220 ProFTPD 1.2.7rc3 Server (Aconus.com
FTP Server)
client server FTP Req: USER linux
server client TCP ftp > 1223 [ACK]
サーバからの接続メッセージを受け、クライアントからログインユーザを通知するフェーズ。
7
8
9
10
server client FTP Res: 331 Password required for linux.
client server FTP Req: PASS *******
server client TCP ftp > 1223 [ACK]
server client FTP Res: 230 User linux logged in.
サーバからのユーザに対するパスワード要求と、クライアントからサーバへのパスワード送信とその応答フェーズ。
11
12
13
client server FTP Req: PWD
server client TCP ftp > 1223 [ACK]
server client FTP Res: 257 "/" is current directory
クライアントからサーバへのカレントディレクトリの送信要求とその応答。
14
15
client server FTP Req: TYPE A
server client FTP Res: 200 Type set to A.
クライアントからサーバへのASC?Uモードへの変更要求とその応答。
16
17
client server FTP Req: PORT 192,168,1,2,4,200
server client FTP Res: 200 PORT command successful
クライアントからデータコネクションの待ち受けアドレス(4*256+200=1224)をPORTコマンドでサーバに通知。
18
client server FTP Req: LIST -aL
LISTコマンドでリストの送信を要求。
19
20
21
server client TCP ftp-data > 1224 [SYN]
client server TCP 1224 > ftp-data [SYN, ACK]
server client TCP ftp-data > 1224 [ACK]
LISTコマンドを受け、サーバ側の20番ポートから、クライアント側のPORTコマンドで指定された1224番ポートに向かってデータコネクションを設定するフェーズ。
22
23
server client FTP Res: 150 Opening ASCII mode data
connection for file list
server client FTPD FTP Data: 251 bytes
LISTを送るための制御コネクションのオープンを通知し、LISTデータをサーバからデータコネクションを使って送信。
24
25
26
27
server client TCP ftp-data > 1224 [FIN, ACK]
client server TCP 1224 > ftp-data [ACK]
client server TCP 1224 > ftp-data [FIN, ACK]
server client TCP ftp-data > 1224 [ACK]
双方から使用したデータコネクションを開放するフェーズ。FTPの場合、データコネクションは一回の通信ごとに設定、開放される。
28
29
server client FTP Res: 226 Transfer complete.
client server TCP 1223 > ftp [ACK]
No.28で制御コネクションでサーバ側から送信完了を通知。No.29は、クライアント側からの送信完了通知に対する応答。
30
31
client server FTP Req: TYPE A
server client FTP Res: 200 Type set to A.
クライアントからサーバへのASC?Uモードへの変更要求とその応答。
32
33
client server FTP Req: PORT 192,168,1,2,4,201
server client FTP Res: 200 PORT command successful
クライアントからデータコネクションの待ち受けアドレス(4*256+201=1225)をPORTコマンドでサーバに通知。
34
client server FTP Req: RETR test.txt
RETRコマンドでtest.txtの送信を要求。
35
36
37
server client TCP ftp-data > 1225 [SYN]
client server TCP 1225 > ftp-data [SYN, ACK]
server client TCP ftp-data > 1225 [ACK]
RETRコマンドを受け、サーバ側の20番ポートから、クライアント側のPORTコマンドで指定された1225番ポートに向かってデータコネクションを設定するフェーズ。
38
39
server client FTP Res: 150 Opening ASCII mode data connection
for test.txt (906 bytes)
server client FTPD FTP Data: 926 bytes
指定ファイルを送るための制御コネクションのオープンを通知し、指定されたファイルをサーバからデータコネクションを使って送信。
40
41
42
43
server client TCP ftp-data > 1225 [FIN, ACK]
client server TCP 1225 > ftp-data [ACK]
client server TCP 1225 > ftp-data [FIN, ACK]
server client TCP ftp-data > 1225 [ACK]
双方から使用したデータコネクションを開放するフェーズ。
44
45
server client FTP Res: 226 Transfer complete.
client server TCP 1223 > ftp [ACK]
サーバからクライアントへデータ転送が完了した旨の通知とその応答。
46
47
client server FTP Req: PORT 192,168,1,2,4,202
server client FTP Res: 200 PORT command successful
クライアントからデータコネクションの待ち受けアドレス(4*256+202=1226)をPORTコマンドでサーバに通知。
48
client server FTP Req: STOR test.txt.bak
STORコマンドでtest.txt.bakの受信を要求。
49
50
51
server client TCP ftp-data > 1226 [SYN]
client server TCP 1226 > ftp-data [SYN, ACK]
server client TCP ftp-data > 1226 [ACK]
STORコマンドを受け、サーバ側の20番ポートから、クライアント側のPORTコマンドで指定された1226番ポートに向かってデータコネクションを設定するフェーズ。
52
53
server client FTP Res: 150 Opening ASCII mode data connection
for test.txt.bak
client server FTPD FTP Data: 926 bytes
指定ファイルを受信するための制御コネクションのオープンを通知し、ファイルをクライアントからデータコネクションを使って受信。
54
55
56
57
client server TCP 1226 > ftp-data [FIN, ACK]
server client TCP ftp-data > 1226 [ACK]
server client TCP ftp-data > 1226 [FIN, ACK]
client server TCP 1226 > ftp-data [ACK]
双方から使用したデータコネクションを開放するフェーズ。(ここではクライアントから先に切断したように見えている)
58
59
server client FTP Res: 226 Transfer complete.
client server TCP 1223 > ftp [ACK]
サーバからクライアントへデータ転送が完了した旨の通知とその応答。
60
61
client server FTP Req: TYPE A
server client FTP Res: 200 Type set to A.
クライアントからサーバへのASC?Uモードへの変更要求とその応答。
62
63
client server FTP Req: PORT 192,168,1,2,4,203
server client FTP Res: 200 PORT command successful
クライアントからデータコネクションの待ち受けアドレス(4*256+203=1227)をPORTコマンドでサーバに通知。
64
client server FTP Req: LIST -aL
LISTコマンドでリストの送信を要求。
65
66
67
server client TCP ftp-data > 1227 [SYN]
client server TCP 1227 > ftp-data [SYN, ACK]
server client TCP ftp-data > 1227 [ACK]
LISTコマンドを受け、サーバ側の20番ポートから、クライアント側のPORTコマンドで指定された1227番ポートに向かってデータコネクションを設定するフェーズ。
68
69
server client FTP Res: 150 Opening ASCII mode data connection
for file list
server client FTPD FTP Data: 251 bytes
LISTを送るための制御コネクションのオープンを通知し、LISTデータをサーバからデータコネクションを使って送信。
70
71
72
73
server client TCP ftp-data > 1227 [FIN, ACK]
client server TCP 1227 > ftp-data [ACK]
client server TCP 1227 > ftp-data [FIN, ACK]
server client TCP ftp-data > 1227 [ACK]
双方から使用したデータコネクションを開放するフェーズ。
74
75
server client FTP Res: 226 Transfer complete.
client server TCP 1223 > ftp [ACK]
サーバからクライアントへデータ転送が完了した旨の通知とその応答。
76
77
client server FTP Req: QUIT
server client FTP Res: 221 Goodbye.
クライアント側からの切断要求とその応答。
78
79
80
server client TCP ftp > 1223 [FIN, ACK]
client server TCP 1223 > ftp [ACK]
client server TCP 1223 > ftp [RST]
最後にサーバ側から制御コネクションの切断要求とその応答が見える。最後のRSTフラグのパケットは強制切断である。
Top Pageへ