WSL2 への FTP 接続は localhost じゃダメなのねえ〜[プログラミング]
(2026-09-17 00:09:52) by shinoda
< ページ移動: 1 2 3 >
WSL2 上の AlmaLinux で動かしている FTPサーバ(vsFTPd)にホスト側(親の Windows 側)から接続して put や get をしたいのだがうまくいかなくてハマってしまった。
WSL2 の AlmaLinux で起動している vsFTPd にパッシブモードで接続するんで(アクティブモードではデータ用接続が Windows 側で止められてしまうし、勝手に FW を触る権限もわしら外注作業員には許されてないけんね)、vsFTPd の設定にその旨を追加し put しようとしたんだけどうまくいかない。
<サーバ側の設定> ※関係あるところだけ
pasv_enable=YES
#pasv_address=127.0.0.1
pasv_address=172.28.196.77
pasv_addr_resolve=NO
pasv_min_port=50000
pasv_max_port=50010
<クライアント操作>
C:\work>ncftp -u admin -p adminpassword localhost
NcFTP 3.2.6 (Nov 15, 2016) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to 127.0.0.1...
(vsFTPd 3.0.5)
Logging in...
Login successful.
Logged in to localhost.
ncftp /home/admin > cd /var/www/html/temp
Directory successfully changed.
ncftp /var/www/html/temp > lcd /work/test
ncftp /var/www/html/temp > lls data*
data1.dat
ncftp /var/www/html/temp > set passive yes ←明示的にパッシブモードを指定
ncftp /var/www/html/temp > put data1.dat
The remote file "data1.dat" already exists.
Local: 120 bytes, dated 09/10/26 14:30:04.
Remote: 0 bytes, dated 09/10/26 23:42:16.
[O]verwrite? [R]esume? [A]ppend to? [S]kip? [N]ew Name?
[O!]verwrite all? [R!]esume all? [S!]kip all? [C]ancel > O
put data1.dat: server said: Failed to establish connection. ←失敗しちゃう
サーバ側には 0バイトの data1.dat ファイルができている。制御用の接続はちゃんと生きてるんで、空のファイルを作成して、実際にデータ用の接続経由でデータを送ろうとして失敗してるんだなあ・・・
結局原因は、「Windows」と「WSL(仮想的なLinux)」の間での通信で、制御用接続(21番ポート)へのフォワードはうまくいっているが、データ用接続(50000〜50010番ポートのいずれか)へのフォワードがうまくいっていないからであった。
WSL2 が立ち上がっている場合、Windows は「WSL2側で常に接続待ちになっているポートのみ」は「localhost」への接続の場合は WSL2 側にフォワードをしてくれるのだ。
「常に接続待ちになっているポート」というのは、「WSL2 上の OS で動くアプリが起動時に口を開けてまっているポート」のことで、httpd なら 80番と 443番。あるいは 8080番など。FTPd なら、21番ポート(20番はサーバからクライアントへの接続用なので違う)である。
つまり、httpd や FTPd が起動時に開けるポート番号だ。
起動後のデーモンが、例えばパッシブ通信のために一時的に開けたポート番号はフォワードされないのである。