多段SSHはProxyJumpと-Jオプションで

2022年8月20日

SSH

前回は ssh-agent の Agent forwarding の紹介をしました。

SSH
SSHのForwardAgentでローカルPCの鍵をサーバで使う

前回は macOS の ssh-agent で SSH 鍵のパスフレーズの入力を省略する方法を解説しました。 今回はその ...

続きを見る

前回の記事で man ssh コマンドの -A オプションの説明を読んでいたら、踏み台を経由して目的のサーバに SSH するときに便利な -J オプションと、 ~/.ssh/configProxyJump という設定があることに気が付きました。さっそく試してみたので備忘録。これまで踏み台を経由するときに使っていた ProxyCommand の設定はこちらに置き換えられそうです。

設定内容は SSH to remote hosts through a proxy or bastion with ProxyJump | redhot.comman ssh コマンドと man ssh_config を参考にしています。対応しているバージョンは ssh v7.3 からとのことですが、利用できるかどうかはご自身の環境の man ssh コマンドで確認ができます。

目次

  1. -J オプション
  2. ProxyJump

-J オプション

~/.ssh/config に Host の情報を書きます。

Host bastion1
    HostName 192.168.0.10
    User ubuntu
    IdentityFile ~/.ssh/id_ed25519_bastion1

Host bastion2
    HostName 192.168.0.11
    User centos
    IdentityFile ~/.ssh/id_ed25519_bastion2

Host host1
    HostName 192.168.0.20
    User ec2-user
    IdentityFile ~/.ssh/id_ed25519_host1

-J オプションを設定して、踏み台サーバ(bastion1)を経由して目的のサーバ(host1)に接続ができます。

ssh -J bastion1 host1

踏み台が複数ある場合はカンマで区切ります。

ssh -J bastion1,bastion2 host1

man ssh コマンドは以下のように書かれています。

-J
Connect to the target host by first making a ssh connection to the jump host described by destination and then establishing a TCP forwarding to the ultimate destination from there. Multiple jump hops may be specified separated by comma characters. This is a shortcut to specify a ProxyJump configuration directive. Note that configuration directives supplied on the command-line generally apply to the destination host and not any specified jump hosts. Use ~/.ssh/config to specify configuration for jump hosts.

man ssh

ProxyJump

さきほどの例では -Jオプションに踏み台サーバを指定しましたが、~/.ssh/config に ProxyJump の設定をすることで -J オプションと同じ効果を得ることができます。

Host bastion1
    HostName 192.168.0.10
    User ubuntu
    IdentityFile ~/.ssh/id_ed25519_bastion1

Host host1
    HostName 192.168.0.20
    User ec2-user
    IdentityFile ~/.ssh/id_ed25519_host1
    ProxyJump bastion1

bastion1 を経由して host1 に接続する場合は以下のコマンドで。

ssh host1

踏み台が複数ある場合は -J オプションと同じようにカンマで区切ります。

Host bastion1
    HostName 192.168.0.10
    User ubuntu
    IdentityFile ~/.ssh/id_ed25519_bastion1

Host bastion2
    HostName 192.168.0.11
    User centos
    IdentityFile ~/.ssh/id_ed25519_bastion2

Host host1
    HostName 192.168.0.20
    User ec2-user
    IdentityFile ~/.ssh/id_ed25519_host1
    ProxyJump bastion1,bastion2

man ssh_configコマンドには以下のように書かれています。

ProxyJump
Specifies one or more jump proxies as either [user@]host[:port] or an ssh URI. Multiple proxies may be separated by comma characters and will be visited sequentially. Setting this option will cause ssh(1) to connect to the target host by first making a ssh(1) connection to the specified ProxyJump host and then establishing a TCP forwarding to the ultimate target from there. Setting the host to none disables this option entirely.

Note that this option will compete with the ProxyCommand option - whichever is specified first will prevent later instances of the other from taking effect.

Note also that the configuration for the destination host (either supplied via the command-line or the configuration file) is not generally applied to jump hosts. ~/.ssh/config should be used if specific configuration is required for jump hosts.

man ssh_config

-技術ブログ
-