FTPとは、File Transfer Protocolの事です。FTPはプロトコルの名称でも有りますが、そのプロトコルを利用しているアプリケーションの名前でもあります。
FTPはTCP/IPネットワークでファイル転送を実現する標準アプリケーションです。しかし、最近はインターネット上ではHTTP等を利用してファイル転送を行うことも多いですし、LAN内ではWindowsのCIFS(Common internet file system = SMB Server Message Block)を利用する事が多いでしょう。
FTPというシステムは、
・ ファイルを格納してFTPサービスを提供するFTPサーバと、
・ FTPクライアントアプリケーションを利用してファイルのダウンロード・アップロードを行うクライアントからなる、
クライアントサーバシステムです。
FTPは、制御用とデータ転送用の2つのコネクションを確立するのが特徴です。
・ 通常、制御用がTCPポート21番、
・ データ転送用がTCPポート20番を使用します。
但し、パッシブモードではデータ転送用のポートは20番ではなく、その都度決定します。
FTPクライアントアプリケーションには、WindowsのコマンドプロンプトやUnix互換OSのコンソール内で、
・コマンドによって操作するCLIアプリケーションと
・Internet ExplorerのなどのGUIアプリケーション
等があります。
IEはデフォルトでパッシブモードを使用します。ポートモードの切替が可能です。
WindowsのFTPコマンドはポートモード固定です。
FreeBSDなどUnix互換OSのFTPコマンドの多くははプロンプト内でモード切替が可能です。
IEをFTPクライアントとして利用する場合には、アドレス欄にURIを入力します。
URI Uniform Resource Identifierとは、一定の書式によってリソースを特定する識別子のことです。URL Uniform Resource Locatorの拡張として規定されました。URLはネットワーク上のリソースの「場所」と「接続方法」を表す識別子です。
IEをFTPクライアントとして利用するには、スキームにFTPとプロトコルを指定して、アドレス欄にFTP://www.domain.com/folder/と入力します
ファイルのダウンロード・アップロード、ディレクトリ内のファイル情報の取得、切断、などクライアント操作は全てクライアントリクエストとなります。
ファイルの提供・受信、ディレクトリ内のファイル情報の提供、などコマンド操作の結果は全てサーバレスポンスとなります。
FTPコマンドを実行してみましょう。Unix互換OSやWindowsのコマンドプロンプト操作と共通する部分もあるので、通常のコマンド操作が出来る場合には困難な事は無いでしょう。
WindowsのコマンドプロンプトやUnix互換OSのコンソールでftpとタイプして実行すると、FTPクライアントのプロンプトに移行します。
helpもしくは?を実行すると、利用可能なコマンド一覧を表示します。
quitでFTPクライアントを終了出来ます。
ftpコマンド起動後にopenコマンドでログインするホストを指定します。
ftpコマンドの引数としてホストを指定する事も可能です。
ホストはIPアドレスでもホスト名でもどちらでも可能です。ホスト名の場合は別途名前解決のシステムを用意する必要があります。名前解決のシステムはhostファイルでもDNSでも可能です。
ログインプロンプトではパスワードは表示されません。
pwdコマンドはリモート(FTPサーバ内)のカレントディレクトリを表示します。
!pwdはローカルPCのカレントディレクトリを表示します。
lsコマンドはリモートのカレントディレクトリ内ファイル一覧を表示します。Unix互換OSでもファイルリスト表示はlsコマンドでした。
!lsはローカルPCのカレントディレクトリ内ファイル一覧を表示します。
LはlocalのLと関連付けると覚え易いでしょう。
cdコマンドでリモート(FTPサーバ内)のカレントディレクトリを移動できます。
lcdコマンドでローカルPCのカレントディレクトリを移動できます。
Unix互換OSのFTPコマンドではpassiveコマンドでポートモードとパッシブモードの切替が可能です。
quitだけでなくbyeやexit、!でftpコマンドを終了可能なものも有ります。
カレントディレクトリとはユーザが現在操作しているディレクトリのことです。
ファイルのダウンロードにはgetコマンドを使用します。
ファイルのアップロードにはputコマンドを使用します。
FTPにはパッシブモードとポートモードという、2種類のモードが有ります。
ポートモードは、クライアントがサーバに対して、データ転送に使用するクライアント側のIPアドレスとポート番号をあらかじめ指定してデータ転送します。データ転送に使用するサーバ側のポート番号はTCPポート20番で固定です。
ポートモードをアクティブモードとも呼びます。
パッシブモードは、サーバがクライアントに対して、データ転送に使用するサーバ側のIPアドレスとポート番号を指定してデータ転送します。サーバ側のポート番号はその都度決定します。
制御用セッションを使って、クライアントのデータ転送用のポートに3386番を使用するとサーバに伝えています。
この後、データ転送ではこのTCPポート3386番が使用されています。
FTP制御パケット内では、データ転送時にクライアントが使用するポートを
13,58
と記述しています。これは2オクテットで表しています。それぞれを8ビットの2進表示にして16ビットに並べてから10進数に変換すると3386になります。
13 は 00001101 58 は 00111010 になります。これら2つの2進数を連続表示した 00001101 00111010 を10進表示にすると 3386です。
制御用セッションを使って、クライアントはデータ転送にパッシブモードを利用すると伝えています。
次にサーバがデータ転送用のポートに2561番を使用するとクライアントに伝えました。
10進数10 は 2進数00001010 になり、10進数1 は 2進数00000001 となり、これらを連続表示した2進数101000000001 を10進数に変換すると2561になります。
この後、サーバはデータ転送に、このTCPポート2561番が使用しています。
netstatコマンドを利用してFTPサーバのポート状態を見てみましょう。
コマンド引数として –p tcp –anを利用します。
ポート番号21番が見えるのでFTPサービスを公開中ということが判ります。
コマンド引数として –p tcp –aとしてIPアドレスをホスト名に翻訳するとポート番号もftpの表示に変わりました。
引数の意味です。
-p <protocol>で、TCPかUDPかの指定をします。未指定はTCPとUDP両方を表示します。
-aで全てのアプリケーションプロトコルを表示します。
-nは数字(number)です。
FTPクライアントがポートモードで接続中であるFTPサーバのポート状態です。
制御用セッションは、サーバがTCPポート21、クライアントが3383を利用しています。
データ転送用セッションは、サーバがTCPポート20、クライアントが通知どおりの3386を利用していました。netstatコマンドの実行がデータ転送後のセッションが閉じた直後でした。
ポート番号ではなくプロトコル表示でnetstatを実行しました。
前ページの表示と比べると、TCPポート20がftp-data、TCPポート21がftpと翻訳されています。
FTPクライアントがパッシブモードで接続中であるFTPサーバのポート状態です。
制御用セッションは、サーバがTCPポート21、クライアントが3366を利用しています。
データ転送用セッションは、クライアントがTCPポート3371、サーバが通知どおりの2561を利用していました。netstatコマンドの実行がデータ転送後のセッションが閉じた直後でした。
ポート番号ではなくプロトコル表示でnetstatを実行しました。
前ページの表示と比べると、TCPポート21がftpと翻訳されています。
Windowsのnetstatコマンドではパッシブモードのデータ転送で使用したTCPポート2561を翻訳していませんが、Etherealなどプロトコルアナライザによってはftp-dataと翻訳するものも有ります。
NATはネットワーク・アドレス変換、NAPTはネットワーク・アドレス・ポート・変換のことです。FTPをNAT/NAPTを介して使用すると通信に問題が出る場合があります。この問題を考えてみましょう。
ポートモードではFTPクライアントのIPアドレスとポート番号がFTPパケットのアプリケーション層にも格納してあります。
FTPクライアントがNAT/NAPTの内側にいる場合、NAT/NAPTがFTPパケットのネットワーク層のIPアドレスだけでなく、アプリケーション層のIPアドレスもグローバルアドレスに変換しないと、インターネット上のFTPサーバからNAT/NAPT内部のクライアントにデータ転送ができません。
この問題は、FTPクライアントがパッシブモードを利用する事で解決可能です。
最近のNAT/NAPTボックスはポートモードに対応し、アプリケーション層のIPアドレスも変換するので、FTPクライアントがポートモードのままでもデータ転送可能です。
次はパッシブモードです。
パッシブモードではFTPサーバのIPアドレスとポート番号がFTPパケットのアプリケーション層にも格納してあります。
FTPサーバがNAT/NAPTの内側にありインターネットにサーバ公開している場合、NAT/NAPTがFTPパケットのネットワーク層のIPアドレスだけでなく、アプリケーション層のIPアドレスもグローバルアドレスに変換しないと、インターネット上の任意のクライアントとNAT/NAPT内部のサーバでデータ転送ができません。
FTPクライアントがポートモードを利用する事で解決可能ですが、FTPクライアントもNAT/NAPTの内側だった場合はやはりデータ転送ができません。
最近のNAT/NAPTボックスはポートモードに対応し、アプリケーション層のIPアドレスもグローバルアドレスに変換するので、FTPクライアントがこのようなNAT/NAPTボックスを利用していると限定すれば、ポートモード専用FTPサーバとしてNAT/NAPTの内側にいるFTPサーバもインターネットに公開可能です。
しかし現実にはパッシブモードでのアクセスの可能性を考慮せざるを得ません。
FTPサーバがパッシブモードのクライアントにも対応するには、NAT/NAPTボックスでの対応が必須です。