SSHトンネルの作り方。踏み台サーバーを経由して、接続が制限されたサーバーに接続する

Tips

こんにちは、aiiro(@aiiro29)です。

この記事は次のような方に向けた内容です。

「踏み台サーバを経由して、更に別のサーバーに接続したいけれど、どうすれば良いかわからない」

「GUIのツールなら設定で踏み台サーバの情報を入力すれば良いけれど、CUIで同じことをする方法がわからない」

今回は例として、EC2からのみアクセスが許可されているRDSに対して、開発PCで起動したLaravelアプリケーションを、EC2経由でRDSに接続させる方法を紹介します。

SSHトンネルを使用するメリットとしては、

「一時的に使用するだけなので、セキュリティグループやRDSの設定は変更したくない」

といったことが挙げられます。

スポンサーリンク

前提

EC2インスタンスを踏み台サーバとして使用するため、EC2からRDSに接続できること、そしてローカルPCからEC2に接続できることを確認してください。

RDS接続までの流れ

はじめにSSHコマンドでEC2を踏み台にしたトンネルを作ります。


ssh -N -L 任意のポート番号:RDSのエントリーポイント:RDSのポート番号 -i 秘密鍵のパス -p EC2のSSHポート番号 EC2のユーザー@EC2のIPアドレス

もう少し具体的な例を次に示します。

EC2インスタンスは22番ポートを使用してSSHで接続します。

RDSはEC2から3306番ポートを使用して接続できることとします。

ローカルPCからトンネルするにアプリケーションが使用するポート番号は3333とします。


ssh -N -L 3333:RDSのエントリーポイント:3306 -i 秘密鍵のパス -p 22 ec2-user@EC2のIPアドレス

SSHトンネルを経由でRDSに接続する

SSHトンネルを作成した上でローカルPCから接続先をlocalhost(127.0.0.1)、指定したポート番号(上記の例では3333)に設定すると、RDSに接続できるようになります。

例えばMySQLコマンドを使用して接続する場合は、下記のようになります。


mysql -h localhost -u RDSユーザー -p -D DB名 -P 3333

Laravelであれば、 .env を次のように設定します。

DB_HOST=127.0.0.1
DB_PORT=3333
DB_DATABASE=DB名
DB_USERNAME=RDSのユーザー名
DB_PASSWORD=RDSのパスワード

今回はRDSに接続する方法としてSSHトンネルを作成する方法を紹介しましたが、このSSHトンネルはRDSに接続するときに限らず、

踏み台サーバーを使って接続できる他のサービスでも利用可能です。

覚えておいて損はないと思いますので、コマンドでトンネルを作成する必要が出たときに思い出して頂ければ幸いです。