SSHでProxyCommandを使って多段ログインする

背景

次の図(?)ように,サーバA(踏み台サーバ)が外部ネットワークに公開されており,サーバB, C, ...(内部サーバ)には外部からアクセスできないようになっている環境はよくあります.

家 ----- インターネット ----- サーバA ----- サーバB
                                      +-- サーバC
                                      +-- etc...

このような環境で,外部から内部サーバにSSHでアクセスする方法として多段ログインがあります. 多段ログインとは,まず公開されている踏み台サーバにSSHで接続し,踏み台サーバから目的のサーバにSSHで接続することです.

しかし,毎回二度もSSHコマンドを叩くのは面倒なので一回コマンドを叩くだけで目的のサーバにアクセスできるようにします.

解決法

解決法には複数あり,ここではProxyCommandを使用した解決法を書きます.
ProxyCommandとはサーバへの接続に使用するコマンドを指定する機能です.(詳しくは$ man ssh_configに書いてあります)

とりあえず試す

まずはコマンドのみで試してます.
以下のように,SSHコマンドに-oオプションを付けてProxyCommandを指定します.

$ ssh -o ProxyCommand='ssh -p サーバーAのポート番号 -W %h:%p serverA' serverB

ここで,ProxyCommand内のSSHコマンドに渡している-Wというオプションはホスト名とポート番号を指定するオプションです.
また,ProxyCommandに指定した文字列の%h%pは接続先のホスト名に置換されます.
このコマンドを実行するとserverBに接続することができます.(鍵を指定していないためパスワードを聞かれると思います)

設定ファイルの編集

実際に接続できることを確認できました.
毎回長いコマンドを入力するのは面倒なので~/.ssh/configに設定を行います.

Host serverA
    HostName サーバAのIP(ホスト名)
    User サーバAのユーザー名
    Port サーバAのポート番号
    IdentityFile サーバAへの接続に使う鍵
Host serverB
    HostName サーバBのIP(ホスト名)
    User サーバBのユーザー名
    Port サーバBのポート番号
    IdentityFile サーバBへの接続に使う鍵
    ProxyCommand ssh -W %h:%p serverA

SSHコマンドを使ってアクセスしてみます.

$ ssh serverB

今度は鍵を指定しているためパスワードを入力することなくserverBに接続することができます.
これを応用すると,2段だけでなく3段階ログインといったことも可能です.