sshによるファイアーウォール越え

sshのポートフォワード機能を使って,ファイアーウォールを通過してファイァーウォール内のマシンにログインする方法を考えます.
想定としましては,自宅のWindowsマシンから,会社や研究所のネットワークの中のマシンに入るとします.

通常,一度,ファイアーウォールもしくはログイン専用サーバに一度ログインしてネットワークに入り,そこからネットワーク内のマシンにログインするという2度手間になります.それが面倒なので,ファイァーウォールのroot権限は有るものとして,一発で入る方法を考えます.また,自宅のWindowsマシンからファイァーウォールに到達するためのunixマシン(自宅FW)も有るとします.LinuxでもBSDでも良いです.要は,sshのポートフォワードを常にしてくれるマシンだったら良いです.

図にすると,こんな感じです.

 +--------+  +------+           +------+  +----------+
 |Windows |----|自宅FW|----インターネット----|会社FW|----|内部マシン|
 +--------+  +------+           +------+  +----------+

んで,「Windows」→「内部マシン」に一発で入りたいと.

さて.

まず,「自宅FW」が,「会社FW」に信用されていなければなりません.
sshは,パスワード認証は不可としましょう.鍵認証を使います.鍵があれば,鍵のパスワードはヌル(空のパスワード)でも良いと思っています.
信用されるために,次のことを行います.

  • 「自宅FW」の公開鍵を,「会社FW」の.ssh/authorized_keysに登録する.(=「会社FW」に信用してもらうために,「自宅FW」を「会社FW」に受け入れる準備をする)

これで,「自宅FW」から「会社FW」に,sshで入れるようになるはずです.
で,入ったついでにポートフォワードをします.

  • 「自宅FW」から,「会社FW」に入り込んでポートフォワードをする

#[自宅FW] ssh 会社FW -L localhost:50022(自宅FWの適当なポート):内部マシン名:22

このコマンドの意味は,

localhost(=「自宅FW」)の「適当なポート(例:50022)」を,(「会社FW」から見た)「内部マシン」の「ポート22」に転送する

ということです.
最後の「22」は普通のsshのポート番号なので,変えるなら変えても構いません.

次に,Windows側の準備として,素晴らしいソフトである「PortForwarder」の設定をします.
fuji-climb: Top
(PortForwarderのダウンロードとインストールは済ませておいて下さい.設定ファイルについては,これから御説明致します)

PortForwarderの設定ファイルサンプルのページには,このような例が示されています.
fuji-climb: Top
(以下の例は,適当に省略致しました)

Host my_server
HostName test.example.xx
User toh
LocalForward 10023 localhost:23

これに,ファイァーウォール越えのための設定を,次のように加えます.

Host my_server
HostName test.example.xx
User toh
LocalForward 10023 localhost:23

LocalForward Windowsの適当なポート localhost:50022

「50022」は,「自宅FW」上で設定したものです.要は,「Windowsマシンのローカルな適当なポート」を,test.example.xxマシンのポート50022に転送する」という設定です.test.example.xxというのは,今回で言う「自宅FWマシン」になります.「自宅Windows」から「自宅FW」へは,当然,sshでログインできる設定にしておいて下さい.
これをconfig.txt等として保存して下さい.

これで終わりです.PortForwarderを起動するのを忘れずに.

Windowsマシン」から「内部マシン」に入るには,適当なsshサポートされているターミナルソフト,TeraTermPoderosaPuttyなどで,次のようにアクセスします.

アクセス先マシン:localhost
アクセス先sshポート:Windowsの適当なポート

sshの鍵を作るときにパスワードをヌルにすれば,一発で入れるはずです.
つまり,「localhost:Windowsの適当ななポート」にアクセス→PortFowarderが,「localhost:50022」(=自宅FWの適当なポート)に転送してくれます.

ところで,既に「自宅FW」では,前述のように次のようなコマンドが実行されています.

#[自宅FW] ssh 会社FW -L localhost:50022(自宅FWの適当なポート):内部マシン名:22

従って,「Windowsマシン」からのパケットの流れは,次々と転送されます.

localhost(Windowsマシン):Windowsの適当なポート→localhost(自宅FW):50022(自宅FWの適当なポート)→内部マシン:22

これでOkです.

最後に,これを読むかもしれない職場の同僚にアドバイス
名前解決の観点から,「内部マシン」の設定は,上位ドメインが考慮されます.なので,うまくいかなかったら,IPアドレスで指定するか,内部でのトップドメインまでフルに書いて下さい.あと,TeraTermを使う場合,鍵ファイル(=秘密鍵のファイル)は,「OpenSSH形式」で作ったものを指定して下さい.

p.s.
自宅FWでは,オプションを付け足すのもアリです.例えば...

#[自宅FW] ssh 会社FW -N -t -L localhost:50022(自宅FWの適当なポート):内部マシン名:22 &