last modified: Dec 4, 2002
ここでいう FTP とは、 特に断わらなければ RFC959 に規定された File Transfer Protocolそのもののことです。 ftp クライアントやサーバのプログラムを指す場合は、その旨明記します。 この文章は、1990年代の雑誌記事やNetNews記事の影響で記述をしたもので、 多少古い内容も含まれています。
FTP について以下のような主張を雑誌で読んだりネットワークニュースで 見たりしたことがあるのですが、大抵は誤解に基づくものです。 そのまま信じてはいけません。
(無駄ではありません。別になっている必然性があります。)
(現在はそうかもしれないが、FTP発祥時の本来の意義を挙げておいてほしい。)
FTP は、ファイルを受け送りする2者(これらは data connection で結ばれる)を、 第3者から制御できるように考えられたプロトコルです。 制御するためのコマンドを送り込むための口は control connection と呼ばれます。 RFC959 の Figure 2 を引用してみましょう。
Control ------------ Control ---------->| User-FTP |<----------- | | User-PI | | | | "C" | | V ------------ V -------------- -------------- | Server-FTP | Data Connection | Server-FTP | | "A" |<---------------------->| "B" | -------------- Port (A) Port (B) -------------- Figure 2
例えば次のような場合を想像するとよいと思います。
ベルリンやミュンヘンで FTP サーバが動いていれば、 両者間のファイル転送は高円寺の FTP クライアントからの要求で行えるのです。 普通の人が FTP クライアントを使って FTP サーバからファイルを get したり put したりしてるのは、A-C や A-B が1つに縮退した特殊な例だったのです。
control connection が data connection から独立しているのは、 FTP が想定している状況からして本質的な要求であったと言えます。
実際に、FTP を使って、 2サイト間のファイル転送を第3者サイトから制御する例を示しましょう。
高円寺に居て、那覇:/etc/motd を 普天間:/tmp/motd に転送したいとします。 これは、以下に示すように FTP の世界だけでできます。
高円寺:1% ftp 那覇 Connected to 那覇.sra.co.jp. 220 那覇 FTP server (NEWS-OS Release 4.2C) ready. Name (那覇:katsu): 331 Password required for katsu. Password: 230 User katsu logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> proxy open 普天間 Connected to 普天間.sra.co.jp. 220 普天間 FTP server (NEWS-OS Release 4.2.1R) ready. Name (普天間:katsu): 331 Password required for katsu. Password: 230 User katsu logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd /etc 那覇.sra.co.jp:250 CWD command successful. ftp> proxy cd /tmp 普天間.sra.co.jp:250 CWD command successful. ftp> proxy get motd local: motd remote: motd 普天間.sra.co.jp:200 Type set to I. 普天間.sra.co.jp:227 Entering Passive Mode (133,137,36,63,12,231) 那覇.sra.co.jp:200 Type set to I. 那覇.sra.co.jp:200 PORT command successful. 那覇.sra.co.jp:150 Opening data connection for motd (binary mode) (281 bytes). 普天間.sra.co.jp:150 Opening data connection for motd (binary mode). 普天間.sra.co.jp:226 Transfer complete. 那覇.sra.co.jp:226 Transfer complete. local: motd remote: motd ftp> quit 那覇.sra.co.jp:221 Goodbye. 普天間.sra.co.jp:221 Goodbye.
もっとも、最近は、
などの原因で、上の通りにいかないことが多いでしょう。 特に、最初のサーバに関する件は重要です。 このような3者間のファイルのやり取りは、 FTPサーバーからすれば自分の認証を経ない相手とファイル転送を行うことになり、 セキュリティ上好ましくありません。 このようなファイル転送は、今は FTP bounce attack と呼ばれ、もはやattackの範疇に入れられています。 現在では実はこれは機能とはとらえられていません。 しかし、規格上のFTPが想定していた世界では許されるべきことだったのです (see STD 3, RFC1123 section 4.1.2.6)。 この文章で集中したいのは、 FTP上control connectionとdata connectionが分かれている理由についてであり、 ファイルを安全・確実・高効率に転送するにはどうしたらよいのかという一般的な問題には これ以上触れません。
さて、上の例の "Entering Passive Mode" に注目しましょう。 FTP では data connection の片側は必ず passive mode なので、 片方のサーバは passive mode になりました。 これは、ファイアウォール等の概念とはまるで無関係です。
FTP の passive mode を、 ftp クライアントプログラムにおける passive モードと混同しないでください。 クライアントの passive モードは、 ファイアウォールを越えてファイル転送を行う際の便利のために、 比較的最近考えられたものです。 詳しくは、以下のページを参考にしてください。
普天間に telnet(あるいは rlogin)して "ftp 那覇" すればよいという人もいるかもしれません。 しかし、ファイル転送に telnet という別のプロトコルを持ち込んでしまっています。 また、遠隔で shell が動いていることを常に期待できるわけでもありません。 さらに、ftp クライアントが起動できるかどうかも、FTP プロトコルの外の問題です。 この方法には、プロトコル以外に多くの仮定が必要となっているのです。
FTP なら、FTP に閉じた仮定だけでファイルが転送できます。
高円寺の機械に、 那覇や普天間のファイルシステムを(NFS などで)mount すれば、 両者間で copy ができるでしょう。 しかしこの場合、 高円寺の OS のカーネルが沖縄のファイルの内容を本質的に必要とし、 はるばる沖縄から東京までファイルが送られてしまうという無駄が生じます。 このことは、FTP のような第3者制御を許すプロトコルを使った remote file system でないかぎり、UNIX だろうが Macintosh だろうが Windows だろうが同じことです。 ちなみに、UNIX の世界であれば、 FTP ファイルシステムというのがあるはずですが、 copy をするアプリケーション(典型的には cp(1))が read(2), write(2), mmap(2) 等だけを使っている限り、 一時的にファイルの内容を「第3者」に持って来ざるを得ません。
FTP を素直に利用すれば、高円寺と那覇、あるいは高円寺と普天間の間では、 ファイルがやりとりされることはありません。
読んでもいないものを飾りで参考文献に挙げるのはよしましょう。 「data connection と control connection を分けているのは無駄で、 意図がわからない」と主張しておきながら、 参考文献に RFC959 を挙げているのは奇妙です。
ftpd ML でのこのページに関する意見のまとめ。