FTPとは

 FTPは、「File Transfer Protocol」の略で、ファイル転送プロトコルとも呼ばれます。ネットワークでファイルの転送を行うための通信プロトコルで、インターネットの初期の頃から存在します。

今では、インターネット上で最もよく利用されているファイル転送用プロトコルとなっています。

 ファイル転送用プロトコルは、他にも、NetBIOSやNFSなどがあります。こちらは、OSのファイルシステムを利用して外部のファイルシステムに対して仮想的にマウントすることでファイル転送を実現しています。

FTPでは、クライアント/サーバ型でファイル転送を行います。

 FTPでのファイル転送は、コマンドベースで行うことになりますが、現在は、Windows環境においても、Linux環境においても、GUIで操作できるFTP専用ソフトが充実しています。その為、コマンドを意識することなくファイル転送を行えるようになっています。

 FTPでは、制御用とデータ転送用の2つのコネクションを使って通信を行います。制御用には21番ポート(FTP)を、データ転送用には20番ポート(FTP-DATA)が使用されます。

 まず、最初に制御コネクションを張り、ユーザ認証が行われます。ユーザ認証に成功したら、制御用コネクションが確立されます。これは、FTPサーバへ、クライアント側から要求することで確立されます。クライアントは空いている任意のポートを使って、サーバの21番へ接続します。

 制御コネクションの確立が終わったら、データコネクションを確立します。このように、FTPでは、データの送受信とは別に制御用のコネクションを確立することで、データ転送中であっても、停止命令など他の命令が出せるようになっています。

FTP PORTモード(アクティブモード)

FTPプロトコルにPORTモード(アクティブモード)とPASVモードがあります。ここでは、PORTモードについて説明してゆきます。

PORTモードは、多くのFTPソフトウェアでデフォルトの転送モードになっています。

 このモードでは、データコネクションは、制御コネクションとは異なり、FTPサーバ側の20番ポートからクライアントの任意のポートに向けてコネクションが確立されます。

 FTPサーバ側からコネクションを設定する為に、クライアントのIPアドレスとポート番号を知っている必要がありますが、これは、制御コネクション時のPORTコマンドで、FTPサーバに通知されるようになっています。

 ここで、注意が必要です。データコネクションの方向が、FTPサーバ側からクライアント方向になっています。これは、ファイルのダウンロード、アップロードにかかわらず、FTPサーバ側からコネクションが確立されるということです。

ファイルをアップロードする場合には、クライアントから通信が始まるのでは?

と疑問に思うかもしれませんが、アップロードもFTPサーバからコネクションが始まります。

このデータコネクションの方向が、問題になってきます。

まずは、セキュリティの問題です。

 クライアントのポート番号は、任意(1,024以上)であるため、FTPで通信を行うためには、FTPサーバ側から接続されてくるデータコネクションのポートをFWで開けておく必要があります。1,024以上のポートの全てとなると非常にリスクが高くなります。

また、クライアントがNATルータの配下にある場合も問題になってきます。

 NATやIPマスカレードでは、IPアドレスやポート番号が変換されます。そのため、PORTコマンドで渡される値も書換える必要があります。

 その理由は、PORTコマンドで通知されるIPアドレスとポート番号では、クライアントと通信を行うことができないからです。NATで変換されるIPアドレスとポート番号で通信する必要があります。

 しかし、PORTコマンドの引数は10進表記であり、値が変ると文字列の長さが変ってしまいます。PORTコマンド内の引数を変換するには、複雑な処理が必要になります。

 そのため、PORTコマンドの書換えに対応していないNATルータも存在し、NATで問題が発生する場合があります。つまり、NATルータの配下にクライアントがある場合、FTP通信が行えない場合があるという問題があります。

FTP PASVモード(パッシブモード)

PASVモードでは、制御コネクション、データコネクション共に全てクライアントから始まります。

 PORTモードでは、FWやNATにおいて、問題点がありました。PASVモードは、クライアントがFWやNATルータ配下にいても通信ができるようにするために考えられたモードです。

 PORTモードでは、FTPサーバからデータコネクションが確立されましたが、PASVモードのデータコネクションでは、PORTモードとは逆に、クライアント側の任意のポートからFTPサーバの待ち受けポート方向にコネクションが確立されます。

 このモードでは、クライアントからFTPサーバへ制御コネクションでPASVコマンドを使用します。FTPサーバは、その応答に自身のIPアドレスと待ち受けポート番号を含めクライアントに通知します。

 クライアントは、FTPサーバから通知されたIPアドレス、ポートに対してFTPサーバにデータコネクションの確立を行います。

PASVモードでは、制御コネクション、データコネクション共に全てクライアント側から確立されることになります。

 PASVコマンドに対する応答の中にFTPサーバのIPアドレスと待ち受けポート番号が記述されることにますが、NATやIPマスカレードでの変換対象にならないので問題になりません。

 PASVモードでは、一見、NAT問題を解決できそうに思えますが、クライアントがNATルータ配下であり、FTPサーバもNATルータ配下である場合には、問題が起こります。

結局、NAT(IPマスカレード)を介したFTP通信では、次の2点が問題になります。

①クライアントからPORTコマンドでクライアントのIPアドレスと待ち受けポート番号を通知していること

②PASVコマンドの応答として、FTPサーバのIPアドレスと待ち受けポート番号を通知していること

 通知するIPアドレスをルータがWAN側のグローバルIPアドレスに変換してくれれば、FTP通信におけるNAT問題を解決することができます。

最近のルータは、①のケースにほとんど対応していますが、②のケースには、まだ対応していない製品もあります。