脳みそスワップアウト

揮発性なもので。おもにPHPのこととか。

WindowsのFTPクライアントはPASVモードに対応していない。

概要

Windows標準のFTPクライアントはPASVモードに対応していない。
ACTIVEモードでは標準(20,21)以外のポートに接続することは現実的じゃない(NAT問題)。

Windows標準のFTPクライアントをターゲットにする場合、
FTPサーバは標準ポートかつACTIVEモードのものを用意しないとならない。

これを知らずにハマった。

挙動

まずは接続

c:\work>ftp
ftp> open XXXXXXXX
XXXXXXXX に接続しました。
220 (vsFTPd 2.2.2)
ユーザー (XXXXXXXX:(none)): pen
331 Please specify the password.
パスワード:
230 Login successful.
ftp> debug
デバッグ オン。

ACTIVEモードで動作している(PORTコマンド)

ftp> ls
---> PORT 192,168,1,67,237,68
200 PORT command successful. Consider using PASV.
---> NLST
150 Here comes the directory listing.
arc
bin
build
etc
hoge
lib
local
penchan.mp4
project
share
univac.webm
var
work
226 Directory send OK.
ftp: 93 バイトが受信されました 0.02秒 4.23KB/秒。
ftp> put cronkick
---> PORT 192,168,1,67,237,70
200 PORT command successful. Consider using PASV.
---> STOR cronkick
150 Ok to send data.
226 Transfer complete.
ftp: 9 バイトが送信されました 0.00秒 9000.00KB/秒。

PASVモードをサポートしていないので、切り替えるコマンドが存在しない。
ダイレクトにFTPプロトコルを送信してみる。
サーバ側からPASVの利用ポートが送られてくるが、クライアントが対応しておらず、
結局PORTが送られる。

ftp> quote pasv
---> pasv
227 Entering Passive Mode (153,121,43,251,209,181).
ftp> ls
---> PORT 192,168,1,67,237,71
200 PORT command successful. Consider using PASV.
---> NLST
150 Here comes the directory listing.
arc
bin
build
cronkick
etc
hoge
lib
local
penchan.mp4
project
share
univac.webm
var
work
226 Directory send OK.
ftp: 103 バイトが受信されました 0.03秒 3.12KB/秒。
ftp> put cronkick
---> PORT 192,168,1,67,237,74
200 PORT command successful. Consider using PASV.
---> STOR cronkick
150 Ok to send data.
226 Transfer complete.
ftp: 9 バイトが送信されました 0.00秒 9000.00KB/秒。
ftp>

ちょっとへぼすぎるよね。