ftpをsshでトンネルできるか

出来るけど、現実的じゃないってのが結論かな。FTPプロトコルは制御チャネルとデータチャネルの2つのTCPコネクションを使っているので、この2つのコネクションをトンネルしてあげる必要ある。制御チャネルはTCP:21を使っているので、これはすぐトンネルが掘れる。

% ssh -L2001:localhost:21 server

これで認証までは通る。でもってactiveモードにして、sendportコマンドを送る。

ftp> passive
Passive mode off.
ftp> sendport
Use of PORT cmd off.

この時点でこのftpクライアントが使っているポートを調べる。

$ netstat -n | grep 2001
tcp        0      0 127.0.0.1:47760         127.0.0.1:2001          ESTABLISHED
tcp        0      0 127.0.0.1:2001          127.0.0.1:47760         ESTABLISHED

データ制御チャネルの発信ポートは47760。それから、サーバ側のポートも調べる。

% netstat -n | grep ftp
% netstat -n | grep 2001
tcp        0      0 server:32889            server:ftp              ESTABLISHED
tcp        0      0 server:ftp              127.0.0.1:32889         ESTABLISHED

クライアントの制御チャネルの発信ポートから、サーバの制御チャネル受信ポートに向けてデータチャネル用のトンネルを掘る。

$ ssh -f -n -L32889:localhost:47760 server

これで一度だけデータ転送できる。やってみたけど、本当に一度だけだ。う〜ん、まったく現実的じゃないな。この方法は

実用SSH 第2版―セキュアシェル徹底活用ガイド

実用SSH 第2版―セキュアシェル徹底活用ガイド

の11章に延々と書いてあったんので「わ、できるのかな」と期待した私がバカでした。。