~/.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プロトコルを使って多段接続することが出来ます。