無知ゆえに、多段 SSH 接続設定を、すっきりできずに悶々としていたが、やっとそれらしい設定方法が分かった。
ただし、私自身がよく分かっていないため、正しい設定方法かどうかは不明。よって、自己責任でどうぞ。
今回の環境は、AWS の VPC 上に環境があり、パブリック IP が付与されているサーバは、踏み台のみで、他のサーバは、プライベート IP のみとする。
踏み台サーバ IP:1.2.3.4
プライベートサーバ:10.0.0.1
RLogin の接続設定は、2つ作成する。
1つは、ローカルマシンで SOCKS プロキシとして動作する設定。
もう1つは、上記プロキシ経由で、目的のプライベート IP マシンへ接続する設定。
では、設定方法の説明をする。
踏み台サーバ接続設定
サーバ設定を新規追加。
エントリー名:「aws_bastion」
Server Address:「1.2.3.4」
Socket Port:「ssh(22)」
User Name:「ec2-user」
SSH Identity Key の参照ボタンを押下し、踏み台サーバへログインするための秘密鍵を設定する。左のツリーから「プロトコル」を選択
「ポートフォワードだけ行う」をチェック
「エージェント転送を有効にする」をチェック
「ポートフォワード」ボタンを押下
「新規」ボタンを押下
Listened の「Local Socks」を選択
Host Name:「localhost」
Port:「10022」
「OK」ボタン押下
「閉じる」ボタン押下
「OK」ボタン押下
で、踏み台サーバへの接続設定は完了。
プライベートサーバ接続設定
サーバ設定を新規追加。
前接続先:「aws_bastion」
※ 前接続先は、この接続を行うときに、自動的に指定した接続が行われる設定。
Server Address:「10.0.0.1」
Socket Port:「ssh(22)」
User Name:「ec2-user」
SSH Identity Key の参照ボタンを押下し、踏み台サーバへログインするための秘密鍵を設定す「Proxy Server」の「設定」ボタンを押下
Select Proxy Protocol :「SOCKS5」
Over SSL :「使用しない」
Server Option
Proxy Server Address:「localhost」
Socket Port:「10022」 ※踏み台サーバのポートフォワード設定で指定したポート
「OK」ボタン押下
左側のツリーでプロトコルを選択
「エージェント転送を有効にする」をチェック
「OK」ボタン押下
以上で、設定完了。
aws_private を接続すると、自動的にaws_bastion の接続も行われ、無事に目的のプライベートサーバーに接続できる。
今回の設定方法以外でも、Chat Script などを使えば、多段 SSH 接続は行える。
がしかし、以下で説明する接続方法の場合に都合が良い。
- プロトコルハンドラ経由での呼び出し
- コマンドラインからの呼び出し
接続先ホストが異なるだけの場合、上記方法であれば、RLogin 側の設定を、増やす必要がない。
コマンドラインの場合は、もう少し自由度がある。
では、実際の接続例を記述しておく。
プロトコルハンドラでの接続
プロトコルハンドラとは、「ssh://hostname などの URL リンクで起動・接続できるようにハンドラを登録する」機能である。
HTML などで、サーバ接続 URL をリンクで作成しておけば、それをクリックすることで RLogin が起動し、サーバに接続できる。
RLogin の Server Select 画面で、「aws_private」を右クリックし、「プロトコルハンドラに登録」を選択デフォルト値のまま、「OK」ボタンを押下
次に、HTML で接続先リンクを作成
link.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Hosts</title>
</head>
<body>
<h1>サーバ一覧</h1>
<ul>
<li><a href="ssh://10.0.0.1">プライベートサーバ</a></li>
</ul>
</body>
</html>
Chrome などで、link.html ファイルを表示して、サーバのリンクをクリックすると、ダイアログが表示されるので、「アプリケーションの起動」をクリックすると、RLogin が起動し、サーバに接続される。
コマンドラインからの呼び出し
コマンドラインからの呼び出しは、もう少し自由度がある。
プロトコルハンドラでは、RLogin で登録した設定でのみ起動できないが、コマンドラインでは、それも変更できる。
今回は、趣向を凝らし、ディレクトリ名が設定名(エントリ名)で、ファイル名がサーバ名として接続されるような、バッチファイルを作成した。
ファイルは、以下のような構成とした。
├ aws_private/
│ └ 10.0.0.1.bat
└ env.bat
env.bat は、RLogin のパスを設定している。
path D:\appli\rlogin;%PATH%
10.0.0.1.bat の内容は、全ファイル共通であり、ディレクトリ名とファイル名を解析し、RLogin に渡している。現在は、エントリ名とホストのみ設定できる。工夫しだいで、プロトコル、ユーザ、パスワードや、ポートなども渡すことが出来る。
@echo off
setlocal
call "%~dp0..\env.bat"
set HOST=%~n0
set PDIR=%~p0
call :GETENTRY "%PDIR:~0,-1%"
start /b RLogin.exe /inuse /entry %ENTRY% /ip %HOST%
goto :EOF
:GETENTRY
set ENTRY=%~n1
exit /b