状況
環境を次のように仮定する。localからはalphaのみにSSH接続可能。そこからbetaを経由して目的のgammaに接続できる。
Windows Subsystem for LinuxでUbuntu18.04を使用。~/.ssh/configに以下のように記述しておく。
Host alpha
HostName alpha.example.com
Port 22
User mura
PasswordAuthentication yes
Host beta
HostName beta.example.com
Port 22
User mura
PasswordAuthentication yes
ProxyCommand ssh -W %h:%p alpha
Host gamma
HostName gamma.example.com
Port 22
User mura
PasswordAuthentication yes
ProxyCommand ssh -W %h:%p beta
こうすると、例えばlocalにおいてgammaからファイルをダウンロードするときは
scp gamma:~/hoge/fuga/baz.dat ./
などとできるが、gammaの対象ディレクトリが深くなると面倒である。
踏み台サーバ経由のSCP
Windowsでよく利用されるFTPクライアントとしてWinSCPがある。
WinSCPでは踏み台サーバが一つの場合トンネル設定により目的のサーバにアクセスできる。しかしトンネルの数を増やすことはできない。2段以上になったときにできることはないか調べてみると次のようなページを発見した。
これらの記事にはPutty・Rloginを使うとできるとあるが、WSLを使っている身としては新たにクライアントをインストールするのは癪なのでなんとかしたい。
PuttyやRloginがやってることはポートフォワーディングなので、UbuntuのSSHコマンドで同じ動作が達成できればよい。
WSLでやってみる
WinSCPのプロキシ形式でSOCKS5を利用する場合はWSLのUbuntuで以下のように入力すればよい。alphaのパスワードを入力すると何も起こらないように見えるが、きちんと動作している。
参考ページはここ。
ssh alpha -fND localhost:10022
####オプションの説明
f: バックグラウンドで動作
N: 何もしない
D: 動的フォワーディング
-fNでつなぎっぱなしを意味する。
#WinSCP側の設定
新しい接続先にgammaのホスト名・ポート番号・ユーザ名を入力し、詳細タブを選択する。
プロキシ形式でSOCKS5を選択。Ubuntuで入力したコマンドに従ってプロキシホスト名(localhost)とポート番号(10022)を入力し、「ローカルホストからもプロキシ接続を行う」にチェックを入れる。
トンネルタブに移って「SSHトンネルを経由して接続する」にチェック。サーバbetaの情報を入力。
OKを押して設定を保存する。あとはログインボタンを押してbetaとgammaのパスワードを入力すれば接続できる。
#余談
今回は2段の踏み台サーバを経由したが、目的サーバの2つ前のサーバまでトンネルを掘れば原理的には何段でも使えると思われる。
あと、コネクションを削除するときには該当プロセスを以下のように探すことができる。
SSHでトンネリング
ps aux | grep ssh