FTPの仕組みについて
はじめに
WEBページを作成したことがあるような方なら、FTPに触れる機会があったかと思われます。しかし、FTPの仕組みまで理解して使用している人は少ないかもしれません。FTPについて理解しておけば、例えばファイル転送中に障害が発生した時にも素早く的確な対応を行うことができるようになるでしょう。今回はサーバにファイルを転送する代表的な手段の一つである「FTP」の仕組みについてまとめていきます。
FTPとは
FTP(File Transfer Protocol)とは、サーバとクライアント間でファイルの送受信を行う通信の規約を指します。TelnetやSSHと同じように相手先のサーバにログインした上で、ファイルの送受信を行います。クライアント-サーバモデルのサービスであり、ファイルを転送するサービスを提供する側がサーバ、リクエストを送信する側がクライアントとなります。FTPを利用することで、ファイルを相手先のサーバにアップロードしたり、相手先のサーバからファイルのダウンロードを行うことができます。なお、FTPではサーバへログインする際にやりとりするユーザ名やパスワードの情報は暗号化されずにそのまま送信されるため、悪意ある第三者に介入されると通信内容が外部に漏れてしまう危険があります。セキュアなFTP通信を行う場合には、後述するFTPSやSFTPを使用します。
FTPの仕組み
ここからはFTPによるファイル転送の仕組みについてまとめていきます。
PIとDTP
FTPには、ファイル転送を実現するための重要な機能としてPIとDTPというものがあります。
PIとは"Protocol Interpreter"の略で、指示内容をプロトコルにインタプリタ(翻訳)する役割を担当しています。PIはFTPサーバとFTPクライアントの両方に存在しており、サーバ側ではクライアントから送られてきたプロトコルをインタプリタして指定された動作を実行し、クライアント側ではユーザーから送られたFTPコマンドを解釈してプロトコルに変換し、サーバへ命令を送ります。
DTPとは"Data Transfer Process"の略で、実際のデータ転送の役割を担当しています。クライアント側からのGETやPUT要求によりファイルの転送が生じた場合にこのDTP間で接続を行い、ファイルの転送を行います。
コントロールコネクションとデータコネクション
FTPの通信では、制御用とデータ転送用の2つのTCPコネクションを利用します。それぞれ制御用のコネクションはコントロールコネクション、データ転送用のコネクションはデータコネクションと呼びます。
コントロールコネクションは、サーバへログインする際のユーザ名やパスワードの情報、そしてファイルの転送等の命令と応答のために使用されるコネクションです。クライアントがサーバにアクセスする際には、サーバ側の21番ポートを使用してコネクションを張ります。一方、クライアント側で使用されるポート番号は自動的に割り当てられるダイナミックポート番号の中から選ばれ使用されます。
データコネクションは、転送されるデータの送受信のために使用されます。クライアントとサーバ間でコネクションを確立する際には、サーバ側の20番ポートを使用してコネクションを張ります。(※これはアクティブモードの場合です。この点については後述します。)一方、クライアント側で使用されるポート番号は自動的に割り当てられるダイナミックポート番号の中から選ばれ使用されます。
アクティブモードとパッシブモード
FTPでは、データコネクション接続時においてどちらが接続要求を開始するかで異なるモードが存在します。(コントロールコネクションはどちらのモードでもクライアントから接続要求をします。)データコネクションでFTPサーバ側から接続要求を行うモードはアクティブモード、FTPクライアント側から接続要求を行うモードはパッシブモードといいます。
アクティブモードの場合は、コントロールコネクションを利用してクライアントが使用するポート番号をサーバに通知するため、サーバ側から接続要求を開始することができます。このとき、データコネクションにはサーバ側の20番ポートが使用されます。
一方、パッシブモードの場合は、コントロールコネクションを利用してクライアントに対してサーバ側で使用するポート番号を通知するため、クライアント側から接続要求を開始することができます。このとき、サーバ側のデータコネクション毎回ランダムで決まるポート番号を使用します。
基本的にアクティブモードがデフォルトで使用されますが、例えばFTPサーバがインターネットなどの外部にあるときに、外部からの接続要求がクライアント側のファイアウォールによって受け付けない設定になっているという場合において、クライアント側から接続要求を開始することでファイアウォールの影響を受けずにコネクションを確立できるためパッシブモードを使用する、といったように使い分けます。
アスキーモードとバイナリモード
FTPのファイル転送時のモードには、アスキーモードとバイナリモードの2種類あります。アスキーモードは、ファイル転送時にファイルの改行を自動的に修正して転送します。バイナリモードは、ファイル転送時にデータをそのまま転送します。
以前は環境によって改行コードに違いがあり、転送したデータが動作しないことがあったためアスキーモードがよく利用されていました。しかし、最近ではエディタも進化してきており、わざわざ改行コードを修正する必要が無くなり、むしろ改行コードに修正が入ることで転送データに破損が生じる恐れがあるため、バイナリモードが利用される機会が増えてきています。
FTPファイル転送の大まかな流れ
- クライアントからサーバに対して接続要求
- TCPによるコネクション(コントロールコネクション)確立後、サーバから応答
- クライアントでユーザ名とパスワードを入力して送信
- サーバ側は送られてきたユーザ名とパスワードの認証処理
- 認証成功後、ファイル転送時にどのモードでファイル転送を行うか、どのポート番号を使用するか等を設定
- クライアントからファイルの転送要求
- [アクティブモードの場合]サーバから接続要求
[パッシブモードの場合]クライアントから接続要求 - TCPによるコネクション(データコネクション)確立後、データ転送開始
- データ転送が完了したら、クライアントからの命令でコネクション切断要求
- サーバから応答を返し、終了
セキュアなFTP通信
上述した通り、FTPではユーザ名やパスワードの情報が暗号化されずにそのまま送信されてしまうため、セキュリティに問題があります。この問題については以下を利用することで解決できます。
- FTPS(FTP over SSL/TLS)
FTPSは、SSL/TLSを利用してFTP経由で送信されるデータを暗号化して保護します。 - SFTP(SSH File Transfer Protocol)
SFTPは、認証とセキュリティの確保をSSHというプロトコルが担うことで、送信されるデータを暗号化してセキュリティを高めます。
まとめ
今回はFTPの仕様についてまとめました。普段、特にFTPクライアントソフトを使用しているときにはあまり意識しない部分となりますが、FTPを利用する上ではもしデータ転送時に何か問題が起こった際に対応するためにも知っておいて損はない情報です。むしろ今後も利用価値の高い基本的なプロトコルであるからこそ、仕組みについて理解しておくことも重要だと考えられます。