SSH の ProxyCommand を使うと接続先サーバで自動的に指定コマンドを実行出来ます。これを利用することで「サーバ 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」と伏せ字にしていますが、以降のコンフィグでも実際には本当のアドレスを指定します。
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 ~]$
コメント