rcmdnk's blog
Last update

実用SSH 第2版―セキュアシェル徹底活用ガイド

多段sshについて、ターミナルからsshを直接使う場合と WindowsでのPuTTYでの設定について、 久しぶりに設定をしなおしたのでそのまとめ。

~/.ssh/configで多段接続

ターミナルからsshを使うときには~/.ssh/configファイルが設定ファイルとして 使われます。

直接外部からログインできない様なサーバーに踏み台サーバーを通って ログインするときに、毎回踏み台サーバーにsshしてそこから また入りたいサーバーにログインして。。。は面倒なので そこをひとまとめにする事ができます。

最終的に作業を行いたいサーバーがserver.example.comで、 途中で中継に使うサーバーがlogin.example.comだとすると

~/.ssh/config
1
2
3
4
5
6
7
8
9
10
Host login
  User         user_at_login
  HostName     login.example.com
  IdentityFile ~/.ssh/id_rsa_for_login

Host server
  User user_at_server
  HostName server.example.com
  IdentityFile ~/.ssh/id_rsa_for_server
  ProxyCommand ssh login -W %h:%p

こんな感じで~/.ssh/configに書いておくと、

$ ssh server

とするだけで本来直接アクセス出来ないserver.example.com に直接ログイン出来ます 1

最初のHost loginは無くても良いですが単にサーバー名をloginと省略するのと もしユーザー名とかが他と違う場合には設定しておくと便利。 また鍵指定なんかも。

2番めの方が多段接続の設定です。 ProxyCommandはサーバーに接続するときに利用されるコマンドを指定する物で、 ssh -Wを使うとクライアントの入出力を指定したホストに送る事が出来ます。 ~/.ssh/configの中では%hHostName%pPort(上の場合は指定がないので通常の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

の様に書いていました。 ncnetcatの略で、ネットを介した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使うしかない場合がほとんどだと思います。)

追記ここまで

同じ踏み台サーバーを持つ物を一括指定

同じ踏み台サーバーを持つ物は一括で指定できます。

~/.ssh/config
1
2
3
4
5
6
7
8
9
10
Host server1
  User user_at_server1
  HostName server1.example.com

Host server2
  User user_at_server1
  HostName server1.example.com

Host server*
  ProxyCommand ssh login -W %h:%p

最後の所は正規表現が使えるのでserverから始まるものについては、という意味で。 (Host server1 server2とちゃんと書いてもOK。)

複数の踏み台サーバーを経由してログイン

入りたいサーバーまで一つの踏み台だけではなくて、 幾つか経由して入らないといけない時も一気に辿り着かせることが出来ます。

外から入れるのがlogin1.example.com、そこからさらにlogin2.example.com を介して最終的にserver.example.comに入りたい場合:

~/.ssh/config
1
2
3
4
5
6
7
8
9
10
11
12
13
Host login1
  User user_at_login1
  HostName login1.example.com

Host login2
  User user_at_login2
  HostName login2.example.com
  ProxyCommand ssh login1 -W %h:%p

Host server
  User user_at_server
  HostName server.example.com
  ProxyCommand ssh login2 -W %h:%p

こんな感じで順番に接続を介して行くようにすれば良いだけ。 いくつまで可能かはよくわかりませんが 原理的にはこれでいくらでも踏み台を経由することが出来ます。

Windows+PuTTYで多段ssh

plinkを使用する方法

PuTTYをパッケージでインストールすると、同時にplink.exeというコマンドも一緒にインストールされます。 これを使うと上のProxyCommandを使った多段接続と同じような事が可能になる、ということです。

設定は、

  • Session: Host Nameに最終的にログインしたいサーバー(server.example.com)を書きPortを22に。

20140608_putty_session_login

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

20140608_putty_proxy

  • Data: Auto-login usernameuser_at_server

上のconfigの場合のProxyCommandに変わって local proxy commandplinkを行います。

ここでの%userUsernameproxyhostは上のProxy hostname、 最後の%host%portはそれぞれSessionの所で指定したHost NamePortになります。

コマンドプロンプトからplink.exeのあるC:\Program Files\Puttyへ行って

plink [email protected] -nc server.example.com:22

と打つと同じ事ができるので確認出来ます。

ちなみにここでもncplinkのオプションとして使えるように内部に組み込まれてます 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に。

20140608_putty_session_server

  • SSH: Remote Commandssh server.example.comを書き込む。

20140608_putty_ssh

  • Data: Auto-login usernameuser_at_login

です。単に踏み台サーバーにログインしてそこでさらにsshを実行するだけです。

こちらは問題なく上手く動きました。

最初のセッションの所やDataでのユーザー名がログインサーバーのものになってしまうので、 セッション名としてきちんと分かるように最終的なサーバー名とかを入れておく必要があります。

また、この方法だと、loginserverが交信して改めてsshセッションを作るので 鍵認証などの場合はloginに秘密鍵があって、それに対応する公開鍵が serverに登録してある必要があります。

その辺りさえ気をつけておけば特に問題は無く使えています。

ショートカットの作成

上のどちらの場合でも

Windowsでのショートカットの起動オプション for MagicFormation

にあるような感じで起動オプション付きのショートカットを作っておけば PuTTYの開始ウィンドウも飛ばして一気に最終的なサーバーを開くことが出来ます。

Gitサーバーに対する多段接続

基本的に通常のsshと同様の設定を行うことで直接アクセスできない Gitサーバーに対してもsshプロトコルを使って多段接続することが出来ます。

追記: 2018/11/16

追記ここまで

Sponsored Links
  1. login.example.comへのアクセスがパスワード接続だともちろん そこで一旦パスワードを聞かれるので直接、と行った感じにはなりませんが、 鍵認証等でパスワードなしでログイン出来るようになっていれば 完全に中継サーバーの事を意識しないで使えるようになります。

  2. 古いものだとまだ組み込まれて無くてplink ... "nc server.example.com 22"とか ncを外部コマンドとして使ってる例も見られます。

Sponsored Links

« Macでアプリを再起動するAppleScript vim-markdownをアップデート: Vimスクリプトで関数の最初にs:以外のコロンが使えなくなった »

}