踏み台サーバー経由で多段SSH接続する方法

セキュリティ上の理由やネットワーク構成により、目的のサーバーに直接SSH接続できない場合があります。このような場合、一度**踏み台サーバー(Bastion Host / Jump Host)**に接続し、そこから目的のサーバーに接続する「多段SSH」が必要になります。

ここでは、ssh コマンドの ProxyCommand オプションや ProxyJump オプション、またはSSH設定ファイル (~/.ssh/config) を利用して多段SSH接続を行う方法を解説します。

1. ssh コマンドの ProxyCommand オプションを使用する

ProxyCommand オプションは、SSH接続を確立する前に実行されるコマンドを指定します。このコマンドの標準入力/出力が、目的のサーバーへのSSH接続のトンネルとして利用されます。

ssh -o ProxyCommand="ssh -W %h:%p 踏み台サーバーのユーザー名@踏み台サーバーのIPアドレスまたはホスト名" 目的サーバーのユーザー名@目的サーバーのIPアドレスまたはホスト名
  • 踏み台サーバーのユーザー名@踏み台サーバーのIPアドレスまたはホスト名: 踏み台サーバーへの接続情報です。
  • 目的サーバーのユーザー名@目的サーバーのIPアドレスまたはホスト名: 最終的に接続したい目的サーバーへの接続情報です。
  • ssh -W %h:%p: ssh コマンドの -W オプションは、標準入力/出力を介してTCPポート転送を行うためのものです。%h は目的サーバーのホスト名、%p は目的サーバーのポート番号に展開されます。

例:

  • 踏み台サーバー: bastion_user@192.168.1.100
  • 目的サーバー: target_user@10.0.0.5
ssh -o ProxyCommand="ssh -W %h:%p bastion_user@192.168.1.100" target_user@10.0.0.5

2. ssh コマンドの ProxyJump オプションを使用する (OpenSSH 7.3以降)

OpenSSH 7.3以降では、ProxyJump オプションが導入され、多段SSH接続がよりシンプルに記述できるようになりました。

ssh -J 踏み台サーバーのユーザー名@踏み台サーバーのIPアドレスまたはホスト名 目的サーバーのユーザー名@目的サーバーのIPアドレスまたはホスト名

例:

ssh -J bastion_user@192.168.1.100 target_user@10.0.0.5

複数の踏み台サーバーを経由する場合も、カンマ区切りで指定できます。

ssh -J user1@host1,user2@host2 target_user@target_host

3. SSH設定ファイル (~/.ssh/config) を利用する (推奨)

~/.ssh/config ファイルに設定を記述することで、複雑なコマンドを毎回入力する手間を省き、エイリアスを使って簡単に接続できるようになります。

~/.ssh/config ファイルを作成または編集します。

nano ~/.ssh/config

以下の内容を記述します。

# 踏み台サーバーの設定
Host bastion
    HostName 192.168.1.100
    User bastion_user
    IdentityFile ~/.ssh/id_rsa_bastion # 踏み台サーバーへの接続に使う秘密鍵 (任意)

# 目的サーバーの設定
Host target
    HostName 10.0.0.5
    User target_user
    ProxyJump bastion # ここで踏み台サーバーのHost名を指定
    IdentityFile ~/.ssh/id_rsa_target # 目的サーバーへの接続に使う秘密鍵 (任意)

設定後、以下のコマンドで目的サーバーに接続できます。

ssh target

~/.ssh/config の各オプション

  • Host: この設定のエイリアス(短縮名)です。ssh コマンドでこの名前を使用します。
  • HostName: 実際のホスト名またはIPアドレスです。
  • User: 接続するユーザー名です。
  • IdentityFile: 接続に使用する秘密鍵のパスです。
  • ProxyJump: 踏み台サーバーの Host エイリアスを指定します。OpenSSH 7.3以降で利用可能です。
  • ProxyCommand: ProxyJump が利用できない古いSSHクライアントの場合や、より複雑なトンネリングが必要な場合に使用します。
    # ProxyJumpの代わりにProxyCommandを使う場合
    Host target_old_ssh
        HostName 10.0.0.5
        User target_user
        ProxyCommand ssh bastion_user@192.168.1.100 -W %h:%p
        IdentityFile ~/.ssh/id_rsa_target
    

~/.ssh/config を利用する方法は、設定を一度行えば再利用性が高く、管理も容易なため、多段SSH接続を行う際には最も推奨される方法です。