【AWS入門】NATから紐解く、NATゲートウェイ

## なぜNATから説明するのか
ネットワークの知識があまりないけど、NATゲートウェイを利用してインフラを構築しようと考えている方や、どんなものかを知りたい方、必要か検討したい方に向けて書かれた記事です。

NATゲートウェイの仕組みを少しでも理解できれば自分でエラー解決や必要か検討することのできる判断力がつくのではないかと思い調べたので共有していこうと思います。


## 使用される用語

<details>
<summary>IPアドレス</summary>

- **定義**: インターネットやローカルネットワーク上で、デバイスを識別するための番号。IPアドレスは、インターネットやネットワークでデータを送受信する際に、どのデバイスが送信者や受信者であるかを特定するために使われます。
- **役割**: コンピュータ、スマートフォン、サーバーなどが相互に通信するために必要です。IPアドレスはデジタルの「住所」と考えることができます。

</details>

<details>
<summary>プライベートIPアドレス</summary>
  
- **定義**: 自宅や企業内など、内部ネットワークでのみ使用されるIPアドレス。外部のインターネットでは利用できません。
- **役割**: 内部ネットワーク内でデバイスを識別し、通信を行うために使用されます。

</details>

<details>
<summary>グローバルIPアドレス　
</summary>

- **定義**: インターネット上で一意に割り当てられたIPアドレス。世界中で重複しないように管理されています。
- **役割**: インターネット上のデバイスを識別し、通信を行うために使用されます。

</details>

<details>
<summary>NAT（Network Address Translation）</summary>

- **定義**: プライベートIPアドレスとグローバルIPアドレスを相互に変換する技術。
- **役割**: 自宅やプライベートネットワーク内のデバイスがインターネットと通信できるようにするために使用されます。

</details>

<details>
<summary>NATゲートウェイ</summary>

- **定義**: AWSなどのクラウド環境で、プライベートサブネットにあるリソースがインターネットにアクセスするために利用されるサービス。
- **役割**: プライベートIPアドレスをグローバルIPアドレスに変換し、インターネットへの接続を可能にします。また、インターネットから返ってくるデータを適切なリソースに届ける役割も担います。

</details>

<details>
<summary>プライベートサブネット</summary>

- **定義**: 外部のインターネットから直接アクセスできないように設定された、クラウド内の領域（サブネット）。プライベートサブネットに配置されたリソースは、インターネットから直接アクセスすることができません。
- **役割**: セキュリティを高めるために、外部からのアクセスを制限したい場合に利用されます。

</details>

<details>
<summary>パブリックサブネット</summary>

- **定義**: 外部のインターネットから直接アクセスできるように設定された、クラウド内の領域（サブネット）。
- **役割**: 外部との通信が必要なリソース（例：Webサーバー）を配置するために使用されます。

</details>

<details>
<summary>インターネットゲートウェイ</summary>

- **定義**: VPC（仮想プライベートクラウド）内のリソースがインターネットと通信するための出入口。インターネットとVPC内のリソースとの間でデータを送受信するために使用されます。
- **役割**: VPCのリソースがインターネットと通信する際に、データを送り出したり受け取ったりするゲートウェイの役割を果たします。

</details>


## NATゲートウェイのNATとは
NATは自宅からWebアプリケーションとやりとりする際にプライベートIPアドレスとグローバルIPアドレスを相互に変換する技術です。

これだけではわからないと思うので具体的に説明していきます。

### なぜNATが必要？ プライベートIPとグローバルIPの違いを解説
自宅で利用されているIPアドレスは「プライベートIPアドレス」と呼ばれており、このアドレスは自宅内のネットワークでのみ有効です。プライベートIPアドレスは、同じネットワーク内で一意でなければならず、重複することは許されません。

一方、Webアプリケーションが使用するのは「グローバルIPアドレス」です。これはインターネット全体で一意に割り当てられ、世界中で重複が許されないアドレスです。グローバルIPアドレスは、インターネット上のすべてのデバイスが互いに通信できるよう、厳密に管理されています。

自宅からWebアプリケーションにアクセスする際、プライベートIPアドレスをそのまま使ってインターネットに接続しようとすると、アプリケーション側で「このIPアドレスはわからない」と判断され、適切にレスポンスを返せなくなります。これは、プライベートIPアドレスが自宅内のネットワークでしか通用しないアドレスだからです。

この問題を解決するために、プライベートIPアドレスをグローバルIPアドレスに変換する必要があります。そこで役立つのがNAT（Network Address Translation）です。


### NATの役割

![名称未設定ファイル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819635/9e875c74-15c8-455c-9a4b-ea7393c93a7a.jpeg)

NATは、**プライベートIPアドレスとグローバルIPアドレスを相互に変換する役割** を果たします。例えば、自宅からインターネットにデータを送る（アウトバウンドトラフィック）場合、NATはプライベートIPアドレスをグローバルIPアドレスに変換します。また、インターネットから自宅のネットワークにデータが戻ってくる（インバウンドトラフィック）際には、グローバルIPアドレスをプライベートIPアドレスに変換して、自宅内の適切なデバイスにデータを届けます。

この変換により、どの端末に対してデータを送るべきかが明確になり、スムーズに通信が行えるようになるのです。NATのおかげで、自宅のデバイスがインターネット上のアプリケーションと問題なくやり取りできるようになります。






## 以上踏まえてNATゲートウェイとは
NAT（Network Address Translation）について理解したところで、次にクラウド環境でよく利用される「NATゲートウェイ」について詳しく解説します。

### NATゲートウェイの使われる場面
NATゲートウェイは、AWS（Amazon Web Services）などのクラウド環境で使用される、ネットワークアドレス変換 (NAT) サービスです。主にプライベートサブネットに配置されたリソースがインターネットにアクセスできるようにするために利用されます。

プライベートサブネットに配置されたリソースは、セキュリティ上の理由から、通常は直接インターネットにアクセスすることができません。しかし、これでは外部のAPIやサービスにアクセスする際に不便です。そこで、NATゲートウェイを使用して、**プライベートIPアドレスをグローバルIPアドレスに変換し、インターネットへの接続を可能** にします。

### NATゲートウェイの配置と動作
NATゲートウェイを設置する際、通常はパブリックサブネットに配置します。これにより、プライベートサブネット内のリソースがNATゲートウェイを経由してインターネットにアクセスできるようになります。

![NATゲートウェイ (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819635/db5eda3d-8315-91cf-00ae-ddccb3951723.jpeg)

#### プライベートサブネットからインターネットへの通信処理
* プライベートサブネットにあるリソースがインターネットに接続しようとすると、そのデータはまずNATゲートウェイに送られます。
* NATゲートウェイは、プライベートIPアドレスをグローバルIPアドレスに変換し、その後インターネットゲートウェイを経由して外部に送信します。

#### インターネットからプライベートサブネットへの通信処理
* インターネットから返ってきたデータは、まずインターネットゲートウェイを経由してNATゲートウェイに届きます。
* NATゲートウェイは、グローバルIPアドレスを元のプライベートIPアドレスに変換し、プライベートサブネット内の適切なリソースにデータを送ります。

### 配置の注意点
重要なのは、NATゲートウェイはパブリックサブネットに配置する必要があるという点です。もしNATゲートウェイを誤ってプライベートサブネットに配置してしまうと、インターネットとの通信がうまくいかなくなります。これは、NATゲートウェイが外部との接続を適切にNATするためには、インターネットゲートウェイへのルートが確立されている必要があるからです。

### セキュリティ面の考慮
NATゲートウェイには、セキュリティ上の利点もあります。例えば、パブリックサブネットに配置されたNATゲートウェイは、インターネットからの未承諾トラフィックを拒否します。つまり、**内部からのリクエストに対するレスポンスのみを受け入れる**ため、外部からの不要なアクセスからプライベートサブネットを保護することができます。

また、NATゲートウェイを利用する際は、VPC（仮想プライベートクラウド）内のトラフィックが適切にインターネットゲートウェイにルーティングされるように、ルートテーブルの設定を行う必要があります。これにより、プライベートサブネット内のリソースが、NATゲートウェイを通してインターネットと安全に通信できるようになります。

### 利用例
NATゲートウェイは、以下のような場面で利用されます。

#### Datadogなどの外部サービスと連携する場合

* プライベートサブネットに配置されたリソースが、インターネット経由で外部のモニタリングサービス（例: Datadog）にデータを送信したり、APIを呼び出したりする際にNATゲートウェイを利用します。これにより、外部サービスとの安全な通信が可能になります。
#### AWS ECSサービスがECRにアクセスする場合

* AWSのECS（Elastic Container Service）で稼働しているコンテナが、プライベートサブネットに配置されている場合、ECR（Elastic Container Registry）からDockerイメージを取得するためにNATゲートウェイを経由します。NATゲートウェイがなければ、プライベートサブネット内のリソースはインターネットにアクセスできないため、ECRからイメージをプルすることができません。
これらの利用例からもわかるように、NATゲートウェイはクラウド環境での外部サービスやAWSの他のサービスとの連携において重要な役割を果たしています。適切に設定することで、安全かつ効率的にリソースを運用することができます。

:::note info
ECSをプライベートサブネットに配置した時に、外部サービスへのアクセスができなくてとても詰まりました。
プライベートサブネットに配置している場合は、NATゲートウェイなどのサービスを利用しなければ通信ができないのも今では納得です...
:::

## まとめ
**NAT（Network Address Translation）** は、プライベートIPアドレスとグローバルIPアドレスを相互に変換する技術です。この技術により、内部ネットワーク（プライベートサブネット）にあるサーバーやデータベースが外部（インターネット）と通信できるようになります。

**NATゲートウェイ** は、プライベートサブネットにあるサーバーやデータベースがインターネットにアクセスできるようにするための重要な仕組みです。これを正しく設定することで、セキュリティを保ちながら外部との通信が可能になります。NATゲートウェイはパブリックサブネットに配置し、適切なルート設定を行うことで、クラウド環境でのネットワーク管理がより効果的に行えるようになります。

## 参考
NAT
https://wa3.i-3-i.info/word11978.html
NAPT
https://wa3.i-3-i.info/word11979.html

NATゲートウェイ
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-gateway.html
https://www.youtube.com/watch?v=R7fyKQ2e0XU
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/basics.html