アクティブFTPとパッシブFTP
作成 : 2002/10/12
FTPには、データ転送に使用するポートと接続方法の違いによって、アクティブFTPとパッシブFTPに分類することができる。
アクティブFTP
昔からある方法で、WindowsのFTPコマンドなどがこれにあたる。 FTPの制御(コマンドとレスポンス)に21番ポートを使用し、FTPのデータ転送(lsコマンドの結果、ファイルのアップロード・ダウンロード)に20番ポートを使用する。
| サーバポート | クライアント | プロトコル | 用途 |
|---|---|---|---|
| 21 | 任意 | TCP | 制御 |
| 20 | 任意(クライアントが指定) | TCP | データ転送 |
データ転送を行おうとするとき、クライアントはPORTコマンドで接続を待つポートを指定する。 サーバの20番ポートから、クライアントの指定ポートに向けて、コネクションをはる。
PORT aaa,bbb,ccc,ddd,ee,ff ※aaa,bbb,ccc,dddはクライアントIPアドレス、ee * 256 + ffがデータ転送に使用するクライアントのポート
アクティブFTPのファイルダウンロードシーケンスは、次のとおり。
| サーバポート | クライアントポート | |
|---|---|---|
| 21 | <--- PORT X,X,X,X,A,B <--- | 任意 |
| 21 | ---> PORT command successful. ---> | 任意 |
| 21 | <--- RETR filename <--- | 任意 |
| 20 | ===> (SYN) ===> | A*256+B |
| 20 | <=== (SYN+ACK) <=== | A*256+B |
| 20 | ===> (ACK) ===> | A*256+B |
| 21 | ---> Opening ASCII mode data connection ---> | 任意 |
| 20 | ===> (ファイルダウンロード) ===> | A*256+B |
| 20 | <=== (ACK) <=== | A*256+B |
| 20 | ===> (FIN) ===> | A*256+B |
| 20 | <=== (ACK) <=== | A*256+B |
| 20 | <=== (FIN) <=== | A*256+B |
| 20 | ===> (ACK) ===> | A*256+B |
| 21 | ---> Transfer complete. ---> | 任意 |
クライアントがファイアウォール内部にある場合、アクティブFTPは失敗することがほとんど。 アクティブFTPでは、データ転送コネクションを確立するため、サーバからクライアントへ接続要求(SYN)パケットを送信する。 通常、ファイアウォールでは、外部から内部への接続要求パケットを通さない。
パッシブFTP
ブラウザによるFTPなどがこれにあたる。 FTPの制御(コマンドとレスポンス)に21番ポートを使用し、FTPのデータ転送(lsコマンドの結果、ファイルのアップロード・ダウンロード)に任意のポートを使用する。
| サーバポート | クライアント | プロトコル | 用途 |
|---|---|---|---|
| 21 | 任意 | TCP | 制御 |
| 任意(サーバが指定) | 任意 | TCP | データ転送 |
クライアントはPASVコマンドをサーバに送信して、パッシブモードでのデータ転送を要求する。 サーバはPASVコマンドの返答として、データ転送で使用するサーバ側ポートを送信する。 クライアントの任意ポートから、サーバの指定ポートに向けて、コネクションをはる。
PASV Entering Passive Mode (aaa,bbb,ccc,ddd,ee,ff) ※aaa,bbb,ccc,dddはクライアントIPアドレス、ee * 256 + ffがデータ転送に使用するクライアントのポート
パッシブFTPのファイルダウンロードシーケンスは、次のとおり。 FTPコネクションとFTPデータ転送コネクションで使用されるクライアントポートは、それぞれ別。
| サーバポート | クライアントポート | |
|---|---|---|
| 21 | <--- PASV <--- | 任意 |
| 21 | ---> Entering Passive Mode (X,X,X,X,A,B) ---> | 任意 |
| A*256+B | <=== (SYN) <=== | 任意 |
| A*256+B | ===> (SYN+ACK) ===> | 任意 |
| A*256+B | <=== (ACK) <=== | 任意 |
| 21 | <--- RETR filename <--- | 任意 |
| 21 | ---> Opening ASCII mode data connection ---> | 任意 |
| A*256+B | ===> (ファイルダウンロード) ===> | 任意 |
| A*256+B | <=== (ACK) <=== | 任意 |
| A*256+B | ===> (FIN) ===> | 任意 |
| A*256+B | <=== (ACK) <=== | 任意 |
| A*256+B | <=== (FIN) <=== | 任意 |
| A*256+B | ===> (ACK) ===> | 任意 |
| 21 | ---> Transfer complete. ---> | 任意 |
パッシブFTPでは、接続要求パケットを常にクライアントから送信する。 クライアントがファイアウォールの内部にあっても、パッシブFTPであれば接続できることが多い。
パッシブFTPのデータ転送で使用されるサーバ側ポートの規制
パッシブFTPでは、サーバのランダムポート(1024〜)に対してデータ転送の接続要求パケットが送られてくる。 これらのポートに送られてくるパケットを受け付けるように設定しないと、パッシブFTPのデータ転送は失敗する。 データ転送の接続要求パケットが送られてくるポート範囲を指定するには、/etc/ftpaccessファイルに次のように記述する。 min_port_numberからmax_port_numberの間だけ、接続要求パケットを通すよう設定しておけばよくなる。
passive ports 0.0.0.0/0 min_port_number max_port_number
データ転送が終了しても、TCPのWAITTIME(15sec?)で設定された時間は、同じポートに接続要求を受けることができない。 (通信のしくみ(TCP/IP)のTCP状態遷移図を参照) 使用できるポートを設定するときは、ある程度の幅を持たせること。