オルタナティブ・ブログ > プログラマー社長のブログ >

プログラミングでメシが食えるか!?

FTPはインターネットと相性が悪い

»

FTP(File Transmission Protocol)は古くから存在するネットワークでファイルを転送するための仕組みですが、インターネットでは使いにくいプロトコルでもあります。

・アカウント名・パスワードをはじめとして全てのやりとりは暗号化されずに行われるため、通信を傍受されるとパスワードも内容も筒抜け。
 そのため、重要なデータのやりとりにはほとんど使われず、Anonymous(匿名)でのデータ配布に使われることが多い。しかし、それも今時はHTTPで十分であるとも言える。
・コントロールコネクションとデータコネクションの2つのコネクションを使うため、NATやファイアーウォールとの相性が悪い。
 アクティブモードの他にパッシブモードも考え出されたが、それでも扱いが難しい。

最初の問題はFTPとしてはどうしようもないものなので、傍受されても問題ない用途で使われることが多いので、まあ、問題ないとも言えます。
一方、もう一つの技術的な問題はネットワーク技術者にとって非常に悩ましい問題です。

もう少し分かりやすく書いてみると、FTPはコマンドのやりとりと、データのやりとりで別のコネクションを使うのが特徴です。他の多くのプロトコルはコマンドもデータも一つのコネクションで行うものがほとんどです。なぜFTPは別のコネクションを使ったかというのは歴史的な背景があるのですが、FTPが考え出された頃はネットワークといってもつながっているコンピュータの数はたかが知れており、それこそ初期には1台のホストで1つのFTPクライアントしか使えなかったようなものだったのです。

最初のFTPの仕組みでは、クライアントはサーバの21番ポートに接続し、コマンドのやりとりに使うコネクションを確保し、データの転送が必要になった時点でクライアントは20番ポートで接続受け付け準備を行い、サーバからクライアントの20番ポートに接続してデータを送信する、という仕組みでした。データの送信方向を考えればサーバからクライアントに接続しにいくのは自然な方向とも言えるでしょう。しかし、この方法では1ホストで複数のFTPクライアントがデータ受信用に20番ポートを使うことができないため、すぐに仕様が変更され、20番以外のランダムな空きポートを使うようになりました。これが現在のアクティブモードです。

アクティブモード
・コントロールコネクション
    クライアント→FTPサーバ
・データコネクション
    クライアント←FTPサーバ

インターネットが安全で接続台数が少なかった頃にはこれで何も問題なかったのですが、その後、爆発的に普及してくると、

・グローバルIPアドレスとローカルIPアドレスをルータで変換してインターネットに接続するNATが使われるようになり、グローバルなFTPサーバ側からローカルなクライアントのデータ受信用ポートに接続するのが難しくなった。
・ランダムに使われるデータ受信用ポートを常に通過できるようにしておくのは、ファイアーウォールの考え方に合わない。

と、問題が出てきました。

そこで、パッシブモードが登場します。今度はデータを受信したいときに、サーバ側にデータ転送用のポートを準備してもらうようにしました。コネクションの方向はクライアントからサーバなので、NATでも問題ありませんし、クライアント側のファイアーウォールに大量の通過可能ポートを作る必要もありません。

パッシブモード
・コントロールコネクション
    クライアント→FTPサーバ
・データコネクション
    クライアント→FTPサーバ

もっとも、これでもサーバ側のファイアーウォールは結局、どのポートでデータ転送用の接続を受け付けるかが不定なため、ファイアーウォールは設計しにくいのです。ルーターの機能としてコントロールコネクションの様子を監視しながら動的にファイアーウォールに穴を開ける仕組みなどが登場しました。

このように、FTPは今のインターネットでは非常に使いにくい仕組みなのです。なぜ突然こんな話題を書いたかといえば、ある特殊なルーターをソフトウェアで自作したのですが、FTPがうまく使えない、という問題が出たからです。仕方がないので前述したファイアーウォールのようにコントロールコネクションの様子を監視し、データコネクションを制御するようにして対策しました。

一般的にはあまり使われなくなったFTPですが、まだまだ古いサービスやシステムでは使われており、あらためて概要くらいは頭に入れておいても損はないでしょう。

Comment(4)