読者です 読者をやめる 読者になる 読者になる

らくがきちょう

なんとなく

SSH 多段接続で三段先のサーバに接続する

SSHProxyCommand を使うと接続先サーバで自動的に指定コマンドを実行出来ます。これを利用することで「サーバ A に接続し、そこからサーバ B に接続する(二段接続)」ということが出来ます。更に、これを応用すると「サーバ A に接続し、そこからサーバ B に接続し、更にサーバ B からサーバ C へ接続する(三段接続)」ということも出来ます(四段以上の接続も可能です)。今回は多段 SSH の設定方法をメモしておきます。

目次

検証環境

検証環境は AWS 上に以下の 3 台を作成しました。ベース OS には「CentOS 7 (x86_64) - with Updates HVM (2016/02/26)」を使いました。EIP は最初の一台にだけ、割り当てました。

ホスト名 プライベートアドレス EIP
CentOS-83 192.168.0.83/24 42.40.178.xxx
CentOS-84 192.168.0.84/24 無し
CentOS-85 192.168.0.85/24 無し

SSH 接続用の公開鍵は EC2 でインスタンスを作成する際に登録済みのものを自動配布しています。構成を図にすると以下になります。EIP は「52.40.178.xxx」と伏せ字にしていますが、以降のコンフィグでも実際には本当のアドレスを指定します。

f:id:sig9:20160711093817p:plain

SSH 設定ファイルの書き方 (*~/.ssh/config)

AWS に登録し、インスタンスに配布済みの公開鍵とペアになる秘密鍵~/.ssh/id_rsa.aws という名前で保存してある前提です。今回は ~/.ssh/config を以下のように設定しました。

# CentOS-85
Host 192.168.0.85
        HostName        192.168.0.85
        Port            22
        IdentityFile    ~/.ssh/id_rsa.aws
        User            centos
        ProxyCommand    ssh -W %h:%p 192.168.0.84

# CentOS-84
Host 192.168.0.84
        HostName        192.168.0.84
        Port            22
        IdentityFile    ~/.ssh/id_rsa.aws
        User            centos
        ProxyCommand    ssh -W %h:%p 52.40.178.xxx

# CentOS-83
Host 52.40.178.xxx
        HostName        52.40.178.xxx
        Port            22
        IdentityFile    ~/.ssh/id_rsa.aws
        User            centos

構文には以下の意味があります。

項目 説明
Host SSH 接続する際に利用する名前。この名前を指定すると、定義したコンフィグで SSH 接続しに行く。正規のアドレスやホスト名を指定する必要は無く、管理しやすい任意の名前でも良い
Hostname 接続先ホストのアドレス、または FQDN を指定する
Port 接続先ホストで sshd が Listen しているポートを指定する。通常は TCP/22
IdentityFile 秘密鍵の位置を指定する
User SSH 接続する際に利用するユーザ名を指定する
ProxyCommand 接続先ホストで自動実行するコマンドを指定する

今回の設定ファイルを表にまとめると以下のようになります。1 にアクセスする為に 2 へアクセスしようとし、2 にアクセスする為には 3 にアクセスする… と振る舞います。

No. 宛先 接続元 ProxyCommand
1 192.168.0.85 (CentOS-85) 192.168.0.84 (CentOS-84) ssh -W %h:%p 192.168.0.84
2 192.168.0.84 (CentOS-84) 52.40.178.xxx (CentOS-83) ssh -W %h:%p 52.40.178.xxx
3 52.40.178.xxx (CentOS-83) N/A (Client) 無し (直接、ログインする為)

SSH ログイン確認

インターネット上のクライアントから 192.168.0.85 (CentOS-85) へ SSH の多段接続を実施してみます。実際には 192.168.0.83 (CentOS-83) や 192.168.0.84 (CentOS-84) を経由していますが、いきなり CentOS-85 へログインしているように見えます。

> ssh 192.168.0.85
Last login: Sun Jul 10 23:13:03 2016 from ip-192-168-0-84.us-west-2.compute.internal
[centos@ip-192-168-0-85 ~]$