FTP の仕組み
BASIC
FTP
インターネットでファイルを転送する手段として、FTP という仕組みが一般的です。
FTP とは File Transfer Protocol の略で、名前が示すとおりファイルの転送を目的とした仕組みです。インターネットが普及し始めた当初から存在していたためか今でも主流の方法なのですけど、使う方としては難しい事はないのですけど、サーバを運用する側から見ると何かと面倒ごとに巻き込まれることが多いのでした。
その原因はやや特殊な通信経路だと思います。
通常のサービスはクライアント (ユーザ側) がサーバへ接続して通信路を確保した後、その通信路を使って情報のやり取りを行います。けれど FTP はというと、普通に通信経路を確保した後にもうひとつ、通信経路を確保しようとするのでした。その確保の仕方が風変わりで、サーバ側からクライアントへと要求することとなるのです。
これが意外と厄介で、今日の IPv4 と呼ばれる TCP/IP 通信ではマルチ NAT などと呼ばれる IP Masquerade という仕組みによって、クライアントからサーバへ接続することは出来ても、逆は事実上出来ないことが多いのでした。
通常は、FTP の通信を監視して正常にやり取りできるように計らってくれる機能が IP Masquerade 機能の中に付加されていることがほとんどなので、問題になる事はほとんど無いのですけど、少し特殊な環境を用意しようとすると途端に不都合に見舞われてしまうのでした。
ここではそういった状況を少しでも打開できるようにするために、FTP の主に経路確保の仕組みについて触れてみようと思います。
FTP の仕組み
FTP は通信の際に、"コントロールコネクション" と "データコネクション" の二つの経路を確保します。
まず最初に確保するのが "コントロールコネクション" で、これは FTP サーバへクライアントが要求することで確立する通信経路です。通常はクライアントが空いている自由なポートを使って、サーバの 21/TCP へ接続します。コントロールコネクションでは主に制御コマンドの送信を行って、その結果を取得します。
ただ FTP では、データの送受信にはコントロールコネクションとは別の通信経路を確保して利用します。それが "データコネクション" です。ここでは主に転送するファイルのデータを取り扱います。このように制御とデータとを別の経路で取り扱うことで、データ転送中であっても停止命令を出すなどといったことが出来るようになるとのことです。
コントロールコネクションの確立
コントロールコネクションを確立するためには、まずはクライアントが目的となる FTP サーバの FTP ポート (標準では 21) へ接続を要求します。
接続が確立すると、サーバ側が、接続が成功したことを示す番号と稼働中の FTP サービスの情報を返してきます。クライアントはそれを受け取ったら、続いて USER コマンドと PASS コマンドを使用して、ユーザ認証を行います。
USER ユーザ名
PASS パスワード
いわゆる認証不要の、誰もが自由にダウンロードしてもらうための FTP サーバも世の中にはいくつもありますけど、その場合も認証手続きは必要です。その場合は基本的に、ユーザ名には匿名を示す "anonymous" を、そしてパスワードには自分のメールアドレスを指定することになります。
これらの手続きが終わったら、データコネクションを確立することが可能となります。
これには "アクティブ (Active) モード" と "パッシブ (Passive) モード" の二つの通信方式が存在し 、それによって通信方法が異なりますので、以下ではそれぞれについて別々に触れてみようと思います。
データコネクションの確立 - Active モード
まずは "アクティブモード" についてです。通常はこのアクティブモードを使用してデータコネクションを確立することになると思います。
これはクライアントが既に確立されているコントロールコネクションに対して PORT 命令を発行し、サーバー側が能動的 (Active) に PORT 命令によって与えられた情報を元に、サーバの FTP-DATA ポート (標準では 20) からクライアントへ向けてデータコネクション経路を確立しようとします。
PORT 命令では、サーバ側から見た接続先となる、クライアントの IP アドレスとポート番号が、クライアント自身によって生成されて渡されます。
PORT IP1.IP2.IP3.IP4,PortH.PortL
普通に考えればクライアント自身が自分の都合で、その値を決定できるから問題なく通信できそうな気もするのですが、実際には IPv4 ではマルチ NAT 機能によって、インターネットへデータが送信される際に、ルータによって IP アドレスを置き換えられてしまう場合があります。
置き換えるのには訳があって、IPv4 では IP アドレスの数に限りが存在するため、その利用を最小限にするために代理サーバ (NAT ルータ) を立ててそれに外部との通信を一手に引き受けてもらうようにして、IP を節約します。
そういう環境の下では代理サーバ以外にはインターネットでは利用できないプライベートアドレスというものを設定しますので、クライアントが PORT 命令を発行した場合には IP アドレスとしてそのプライベートアドレスが渡されてしまうため、サーバがそれを元にクライアントへ接続しようとするとエラーとなってしまうのでした。
けれどこれでは FTP をまったく利用できなくなってしまうので、代理サーバの多くがクライアントの通信を監視して、PORT 命令内の IP アドレスも書き換えると同時に、FTP サーバからそれ宛に届くパケットの受信を許可してて正常に通信が行われるように計らってくれます。
もっともすべての通信を監視してくれるわけではなくて、FTP サーバへの接続のみを監視するのが普通ですので、標準の 21 番以外のポートで待ち受けているサーバへ接続しようとしたときには、代理サーバの監視からもれてしまって、正常に通信することが出来なくなってしまうのでした。
データコネクションの確立 - Passive モード
続いて "パッシブモード" のお話です。このモードは基本的に、明示的に指定した場合にのみ利用される確立方法です。
クライアントが既に確立されているコントロールコネクションに対して PASV コマンドを送信すると、サーバは自分自身に待ち受け用のポートを用意して、その情報をクライアント側へ返し、クライアントから接続されるのを受動的 (Passive) に待ちます。そしてクライアントはその情報を元に、データコネクションを確立します。
この方法の場合はクライアント側からサーバへ接続の要求がなされるので、NAT 環境でも正常に IP アドレスの書き換えが行われます。特別な監視を行って置き換えるような必要がなくなるので、多くの場合、パッシブモードにすれば正常に通信が出来るようになることが多いです。
ただし、クライアント側のポート番号も、サーバ側のポート番号も、どちらともデータコネクションを確立する手続きに入るまでは決定しないので、そのために不都合に見舞われたりもするのでした。
パケットフィルタでの問題
パケットフィルタを設定する場合、その特殊なコネクションの張り方から、いろいろと困る場合があります。
Active モード
アクティブモードの場合、標準ポート (21) を待ち受けに利用しているサーバの場合は次のことに気をつければ基本的に問題なしです。
- クライアントの任意のポートから、サーバ側の 21 番ポートへの通信を許可。
- サーバ側の 20 番ポートから、クライアントの任意のポートへの通信を許可。
これはあくまでもインターネットに直接接続されているクライアントであるか、または FTP を想定した NAT 変換がなされる場合のみでのお話です。他にも標準ポート以外ですと、NAT 変換の正常に FTP 接続を可能とする機能が上手く働かないことがほとんどでしょうから、そのあたりも注意しておく必要があります。
もっとも、それがなされない環境ではパケットフィルタ以前の問題で接続できないのですけど。
Passive モード
パッシブモードの場合、データコネクションのポート番号がクライアントとサーバの両者ともにそのときまで定まりませんので、パケットフィルタによって保護されている環境の場合、制御するのはなかなか難しいのではないかと思います。
考えられるものとしては、通信可能なクライアントとサーバを特定してその間では制限なくアクセスすることが出来るようにするとか、またはクライアントかサーバソフトウェアを書き換えて特定の範囲のポートを使うようにするなど、なかなか難しそうです。