ProxyJumpを用いて、多段SSHでプライベートサブネットのEC2/RDSへ接続

記事タイトルとURLをコピーする

みなさんこんにちは、荒堀と申します。

今回は、複数台のEC2を経由してSSHを行う際に、使うと便利なProxyJumpを紹介します。

概要

  • ProxyJumpで記述すると、多段のSSHがシンプルなコマンドになる
    • コマンドで指定する場合は-Jを使う
    • 途中のサーバーのキーペアファイルは、~/.ssh/configにファイルパスを指定する
  • 多段のローカルポートフォワードも可能

参考

man ssh_configman 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回ローカルポートフォワードしてアクセスしていましたが、この方法で大変簡単になりました。

この記事がどなたかのお役に立てれば幸いです。