多段 SSH をやってみる!

SSH

皆さんご存知、Secure Shell。暗号や認証を駆使して、安全にリモートコンピュータに接続できます。

SSH サーバとしては、OpenSSH などが、 SSH クライアントとしては、 OpenSSH や PuTTY、Tera Term などが代表的です。

多段 SSH

セキュリティのため、踏み台サーバと呼ばれるサーバからしか SSH 接続出来ないサーバがあったりします。そういった時に、自分の PC で"ssh"コマンドを打って踏み台サーバにアクセスし、今度はまた踏み台サーバで"ssh"コマンドを打って、というのは大変であるし、とても面倒です。到達したいサーバまでに何台ものサーバがあったりするとますます大変です。

そんな面倒な事をしないために。多段 SSH の設定をしておくと、自分の PC で "ssh" コマンドを1回打つだけで、踏み台サーバを超えて、目的のサーバに接続できます。

具体的な設定は、"~/.ssh/config"ファイルにて行います。

+---------------+                 +---------------+             +--------------+
|               |                 |               |             |              |
|    My PC      |                 |    Server1    |             |   Server2    |
|               +----------------->               +-----------> |              |
|               |                 |               |             |              |
+---------------+                 +---------------+             +--------------+

上の図で、"My PC" から "Server2" に "Server1" を踏み台サーバとして使って接続したいとしましょう。

その場合は "My PC" の "~/.ssh/config"というファイルで設定を行います。設定の方法には2つあります。

1. ssh コマンドの"-W"オプションを使用する方法
2. nc コマンドを使用する方法 (Server1 に nc コマンドがインストールされている必要がある)

それぞれの設定方法を見てみましょう。

# ~/.ssh/config
# -W オプションを使う方法
Host <Server1>
    HostName 192.168.33.10
    User <ユーザ名>

Host <Server2>
    HostName <ホスト名または IP アドレス>
    Port 22
    User <ユーザ名>
    ProxyCommand ssh -W %h:%p <Server1>

# nc コマンドを使う方法
Host <Server1>
    HostName <ホスト名または IP アドレス>
    User <ユーザ名>

Host <Server2>
    HostName <ホスト名または IP アドレス>
    Port 22
    User <ユーザ名>
    ProxyCommand ssh <Server1> nc %h %p

このような設定を行うことで、"My PC" から直接 "Server2"に SSH 接続しているかのようにアクセス出来ます。

やってみる

実際にやってみましょう。

構成

今回はローカル PC 上に2つの仮想マシンを立ち上げて多段 SSH を試してみます。

+----------------+         +-----------------+       +------------------+
|                |         |                 |       |                  |
|   My PC        |         |   Step          |       |   Target         |
|                |         |                 |       |                  |
| 192.168.33.1   +--------->  192.168.33.10  +------->  192.168.33.101  |
|                |         |                 |       |                  |
|                |         |                 |       |                  |
|                |         |                 |       |                  |
+----------------+         +-----------------+       +------------------+

"My PC" から "Target" に多段 SSH を行います。

SSH の認証方法はパスワード認証をしています。

検証

"~/.ssh/config"の中身はこちら。

# ~/.ssh/config
# 多段SSH 検証用
User twhs # すべての接続で twhs をユーザーとする
# -W オプションを使う方法
Host step_w
    HostName 192.168.33.10

Host target_w
    HostName 192.168.33.101
    Port 22
    ProxyCommand ssh -W %h:%p step_w

# nc コマンドを使う方法
Host step_nc
    HostName 192.168.33.10

Host target_nc
    HostName 192.168.33.101
    Port 22
    ProxyCommand ssh step_nc nc %h %p

今回は検証のため、"-W"オプションを使う場合の設定と"nc"コマンドを使うための設定をしています。

まずは"-W"を使う方法

☁  ~  ssh target_w
twhs@192.168.33.10's password:
twhs@192.168.33.101's password:
Last login: Wed May 14 12:31:21 2014 from 192.168.33.10
[twhs@target ~]$

接続できました!

次に nc コマンドを使う方法

☁  ~  ssh target_nc
twhs@192.168.33.10's password:
twhs@192.168.33.101's password:
Last login: Wed May 14 12:32:44 2014 from 192.168.33.10
[twhs@target ~]$

さらにこの時、"Step"サーバーで動作しているプロセスを確認してみると、

[twhs@step ~]$ ps ax | grep nc
11 ?        S      0:00 [async/mgr]
13 ?        S      0:00 [sync_supers]
<b>8059 ?        Ss     0:00 nc 192.168.33.101 22</b>
8118 pts/0    S+     0:00 grep nc

nc コマンドが動作していることがわかります。

参考にしたサイト

サルでも分かる多段ssh

asciiflow : 構成図を書くときに使用しました。