【🔰初心者向け】NAT/NAPTを改めて理解する

## はじめに
こんにちは！ITスクールRareTECHにてCS（Customer Support）を担当している池村です。今回の記事はIPアドレスでの通信についてです。IPアドレスとNAT/NAPTに関して理解していきましょう。

:::note info
今回の記事はIPアドレスのIPv4のお話を中心に解説します。
※現在はIPv4の枯渇問題の解消のためIPv6も普及してきています。
:::


## 初心者のIPアドレスの理解レベルについて
よく言われているのはネットワーク上の住所ですよね。
正直初心者の頃はこれだけ知っておけば良いのですが、AWSのVPCなどを触っていくと、この辺りの技術がひょこっと顔を出してきますので、深めに理解することも大事になります。

## グローバルIPとプライベートIPについて
IPアドレスは大きく分けてグローバルIPアドレスとプライベートIPアドレスがあります。
グローバルは実際のネットワーク空間で使われるものですが、プライベートは社内とか家の中などで使われるIPアドレスになります。

![step8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/4ed51dc8-7dfd-4117-918f-285ba3ec114e.jpeg)


### 自宅のIPアドレスがどう切り分けられているか？

家には**一つのグローバルIPアドレス**があります。そして、その家のネットワークにつながる機器には、それぞれプライベートIPアドレスがあります。
グローバルIPアドレスは一意です。被りがないということです。プライベートIPアドレスは、家の中では被りがないですが、よその家では同じプライベートIPアドレスがあっても問題ありません。

| 機器                     | 自分の家                | 友人の家                |
|--------------------------|-----------------------------------|-----------------------------------|
| **グローバルIP（ルーター）**   | 203.0.113.228（一意）              | 198.51.100.203（一意）              |
| **スマホのIP（プライベート）** | 192.168.0.100（LAN内で一意）         | 192.168.0.100（LAN内で一意）         |
| **PCのIP（プライベート）**     | 192.168.0.101                       | 192.168.0.101                       |
| **ゲーム機のIP（プライベート）** | 192.168.0.102                       | 192.168.0.102                       |

:::note info
上記の表で見てほしいのは、グローバルIPアドレスは違う値で、プライベートIPアドレスは一緒という部分です。
:::



### LANとWAN
広域のネットワークと家の中などの狭い範囲のネットワークには名前があります。
#### LAN
ローカルエリアネットワークの略です。
会社内や家の中で使われるネットワークのことを指します。その中の機器を接続するために使われています。


#### WAN
ワイドエリアネットワークの略です。
世界規模の外部ネットワークのことを指します。

![8508E372-CC27-4C5B-AF1F-4D1A1688BD44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/13fb56d2-75ac-433f-9e88-1de935f99bdb.png)


### 通信がどう送られくるか？

外から通信が送られてくると、家のグローバルIPアドレス宛に届きます。送られた通信は家のルーターが受け取ります。ルーターは、その通信が「どのプライベートIPの機器宛か」を判断して、内部ネットワークに転送します。

このときに使われるのが **NAT/NAPT** という仕組みです。

:::note warn
ちょっとここから難し目です。
:::

#### NAT/NAPT
最初に言っておきますが、今使われているのは基本的に**NAPT**です。
でもNATのことも知っておかないとNAPTがピンとこないので解説します。

##### NAT
まずNATですが、これは**ネットワーク アドレス トランスレーション**の略です。
こいつの役割は、プライベートIPアドレスとグローバルIPアドレスを相互に変換することにあります。この機能があることによって、LAN内にあるプライベートIPアドレスを持った機器が外部のネットワークと通信ができています。

![step47_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/31eecd06-d667-4866-8b2b-dc4fe516630d.jpeg)


:::note alert
でもこれって1対1しか対応していないんですよね。
なので、複数の機器が同時に外部のネットワークと接続したい場合は、これだけだと不十分になります。
:::

##### NAPT
NAPTは、**ネットワーク アドレス ポート トランスレーション**の略です。
この技術を使うと、複数機器が同時に外部との通信が可能になります。

![step47_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/b5c2568c-4d1a-44bf-aed4-c4d56f6dc908.jpeg)

:::note info
皆さんの家でも複数のスマホやゲームが同時にネットワークに繋げられていますよね？これはNAPTのおかげです。
:::

これはNATの技術に***ポート***を使うことで可能にしています。

ポートは通信の出入り口のようなものです。
全ての通信にはポート番号というものが振られているので、どの通信がどういった通信かわかるようになっています。

:::note info
IPアドレスがネットワーク上の住所なら、ポート番号は**部屋番号**に例えられることが多いですね。
:::

![step13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/711e3c63-0b7f-4a73-aa7a-399ea048efb4.jpeg)


##### NAPTの場合はどう言ったポートの使い方をしているのか？
プライベートIPアドレスから外部に通信を行う際、以下のようにポートが割り当てられます。
```bash:プライベート→グローバル
# 192.168.0.2がプライベートIPアドレス、55001がポート番号です
192.168.0.2:55001（家の中にあるスマホから）
　　　　　⬇︎
# 203.0.113.10がグローバルIPアドレス、50001がポート番号です
203.0.113.10:50001（ルーターがポートごと変換）
```
:::note info
このポート番号の数字に意味があるわけではありません。
今回の場合、スマホから送られた際のポート番号が***ルーターで変更されていることに着目***しましょう。
:::

この変更は、外部と通信するため、必ず一意にするためには必須です。
例えば
```bash:同時に同じポート番号で、違うプライベートIPから通信がきた場合①
# 家の各機器側
192.168.0.2:55001（家の中にあるスマホから）
192.168.0.3:55001（家の中にあるPCから）
　　　　　⬇︎
# ルーター側
203.0.113.10:50001（こっちはスマホ）
203.0.113.10:50002（こっちはPC）
```

こうやって外部に通信を繋げます。
ルーターには**ポート番号を一意に変更する機能が備わって**います。
例えば以下のような形にはならないということです。
```bash:同時に同じポート番号で、違うプライベートIPから通信がきた場合②
# 家の各機器側
192.168.0.2:55001（家の中にあるスマホから）
192.168.0.3:55001（家の中にあるPCから）
　　　　　⬇︎
# ルーター側
203.0.113.10:55001
203.0.113.10:55001
```
:::note alert
これでは外からレスポンスが返ってきた時、どっちの機器に返せば良いのかわからなくなります。なので、ルーターにはポートを変更する機能と、絶対に被らないポートを割り振る機能が備わっています。
:::

さて、この機能に付随して、こういった振り分けがどう記録されているかも解説します。
これらの情報はルーターにある**NATテーブル**という場所に記録がされています。

##### NATテーブル
NATテーブルはプライベートIPアドレスからの通信を記録する機能です。
```bash:同時に同じポート番号で、違うプライベートIPから通信がきた場合③
# 家の各機器側
192.168.0.2:55001（家の中にあるスマホから）
192.168.0.3:55001（家の中にあるPCから）
　　　　　⬇︎
# ルーター側
203.0.113.10:50001（変換して外に出すけど、これは192.168.0.2:55001からの通信だな）
203.0.113.10:50002（変換して外に出すけど、これは192.168.0.3:55001からの通信だな）
```

NATテーブルに記録されるのは以下の情報です。（今回の場合）
- **送信元プライベートIPアドレス**
    →今回の場合：192.168.0.2と192.168.0.3
    
- **送信元ポート番号**
    →今回の場合：55001と55001

- **宛先IPアドレス（どこに通信を届けたいか）**

- **宛先ポート番号（宛先のポート番号、HTTPS通信なら443）**

- **変換後グローバルIPアドレス**
    →今回の場合：203.0.113.10
    
- **変換後ポート番号**
    →今回の場合：50001と50002
    
- **プロトコル（大体TCP/UDPのどちらかで判断）**

- **状態/タイマー（Connection State/Timeout）**

:::note info
これらの情報がルーターのメモリにそれぞれの対応通りに保存されています。
:::


### ここで使われるポート番号について

ポート番号にはいくつか分類があります。
#### ウェルノウンポート
これはすでに使う先が決まっているポート番号です。***主にサーバーが使うポート番号です。***
番号でいうと以下の範囲です。
```bash:ウェルノウンポートの範囲
0〜1023
```
:::note info
よく出てくるのはHTTPの80番、HTTPSの443、SSHの22番などですね。
これらは基本的に変えることは非推奨です。
:::



#### レジスタードポート（ユーザーポートとも呼ばれる）
こちらは様々なシステムで使われているポート番号ですね。主に***エンジニアなどの開発者が使うポート番号***です。
基本的に番号を変えて使うこともありえるポートの範囲です。
```bash:レジスタードポートの範囲
1024〜49151
```
:::note info
MySQLなら3306、PostgreSQLなら5432のような感じです。
:::

:::note warn
FlaskというPythonのフレームワークのポート番号は標準で5000なのですが、最近のMacではAirPlayで5000を使っているので、こう言ったところで競合がおきたりします。別に予約されたポート番号というわけではないので当然の現象ですね。
:::

#### エフェメラルポート
上記二つとは違って、このポート番号はクライアント側が使うポート番号です。
ですが、基本的に一般ユーザーが意識することはないです。

```bash:エフェメラルポートの範囲
49152〜65535
```

:::note info
クライアント意外だとルーターの**NATテーブルが使っているポート番号**です。
通信をする際に一瞬使って、すぐ破棄されます。
:::

![A6EF19C1-E1E7-4B4E-8E83-2650B34D9F71.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/c5496266-8329-461c-9150-fb502cad17d5.png)



## IPアドレスと関係しているその他の技術

### MACアドレス
MACアドレスは個人番号のようなもので、物理的なデータを受け取るために必要な機器の識別子です。IPアドレスは論理的なアドレスと呼ばれます。それぞれの機器に物理的に刻まれている番号なので、動的に変わってしまうIPアドレスとはまた違う要素ですね。IPアドレスは外との通信でしっかり使われますが、MACアドレスはLAN内限定で使われています。

![step9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/d8a04bca-b488-4a97-bd36-ef7ed7c28db7.jpeg)

:::note info
一番わかりやすい説明だと、家のWifiで繋いている時のIPアドレスと、外でWifiに繋いだ時のIPアドレスは違いますよね？IPアドレスは動的に変わるので、最終的にどこにデータを渡すかはMACアドレスによって識別されます。
:::

歴史的な話になると、そもそも世界中にネットワークが広がる前は、研究所などにあるコンピューター同士を識別する必要があったわけで、誕生自体が先なんですよね。

#### ARPについて
ARPは、プライベートIPアドレスからMACアドレスを探し当てるためのプロトコルです。
1. ルーターが、LAN内の 192.168.10.5 に通信を送りたい
2. そのIPに対応するMACアドレスが分からなければ、ARPで全端末に確認
3. 192.168.10.5の機器だけが、それに反応してMACアドレスを返す
4. ルーターはそのMAC宛に通信を送る

です。

最終的に物理的なデータを届けるためにMACアドレスが必要になってくるので、ARPを使って宛先の個人番号を知る必要があります。

![step139_1_720.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/178901d6-ee3d-4c49-9fc9-df60d495ff13.jpeg)


## おわりに
久しぶりに記事を書きました。
5~6月はお休みする予定でしたが、ちょっと書かないといけないくらいネットワークのこと忘れてきている、、と感じたので書きました。
IPアドレス周りは表記あたりやドメイン周りの話もあるので、続きも書いていきます。