プライベートサブネット内のWebサーバにブラウザでアクセスする方法
こんにちは、Masuyama です。
私の業務内での検証の都合上、AWS のプライベートサブネット内に Web サーバを立てる機会がありました。
その際、Web サーバにブラウザでアクセスをして画面を確認したかったのですが、パブリックサブネットの踏み台サーバに GUI 環境を作るのが面倒でした。
そこで今回は SSH ポートフォワード を用いて、踏み台サーバ経由でプライベートサブネット内の Web サーバにローカルのブラウザからアクセスする方法を紹介します。
前準備としての環境構築ですが、私の書いた別な記事では、CloudFormation で一発で踏み台サーバ、そしてプレイベートサブネット内に 1 台のインスタンスを立てる方法を紹介しているので試したい方はご活用ください。
→CloudFormation で踏み台サーバとプライベートサブネット内インスタンスを作成する方法
SSH ポートフォワードとは
これは AWS に固有の技術ではなく、一般的に使われている技術となります。
直接アクセスできないようなサーバに対して特定のポートでアクセスしたい時に、そのサーバにアクセスできる踏み台サーバと SSH でまず通信経路 (トンネル) を確立し、その通信経路を使って目的となるサーバへ指定したポートでアクセスできるというものです。
他の方の記事ですが、本技術について非常に単純完結にまとめられている記事があるので紹介させていただきます。。
→sshポートフォワーディング
SSH ポートフォワードにもいくつか種類があるのですが、今回は ローカルフォワード を使います。
システム情報とパラメータ
いくつかぼかしているところもありますが、今回の環境については以下の通りです。
- 踏み台サーバのパブリック IP: 1.2.3.4
- Web サーバ (プライベートサブネット内) の IP: 10.1.2.100
- Web サーバの公開ポート: 80
- ローカルから Web サーバへアクセスする時に使用するポート (任意): 8888
- 踏み台サーバの秘密鍵のパス: ~/.ssh/awskey.pem (ローカル内)
ローカル環境での準備
今回は Mac を用いているので、ターミナルでコマンドを実行するだけで準備は完了します。
なお、Windows の場合は TeraTerm などの SSH クライアントソフトを使う方法があるようなので他の方の記事を紹介しておきます。
→PCのブラウザーで、踏み台サーバを経由して特定サーバのWebへアクセス (Windows Clientの場合)
Mac のターミナルの場合、実行するコマンドは以下のようになります。
ssh -i [踏み台サーバの秘密鍵パス] -fN -L [アクセスポート]:[WebサーバのIP]:[Webサーバの公開ポート] ec2-user@[踏み台サーバのパブリックIP]
なお、今回のシステム情報とパラメータに基づく実際のコマンドは以下のようになります。
ssh -i ~/.ssh/awskey.pem -fN -L 8888:10.1.2.100:80 ec2-user@1.2.3.4
このコマンドを実行することで、ローカル環境と Web サーバとの間に SSH のトンネルが踏み台サーバ経由で確立しました。
ちなみに -L (ローカルフォワード指定) の前につけている -fN のオプションについてですが、以下のような意味があります。
- -f : バックグラウンドで実行
- -N : すぐに何も実行しない
ブラウザで Web サーバにアクセスしてみる
ではいよいよ、ローカル端末のブラウザから Web サーバにアクセスしてみます。
なお、Web サーバでは Hello World と表示させるためだけの Apache を起動させています。
さて、今回の場合はアクセスに使用するポートを 8888 と指定しているので、ブラウザのアドレスバーに以下の URL を入力します。
http://localhost:8888/
問題なくブラウザで直接表示させることができました。
本来であれば直接アクセスすることができないはずの環境にある Web サーバですが、セキュアな踏み台サーバを経由することでローカルから直接アクセスしているかのように閲覧することができます。
SSH トンネルを終了する時
バックグラウンドで SSH ポートフォワードを実行させていた場合は、grep で process を探して kill しましょう。
ps -ef |grep ssh
kill 28961 # 見つけたプロ説番号が 28961 であった場合
プロセスを kill した時点で、もう一度 Web サーバにブラウザからアクセスしようとしてもアクセスできなくなっているはずです。
Discussion