背景
次の図(?)ように,サーバ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段階ログインといったことも可能です.