Windows ftp.exe の怪
提供: tknotebook
現象
Windows付属の ftp.exe でファイル転送ができない。
トラブル発生条件は以下の通り。
- サーバ IIS
- クライアント FTP.exe
- モード Passive
手順
- クライアントをサーバに接続しログイン。
- quote PASV でサーバをPassiveモードにする。
- PUT や DIR を実行すると 425(データ転送用接続確率失敗) エラーになる。
サーバが IIS でなければ起きないし、クライアントを ftp.exe 以外にしても起きない。
原因
実は Windows の ftp.exe は Passive モードをサポートしていません。Protocol Analyzer で電文を追ってみると、 quote PASV で、サーバに PASV コマンドを送り、レスポンスを受けた後、サーバに PORT コマンドを送ってしまいます。 そもそも quote PASV の quote コマンドはサーバに任意の文字列を送るためのコマンドなので、ftp.exe は Passive モードなんて 知ったこっちゃありません。
IIS は PORT コマンドに従って、データ転送用接続を確立しますが、すぐに接続を切ってしまいます。これが結局エラー425を引き起こします。 おそらく IIS は自分がPassive なのに サーバ側からデータ接続を確立するように指示が来たことに、不審の念があるのでしょう。
CENT OS の vftpd では、PORT コマンドが通知された時点で速やかに接続をサーバより行い、その接続がデータ転送が終わるまで維持されるので、Active モードとして処理が進行し問題は起きません。ただし、当然 Passiveモードを前提に組んだファイアウォールなどが挟まっている場合はトラブルが起きるでしょう。
対処
Passive を使いたいなら ftp.exe を使うことは諦めるしかありません。