アクティブ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状態遷移図を参照) 使用できるポートを設定するときは、ある程度の幅を持たせること。


[サーバの実験室 基礎]