本記事では、AWSでNATを使い、プライベートサブネットからインターネットへの通信のみを許可する方法を紹介します。
NATとは
NATは、プライベートなIPアドレス(家庭内LANなど)をパブリックなIPアドレスに変換する技術です。この技術は例えば、インターネットと接続不可能なネットワークの中にあるサーバに、ソフトウェアをインストールすることなどに用いることができます。
今回は、AWSを使ってプライベートネットワークの中のサーバにMySQLをインストールします。
VPCの設定
VPCの作成
VPCは、基本的に以下の設定で作成しました。
![](https://coding-memo.com/cms/wp-content/uploads/2020/11/7f34fd86a68ef0887177ad6a74276f18-991x1024.png)
プライベートサブネットの作成
次に、先ほど作成したVPCの中にプライベートサブネットを作成します。
設定は以下のようにしました。
![](https://coding-memo.com/cms/wp-content/uploads/2020/11/ba3526fdc75f7b1fa4628f8fe00bca44-967x1024.png)
EC2インスタンスの作成
プライベートサブネット内にインスタンスを作成
EC2を使ってインスタンスを作成します。AMIなど、基本的に無料利用枠の種類しか使いません。特に、ネットワーク周りの設定は以下のようにしました。
![](https://coding-memo.com/cms/wp-content/uploads/2020/11/06938839346cd0c476579ea242766bec-1024x444.png)
- ネットワークに先ほど作成したVPCを設定
- サブネットはプライベートサブネット
- 自動割り当てパブリックIPは無効
踏み台用のサーバを構築
こちらでは、プライベートサブネット内に作成したサーバにSSH接続するためのサーバを作成します。最初に、以下の作業を行う必要があります。
- パブリックサブネットを構築
- インターネットゲートウェイの作成
- ルートテーブルの作成
これらを済ませた後、パブリックサブネット内にインスタンスを作成します。主に以下のように設定する必要があります。
![](https://coding-memo.com/cms/wp-content/uploads/2020/11/3e5272615e2e049b6c5e51e443a66608-1024x314.png)
秘密鍵の送信
プライベートサブネット内にサーバを作成した際にダウンロードした(もしくは既存の)秘密鍵を、scpコマンドなどを使って送ります。
その後、パブリックサブネット内に作成したサーバから、SSH接続できることを確認します。
pingコマンドを用いた通信の確認
次に、プライベートサブネット内に作成したサーバが本当に外部と通信ができないのかをpingコマンドを用いて確認します。
この際、あらかじめICMPプロトコルをプライベートサブネットのセキュリティグループに追加しておくことに注意してください。これがないとそもそもpingが許可されていないことになってしまいます。
設定したら、pingコマンドを使って確認します。
![](https://coding-memo.com/cms/wp-content/uploads/2020/12/35addf5e28f9c5fdd185423468253a20.png)
上の画像のように、pingコマンドを実行してもサーバと通信できてないことがわかります。これより、先ほど作成した仮想サーバは閉じられたネットワークの中にあることがわかります。
NATの構築
最後にNATを作成します。
NATは以下の設定で作成します。
サブネットにはパブリックサブネットを選択します。
![](https://coding-memo.com/cms/wp-content/uploads/2020/12/d105329475e27b4b56f04029275fe7ff-1-1024x538.png)
ルートテーブルの編集
パブリックではないルートテーブルに以下のように設定を加えます。
![](https://coding-memo.com/cms/wp-content/uploads/2020/12/f0bb199b2f8910b9c6c2b52f8942af15-1-1024x595.png)
これは、「0.0.0.0/0」に流れてきたデータを、先ほど作成したNATに送るように設定します。
通信の確認
NATを設定したら最後に、本当に外部と通信できるようになったのかを確認しましょう。先ほどと同じようにpingコマンドを実行して確認します。
実行すると以下のようになります。
![](https://coding-memo.com/cms/wp-content/uploads/2020/12/1ee89cb4b208daaf5235caf65cd132af.png)
しっかり通信できていることがわかりますね。
まとめ
本記事では、AWSでプライベートなネットワークから外部と通信する方法を紹介しました。これを利用すれば、ライブラリをインターネットを介してインストールしたい場合などで使えると思います。