FTP転送できない理由

IISのFTPのLSコマンドが、150 Opening ASCII mode data connection for /bin/ls. で止まる

問題は、ログイン出来るが、リスト表示コマンド(ls/dir)を実行したとたん、FTPクライアントが応答しなくなる。ことだ。

原因として考えられるのは、

・FTPサーバー(IIS)がおかしい
・FTPクライアントがおかしい
・ファイアウォールがおかしい

の3つだと思い、いろいろと試してみました。
<中略>
その結果、やっぱりファイアーウォールじゃん!
という結果になったのですが、FTPの動作の仕組みが原因の奇妙な罠に掛かりそうになりました。

FTPにはアクティブモードとパッシブモードという2つの通信方法があります。

アクティブモードの方が古く、初期のFTP通信から使われていたもの。
クライアントがFTPサーバーの21番ポートに接続して、
ファイル転送要求を行うと、サーバーがクライアントのポートを開き、
ファイル転送を行う。

パッシブモードは、逆にファイル転送要求を行ってから、
クライアントがサーバーの指定ポートを開き、
ファイル転送を行う。

詳しくはこちら(プロトコルに直接触れる - FTP)の解説がわかりやすいです。

なんで、モードが2つもあるんだ!?
というと、ずーっとずーっと昔のインターネットでは、クライアントとサーバーが直接通信するのが当たり前だったのですが、企業やら大学やらの内側のネットワーク機器へのアタックを防ぐFireWallなるものが誕生し、たとえIPアドレスがグローバル同士でも、FTPサーバーからローカルコンピュータの任意ポートへの接続が阻害されてしまう事態が起きたためと記憶しています。
昨今では、ブロードバンドルータなどを使用したプライベートアドレスを使用している事が当たり前ですので、FTPサーバーからの接続は、パケットフィルタリングなど設定しなければ不可能です。
そのため、現在では、パッシブモードが標準的です。

それを踏まえて、考えたところ、どうやらWindows Firewallでは、FTP接続ポート(Port#21)への接続は許可されていますが、PASVモードでFTPサーバーが勝手に使用する空きポートへの接続が拒否されてしまっていたようです。

FTPサーバーが勝手に使用する空きポートは予測不要ですので、FTPサーバープログラムへのすべての接続を許可する必要があります。

Windows Firewallでは、例外タブで [プログラムの追加] ボタンをクリックして、FTPサーバープログラムの実行ファイルを選択します。
今回の場合は、IISのFTPサーバー機能を使用しましたので、
  C:\WINDOWS\system32\inetsrv\inetinfo.exe
を選択しました。

これだけで、無事にFTPサーバーとの通信が行えました。

ばんざーい!

-追記-

罠について書き忘れてました。
その罠とは、Windows標準のコマンドラインFTPクライアント ftp.exe と、フリーウェアでGUIを持つ一般的なFTPクライアントのデフォルトの動作の違いです。

ftp.exe はアクティブモード、一般的なFTPクライアントはパッシブモードがデフォルトになっています。
(※Windows の ftp.exe ではパッシブモードはサポートされてないそうです)
当初、ftp.exe でテストをしていて、ローカルとリモートのFirewallをOFFにしたら、通信が出来るようになって、リモートをONにしてみても動作したので、OKと思っていたのですが、一般的なFTPクライアントでやってみるとNG。
そこで、今度は、ローカルのFirewallをONに戻して、リモートをOFFにして、、、
などと、こっちはOKだけど、あっちはX。という状況を何度か繰り返してしまいました。

だいたい、パッシブモードだとサーバー側のFireWallにはじかれる可能性があり、アクティブモードだと、クライアント側のFireWallにはじかれる可能性がある、というのが、面倒なところですね。
解決策は、やっぱりパッシブモードオンリーで、FTPサーバーへの接続は全面許可しか無いと思います。

ややこしいですね (^^;)
[PR]
by isoq | 2006-11-30 15:33 | コンピュータ
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< システムのプロパティの動作周波... IISのFTPのLSコマンドが... >>