SSHのDynamic ForwardでSOCKS Proxyしてみる

お客さんのサーバにアクセスするのに踏み台サーバを経由しなきゃいけないんだけど、いちいち2回ログインするのが面倒くさかったので、PuTTY付属のpfwdでDynamic Forwardしてみたら便利になった。
やべーこれは便利だと一人で盛り上がってたら「社内Wikiにやり方書いてよ」って言われたのでついでにこっちにも書いておく。


このDynamic Forwardを利用すると、SSHでログインした先をSOCKS Proxyとして利用できるので、あとはSOCKS対応アプリの設定を変更してアクセスすれば全部ログイン先からのアクセスってことになる。
Port Forwardと違って何番が何番ってのもないので便利。


SOCKS対応のアプリって何があるんだよ、って思うかもしれないけどわりと対応しているものは多い。
主要ブラウザはOpera以外だいたい対応してるし、会社のPCで確認できるだけでもThunderbirdWinSCPFFFTPTeraTermWindows Live Messengerあたりが対応していた。


WindowsだとPortForwarderとか色々あるけど、とりあえず身近なPuTTYで。
オリジナルのPuTTYには実はなくて、PuTTYごった煮版に同梱されているpfwd.exeを使う。
PuTTY本体でもトンネルの設定で「ダイナミック」を選択すれば出来るけど、pfwdならタスクトレイに常駐してくれてウィンドウが邪魔にならないのでおすすめ。

pfwdの設定

ごった煮版に同梱のpfwd_sample.iniをpfwd.iniという名前でコピーする。リネームでもいいけど。
んで、次のような感じで編集する(長いのでコメントは省略した)。

[SSH]
Host=踏み台サーバのアドレス
Port=22
Compression=1
ProtocolVersion=2
PrivateKey=踏み台サーバで鍵認証に使う自分の秘密鍵
User=踏み台サーバのログインユーザ
;Password=

[FORWARD]
01=D1080

[SSH]の部分で踏み台サーバの設定をする。

Host
踏み台サーバのアドレス
Port
踏み台サーバのsshポート
User
踏み台サーバにログインするユーザ
PrivateKey
鍵認証の場合は自分の秘密鍵
Password
パスワード。鍵認証の場合はコメントアウトでおk


続いて[FORWARD]の部分でPort ForwardとかDynamic Forwardの設定をする。
たぶんサンプルにはデフォルトでいくつか記述されていると思うので、不要なら削除するなりコメントアウトするなり。
キー名は01から連番で使うらしいんだけど、欠番があるとうまく動かなかったのでデフォルトを消すときは注意。
で、Dynamic Forwardの場合はD<ポート番号>という設定をする。このポート番号がローカルでの待ち受けポートになるので、アプリのプロキシ設定ではこのポートを指定する。一般的には1080らしい。

pfwd.exeを起動

起動する。
鍵にパスフレーズがかかってる場合はダイアログが出てくるので入力する。pageant.exeが持ってれば聞いてこない。


これで踏み台サーバに裏でログインしつつSOCKS Proxyとしてポートの待ち受けを始める。

各種アプリから接続

アプリによってまちまちだろうけどネットワークの設定とかプロキシの設定とかそれらしいところを見つけて、ホスト名=localhost、ポート=pfwd.iniで設定した番号で設定すればよし。
プロキシの種類が選択できる場合はとりあえずSOCKS 5を選べばいいと思うよ! うまくいかない場合はSOCKS 4、それでもだめな場合は何かが間違ってるかそもそも使えないんだと思う。


Firefoxの場合、network.proxy.socks_remote_dnsをtrueにするとSOCKSサーバ側で名前解決をしてくれるようになる。

Linuxの場合

LinuxっつーかOpenSSHクライアントの場合は-Dオプションで同じことが出来る。
恒常的に利用するなら~/.ssh/configのDynamicForwardで設定してもいい。

ssh -D localhost:1080 -l 踏み台サーバのユーザ 踏み台サーバのアドレス

これだと普通にログインしちゃうので裏で動いて欲しいときはPort Forwardでよくやるみたいに-Nと-fを付ければいいのかな?

ssh -N -f -D localhost:1080 -l 踏み台サーバのユーザ 踏み台サーバのアドレス