先日、会社の後輩から Windows の ftp.exe のエラー調査のヘルプを頼まれ、ftp.exe は結局 Passive 通信できるの?できないの?と確認が必要になったので調べてみました。
結論
ftp.exe は Passive モードに対応していない。
※quote pasv コマンドを実行しても実際は Active モードで通信している。
インターネットには情報があふれている
「ftp.exe Passive」で検索するといくつかの記事がヒットしますが、「Passiveモードに対応していない!」「いやっ!実はPassiveモードに対応している!」と情報が入り乱れており「結局どっちなの!」と言いたくなる状況です。
一から探していると大変なので、今回調査して参考になったサイトをこちらに記載しておきます。
- Windows ftp.exe の怪
- WindowsのFTPクライアントではパッシブモード(PASV)では接続できない?
- WindowsネイティブFTPがネットワークアプリ経由でFTPサーバーにアクセスできないのはなぜですか
Passive モードに対応していると誤解する理由
- ftp.exe は Passive モードに対応していると結論付けている記事が公開されている
- quote pasv を実行すれば Passive モード通信できると主張する情報も見つかる
- 実際 quote pasv を実行して通信できることがある
誤解の解消
ftp.exe の quote pasv について
- quote pasv は FTP サーバー側を Passive モードに切り替えるだけ
- quote pasv を実行しても port コマンドが送信され、FTP クライアント(ftp.exe)側は Active モードのまま変わらない
quote pasv を実行して通信できる理由
- ftp.exe は quote pasv 実行後も PORT を送信して Active モードで通信する
-
FTPサーバーによっては quote pasv 実行後に port を受信しても Active モードで正常応答できるものがある
※quote pasv 実行後に port を実行するとエラーになるFTPサーバーもある(IISなど)
FTPサーバーによっては通信できてしまうので誤解されているようですが、通信パケットを確認すれば実は Active モードになっていることが確認できます。
quote pasv の後 port が送信され Active モードで通信している例
こちらは IIS の Microsoft FTP Service を利用し、ftp.exe で接続。quote pasv を実行した後に port コマンドが送信され、データコネクションが失敗している例です。
以下の流れになっています。
- FTPサーバーに接続
- quote pasv を実行
-
pasv コマンドが送信される
※quote pasv コマンドにより送信されているだけ
クライアントは Active モードのまま変わらない - dir を実行
-
port コマンドが送信される
※Active モードのまま port が送信されている - list コマンドが送信される
- データ接続しようとして、接続できなかったとエラーが返される
パケットキャプチャー結果はこちら。
FTPクライアントは(10.~)、FTPサーバーは(20.~)になります。
- 27番でクライアント(10.~)から pasv を送信
- 33番でクライアント(10.~)から port を送信
- 37番で サーバー(20.~)からクライアントへFTPデータ用の接続(syn) が行われている
※ここで「サーバー」から「クライアント」への接続、
「送信元ポート」が「TCP 20番」であることから Active モードでの通信と判断できます - 47番でクライアント(10.~)から list を送信
- 51番で接続できなかったとエラーが返されている
このように、quote pasv を実行しても Active モードで通信されていることが分かります。
総括
Windows の ftp.exe では Passive モード通信ができないため、Passive モードで通信したい場合は curl(最近の Windows では標準で利用できるようになりました)や WinSCP など他ソフトを利用するようにしましょう。
蛇足
ftp.exe で通信できない場合は、Passive モードが使えない以外に、以下の原因が考えられます。
- Windows ファイアウォールで通信許可されていない
- 受信用の通信許可が必要です
- ネットワーク上のファイアウォールで通信許可されていない
- NAT や SNAT が FTP 通信を考慮していない
- Azureなどのクラウド環境で外部FTPサーバーに接続できない時は、これが原因の場合があります
今回のまとめはここまで。