~/.ssh/configで多段接続
ターミナルからsshを使うときには~/.ssh/configファイルが設定ファイルとして
使われます。
直接外部からログインできない様なサーバーに踏み台サーバーを通って ログインするときに、毎回踏み台サーバーにsshしてそこから また入りたいサーバーにログインして。。。は面倒なので そこをひとまとめにする事ができます。
最終的に作業を行いたいサーバーがserver.example.comで、
途中で中継に使うサーバーがlogin.example.comだとすると
| 1 2 3 4 5 6 7 8 9 10 |  | 
こんな感じで~/.ssh/configに書いておくと、
$ ssh server
とするだけで本来直接アクセス出来ないserver.example.com
に直接ログイン出来ます
1。
最初のHost loginは無くても良いですが単にサーバー名をloginと省略するのと
もしユーザー名とかが他と違う場合には設定しておくと便利。
また鍵指定なんかも。
2番めの方が多段接続の設定です。
ProxyCommandはサーバーに接続するときに利用されるコマンドを指定する物で、
ssh -Wを使うとクライアントの入出力を指定したホストに送る事が出来ます。
~/.ssh/configの中では%hがHostName、%pがPort(上の場合は指定がないので通常の22)
に変換されます。
上の例ではloginにsshで接続して、そこからserverへ入出力を飛ばす、
という形になるので、loginを介して、手元とserverをつなぐ形になります。
こちらの場合のIdentityFileは~/.ssh/id_rsa_for_serverを指定してますが、
これは手元の端末にある鍵です。
この接続の時にはsshにはローカルとserverが直接やり取りしてる様に見えるので
ローカルにある鍵を使って認証を行います。
なのでこの秘密鍵はlogin.example.comには必要ありません。
その昔OpenSSHが5.4より前の時にはこの-Wオプションが無くて、その場合には
nc(netcat: the TCP/IP swiss army)というコマンドを使って
ProxyCommand ssh login nc %h %p
の様に書いていました。
ncはnetcatの略で、ネットを介したcat的な感じでネットを介して入出力を飛ばす、と言ったコマンド。
他にもconnect: http://www.meadowy.org/~gotoh/ssh/connect.c
と言った似たような物もありました(今はこれ自体リンク切れ?)。
追記: 2018/11/18
踏み台サーバー側の/etc/ssh/sshd_configで
AllowTcpForwarding=no
の設定によりポートフォワードを禁止している場合、-Wを使った方法は使えません。
(原理的にポートフォワードを使っているため。)
したがってこの場合にはncを使った方法を行う必要があります。
ncが踏み台サーバー側に入っていない場合にはインストールするか
ポートフォワードを許可しても良いか検討する必要があります。
(AllowTcpForwardingはデフォルトでyesなので、noになってる場合は意図的に行っている可能性が高いです。
なので検討、というかnc使うしかない場合がほとんどだと思います。)
追記ここまで
同じ踏み台サーバーを持つ物を一括指定
同じ踏み台サーバーを持つ物は一括で指定できます。
| 1 2 3 4 5 6 7 8 9 10 |  | 
最後の所は正規表現が使えるのでserverから始まるものについては、という意味で。
(Host server1 server2とちゃんと書いてもOK。)
複数の踏み台サーバーを経由してログイン
入りたいサーバーまで一つの踏み台だけではなくて、 幾つか経由して入らないといけない時も一気に辿り着かせることが出来ます。
外から入れるのがlogin1.example.com、そこからさらにlogin2.example.com
を介して最終的にserver.example.comに入りたい場合:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 |  | 
こんな感じで順番に接続を介して行くようにすれば良いだけ。 いくつまで可能かはよくわかりませんが 原理的にはこれでいくらでも踏み台を経由することが出来ます。
Windows+PuTTYで多段ssh
plinkを使用する方法
PuTTYをパッケージでインストールすると、同時にplink.exeというコマンドも一緒にインストールされます。
これを使うと上のProxyCommandを使った多段接続と同じような事が可能になる、ということです。
設定は、
- Session: Host Nameに最終的にログインしたいサーバー(server.example.com)を書きPortを22に。

- Proxy:
    - Proxy typeをLocalに。
- Proxy hostnameに踏み台サーバー(login.example.com)を。Portは22。
- Username、Passwordに踏み台サーバー用のユーザー名、パスワードを(鍵認証にしてたりパスワードを保存しておきたくない場合はパスワードは不要)。
- Telnet command, or local proxy commandへplink %user@%proxyhost -nc %host:%portと記入。
 

- Data: Auto-login usernameへuser_at_server。
上のconfigの場合のProxyCommandに変わって
local proxy commandでplinkを行います。
ここでの%userはUsername、proxyhostは上のProxy hostname、
最後の%host、%portはそれぞれSessionの所で指定したHost Name
とPortになります。
コマンドプロンプトからplink.exeのあるC:\Program Files\Puttyへ行って
plink [email protected] -nc server.example.com:22
と打つと同じ事ができるので確認出来ます。
ちなみにここでもncがplinkのオプションとして使えるように内部に組み込まれてます
2。
が、何故かうまくいかない。。。
とりあえずCygwinからncを使った~/.ssh/configを書いて試してみると問題なく行けました。
また、コマンドプロンプトからコマンドを打ってみると
C:\Program Files\PuTTY> plink.exe [email protected] -nc server.example.com:22
[email protected]'s password:
SSH-2.0-OpenSSH_4.3
と、パスワードを打った後に固まります。
違うWindowsパソコンでも同じようになったので、 どこか自分で勘違いしてる所があるんだと思いますが、よく分からず、 結局次の方法へ。
ログインサーバーにログインしてさらにsshコマンドを実行する
こちらの設定は
- Session: Host Nameに踏み台サーバー(login.example.com)を書きPortを22に。

- SSH: Remote Commandにssh server.example.comを書き込む。

- Data: Auto-login usernameへuser_at_login。
です。単に踏み台サーバーにログインしてそこでさらにsshを実行するだけです。
こちらは問題なく上手く動きました。
最初のセッションの所やDataでのユーザー名がログインサーバーのものになってしまうので、 セッション名としてきちんと分かるように最終的なサーバー名とかを入れておく必要があります。
また、この方法だと、loginとserverが交信して改めてsshセッションを作るので
鍵認証などの場合はloginに秘密鍵があって、それに対応する公開鍵が
serverに登録してある必要があります。
その辺りさえ気をつけておけば特に問題は無く使えています。
ショートカットの作成
上のどちらの場合でも
にあるような感じで起動オプション付きのショートカットを作っておけば PuTTYの開始ウィンドウも飛ばして一気に最終的なサーバーを開くことが出来ます。
Gitサーバーに対する多段接続
基本的に通常のsshと同様の設定を行うことで直接アクセスできない Gitサーバーに対してもsshプロトコルを使って多段接続することが出来ます。

