みなさんこんにちは、荒堀と申します。
今回は、複数台のEC2を経由してSSHを行う際に、使うと便利なProxyJumpを紹介します。
- 概要
- 参考
- 実行環境
- 構成
- 準備
- Webサーバーへ、踏み台サーバーを経由して接続
- 踏み台サーバーにローカルポートフォワードして、Webサーバーまでの経路を作成
- Webサーバーまでローカルポートフォワードして、Amazon Aurora MySQLまでの経路を作成
- おわりに
概要
ProxyJumpで記述すると、多段のSSHがシンプルなコマンドになる- コマンドで指定する場合は
-Jを使う - 途中のサーバーのキーペアファイルは、
~/.ssh/configにファイルパスを指定する
- コマンドで指定する場合は
- 多段のローカルポートフォワードも可能
参考
man ssh_configやman sshで詳細が確認できます。
実行環境
WindowsのWSLでやっています。
PS > wsl --list --verbose NAME STATE VERSION * Ubuntu Running 2
構成
構成は以下のようになります。

- 踏み台サーバー
- パブリックサブネットに配置
- 接続用PCからのSSHのみ可
- キーペアファイルあり
- Webサーバーとは異なる
- Webサーバー
- プロテクテッドサブネットに配置
- 踏み台サーバーからのSSHのみ可
- ALBからのHTTPも可だが、構成図からは省略
- キーペアファイルあり
- 踏み台サーバーとは異なる
- Amazon Aurora MySQL
- プライベートサブネットに配置
- WebサーバーからのMySQLのみ可
この構成でいろいろ接続して、最終的に接続用PCからAmazon Aurora MySQLにDB接続します
準備
キーペアファイルの準備
Windows・WSL特有の問題かと思います。
パーミッションの変更
WSLのSSHコマンドでキーペアファイルを使うために、ファイルのパーミッションを400に変更します。
ですが、/mnt/c/以下にある、Windowsと共有しているファイルのパーミッションはWSLからは変更できません。
そのため、home下にkeys/{project名}でディレクトリを作成し、そこにコピーした後にchmod 400をします。
キーペアファイルの改行コード
Tera Termで使っている場合は改行コードがCRLFでも可能ですが、今回はLFにする必要があります。
Webサーバーへ、踏み台サーバーを経由して接続
-Jオプションを使ったやり方
~/.ssh/configに、以下のように書きます。
Host hogehoge-bastion
HostName {踏み台サーバーのIPorエンドポイント}
User ec2-user
IdentityFile {踏み台サーバーのキーペアファイルのパス}
Host hogehoge-web
HostName {WebサーバーのプライベートIP}
User ec2-user
IdentityFile {Webサーバーのキーペアファイルのパス}
その後、以下のコマンドを実行すると、WebサーバーにSSHでログインできます。
ssh -J hogehoge-bastion hogehoge-web
ProxyJumpを使ったやり方
経由するサーバーの指定は、~/.ssh/configに、以下のようにProxyJumpを指定して書きます。
Host hogehoge-bastion
HostName {踏み台サーバーのIPorエンドポイント}
User ec2-user
IdentityFile {踏み台サーバーのキーペアファイルのパス}
Host hogehoge-web
HostName {WebサーバーのプライベートIP}
User ec2-user
IdentityFile {Webサーバーのキーペアファイルのパス}
ProxyJump hogehoge-bastion
コマンドがシンプルになります。
ssh hogehoge-web
踏み台サーバーにローカルポートフォワードして、Webサーバーまでの経路を作成
一旦ProxyJumpから離れますが、ローカルポートフォワードする場合を説明します。
ローカルの8989番ポートを踏み台サーバーまで延伸させて、Webサーバーの22番ポートへアクセスする場合は、以下のように設定します。
Host portfwd-bastion-web
HostName {踏み台サーバーのIPorエンドポイント}
User ec2-user
IdentityFile {踏み台サーバーのキーペアファイルのパス}
LocalForward 8989 {WebサーバーのプライベートIP}:22
以下のコマンドでローカルポートフォワードができます。
ssh portfwd-bastion-web
正しくローカルポートフォワードできているかは、Tera Termで確認できます。localhostの8989番ポートを指定して、WebサーバーにSSHログインできます。

Webサーバーまでローカルポートフォワードして、Amazon Aurora MySQLまでの経路を作成
ローカルの9898番ポートを、踏み台サーバーを経由してWebサーバーまで延伸させて、Amazon Aurora MySQLの3306番ポートにアクセスさせる場合は、以下のように設定します。
Host hogehoge-bastion
HostName {踏み台サーバーのIPorエンドポイント}
User ec2-user
IdentityFile {踏み台サーバーのキーペアファイルのパス}
Host hogehoge-bastion-db
HostName {WebサーバーのプライベートIP}
User ec2-user
IdentityFile {Webサーバーのキーペアファイルのパス}
ProxyJump hogehoge-bastion
LocalForward 9898 {Amazon Aurora MySQLのエンドポイント}:3306
コマンドは以下になります。
ssh hogehoge-bastion-db
VSCodeに入れたMySQLの拡張機能で、接続できました。

おわりに
SSHコマンドでProxyJumpを使うことで、簡単にプライベートサブネット内のDBまでアクセスすることができました。 いつもTera Termで2回ローカルポートフォワードしてアクセスしていましたが、この方法で大変簡単になりました。
この記事がどなたかのお役に立てれば幸いです。