AWS VPCについて（２）

こんにちは、キムです。
以前[VPCについて](https://qiita.com/KIMSeongJoo/items/fa742419a731ec26e90b)ていう記事を書きました。　おそらくかぶる内容も色々あると思いますが、自分の記事を自分でもう少しアップグレードする気持ちで（２）ていう記事名をつけました。
この記事では、VPCを設計する前に少しわかっておいたらいい知識、そして実際VPCをどのように構築していくのかについて話そうと思います。
物足りない内容かな…と思いますが、ぜひご参考になれば嬉しいです。
間違ってる内容や・追記したほうがいい部分があれば、コメントお願いします。

## 基本知識
#### IPアドレスの構造について
IP アドレスは32 桁の2 進数であり、総個数は約42 億個程度である。 構成は（ネットワークアドレス+ホストアドレス）から構成される。簡単に説明すると、ネットワークアドレスはマンションのアドレス、ホストアドレスは部屋番号で理解すれば分かりやすい。 相手の家に正確な住所を探すためには、まずマンションの住所に行って部屋番号を探さなければならない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76353/f5e8e6b3-b9e2-7392-513f-748a7bd8c50b.png)

IPアドレスを8ビットで4等分するとこれらをそれぞれオクテットという。 各オクテットは0~255までの範囲であるため、合計256個が入ることが分かる。 そして各オクテットごとにIPのクラスをA、B、Cに分けることができる。
Aクラスはオクテット1 がネットワークID ID である。 そして残りのオクテットをホストのIDとして使う。 Bクラスはオクテット2までをネットワークIDとして使用する。 そしてCクラスはオクテット3まで使う。
結果的にAクラスはネットワークID1つ当たり1677万個のIPアドレスを、Bクラスは6万5千個、Cクラスは256個持つ。 Cを使うには個数が少なすぎるし、Bを使うには失敗する場合があるため、このクラス別にアイピーを割り当てる方法は以前になくなった。
その後、この問題を解決するためにサブネットマスクを使用したが、「マスク」という単語のようにアイピーアドレスを隠す役割をする。 AクラスはこのCIDRブロックにおいて8に該当する。 B クラスは16 C クラスは24 に該当する。
より詳しい内容は[こちらを参考に](https://en.wikipedia.org/wiki/IP_address)

#### CIDR(Classless Inter-Domain Routing)て？
CIDR は急激に不足するIPv4アドレスをより有効に使用するために登場したものである。 表現方式は`xxx.xxx.xxx.xxx/yy`の形で表示し、一番後ろの`yy` はサブネットマスクを2進数に変えたときに1の個数になる。 上で述べたように基本的にCクラスは24個の1でIPを隠してしまう。 遮った後のケタから使えるようになる。

例えば、`255.255.255.255.0`を2進数に置き換えると、`111111.111.111.111.00000000`となるが、1が24個なのでCIDR 表記法で`xxx.xxx.xxx.xxx/24`となる。（ちなみに、サブネットマスクは1 が連続して出るべきである）`192.16.8.0.0/24`なら`192.168.0.1` ~`192.168.0.254`までである。初めの`192.168.0.0`がネットワークであり、最後の`192.168.0.255`はブロードキャストから除外される。
より詳しい内容は[こちらを参考に](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)

## 本題
## VPCよりはVPN（Virtual Private Network）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76353/e5db1b2e-7929-ba09-12f5-8dbd5bae315f.png)
VPNは日本語で`仮想私設網`という。前の「仮想」という言葉からも分かるように、実際の私設網ではなく仮想の私設網である。上図のように会社のネットワークが構成されており、セキュリティ上の理由で従業員間のネットワークを分離したいのであれば、既存のインターネット線工事もやり直さなければならず、建物の内部線をすべて取り払って直すべきであり、また専用線を敷き直さなければならない。 そのために仮想網VPN を使用することになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76353/a0c7fadd-297e-e456-0d3d-b4fa77bec3c1.png)
VPN はネットワークA とネットワークB が実際に同じネットワーク上にあるが論理的に異なるネットワークであるかのように動作する。 これを我々は`仮想私設網`と言う。

## VPC（Virtual Private Cloud）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76353/198e02a1-ee84-6680-2c00-98296a8513bd.png)
VPCがなければ、EC2インスタンスが互いにクモの巣のようにつながり、インターネットとつながる。 このような仕組みは、システムの複雑度を大幅に引き上げるだけでなく、1つのインスタンスを追加するだけですべてのインスタンスを修正しなければならない不便さがある。 まるでインターネット専用線を新しく敷くようなものだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76353/2ceee4b1-5e11-e52d-190a-215cec32a78b.png)
VPC を使用すると、上図のようにVPC ごとにネットワークを構成でき、それぞれのVPC に応じて異なるネットワーク設定を与えることができる。 また、それぞれのVPCは完全に独立したネットワークのように動作することになる。

### VPCの構築流れ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76353/5b651933-2efb-944d-999b-d3f997a4a99c.png)
VPC を構築するためには、VPC のIP 範囲を[RFC1918](https://tools.ietf.org/html/rfc1918)という私設のIP帯域に合わせて構築しなければならない。 私設IPとは何だろうか？インターネットのために使用するのではなく、私たち同士で使用するIP帯域アドレスである。例えば、誰かが「居間からリモコン取ってくれ」と言うと、私は隣の居間に行くのではなく、私の家の居間にリモコンを取りに行く。 居間の位置がプライベートIPであり、私の家の住所がパブリックIPである。

隣にもリビングがあるし、私の家にもリビングがあるけど、お互いのリビングに入った時、見分けがつかない。 「居間」、「小部屋」、「大部屋」のように内部で使うアドレスを私設のIP帯域と呼び、内部ネットワークで場所を探す際に使用する。 むろん、友人や弟の友人が訪ねてくる時は住所（パブリックIP）を知らせればよく、同じ家（我が家）に住む（同一ネットワーク上に存在する）私が弟のところに行く時は、弟の部屋（私設アイピー）に行く。

VPC で使用する私設のIP 帯域は以下の通りである。

- 10.0.0.0 ~ 10.255.255.255(10/8 prefix)
- 172.16.0.0 ~ 172.31.255.255 (182.16/12 prefix )
- 192.168.0.0 ~ 192.168.255.255 (192.168/16 prefix )

一度設定されたIP帯域は修正できず、各VPCは一つのリージョンに従属される。 それぞれのVPCは完全に独立しているため、もしVPC間の通信を望むならVPCピアリングサービスが考えられる。

このように私設の帯域を約束すれば、私設のIPでインターネットに接続できるIP帯域として設定し、問題発生を防止できるからだ。 例えば140.x.x.x のIP を社説にするとすれば、あのIP はインターネットで使えるIP である。 私設網内部でインターネットをつながずに低IPを使用することができるが、共通の規約に従うことで、「勘違い」と「問題」を事前に防ぐことができる。

#### Availability Zone
AWSは世界各地でホスティングされている。 各地域をリージョンと呼ぶ。 このリージョンの中で可用領域という隔離された位置がいくつかある。 そのため、各リージョンでも一方の可用領域に問題が生じた時、他方の助けを受けることができる構造である。 ELB（ロードバランサ）を付けて各可用領域にトラフィックを分散させることができる。

### Subnet
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76353/2f9b6b39-db09-c044-6bda-cf05c483520e.png)

VPCを作ったなら、サブネットを作ることができる。サブネットはVPCを細かく分割する過程だ。 サブネットは、VPC の中にあるため、VPCより小さい単位であるし、当然サブネットマスクがより高い値を持し、IP の範囲がより小さい値を持つことになる。 サブネットを分ける理由は、より多くのネットワーク網を構築するためだ。

個々のサブネットは可用領域の中に存在し、サブネットの中にRDS、EC2 といったリソースを位置づけることができる。

### Routing Table, Router
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76353/ccd3ce89-58a8-0650-ebf3-4bf87cdb7bf2.png)

ネットワーク要請が発生すると、データはまずルータに向かうことになる。 ルータとは目的地であり、ルーティングテーブルは各目的地のマイルストーンである。 データはルータに向かうことになり、ネットワークリクエストはそれぞれ定義されたルーティングテーブルに従って動作する。 サブネットA のルーティングテーブルは、172.31.0.016 すなわち、VPC の中のネットワーク範囲を持つネットワーク要請はローカルで求めることになっている。 しかし、それ以外に外部に通じるトラフィックを処理することができない。 その際、インターネットゲートウェイを使用する。

### Internet Gateway (IGA)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76353/b4527713-981f-b5b5-05e6-8f319802a2cc.png)

インターネットゲートウェイとは、`VPCとインターネットをつなぐ一つの関門`である。 サブネットB のルーティングテーブルを見ると、`0.0.0.0/0`と定義されている。 この意味は、すべてのトラフィックに対してIGA（インターネットゲートウェイ）A に向かうようにという意味である。 ルーティングテーブルは、最初に目的地のアドレスが`172.31.0.0/16`にマッチングされるかを確認した後、マッチングされなければIGA Aに送られる。

インターネットとつながっているサブネットをパブリックサブネット、インターネットとつながっていないサブネットをプライベートサブネットという。

### NetWork ACL, Security Group
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76353/73907990-dada-641e-9010-f35c65c20ed1.png)
ネットワークACL とセキュリティグループはファイアウォールのような役割を担当する。
インバウンドトラフィックとアウトバウンドトラフィックのセキュリティポリシーを設定できる。 
まず、セキュリティグループはStateful な方式で動作し、基本的に全ての許容を遮断するように設定されているため、必要な設定は追加で許容する必要性がある。 また、ネットワークACLと異なり、個々のセキュリティグループごとに別々のトラフィックを設定でき、サブネットでも設定できるが、それぞれのEC2インスタンスにも適用できる。

ネットワークACLはStateless に動作し、すべてのトラフィックを許容するように設定されているため、追加的に不要なトラフィックを防ぐように設定しなければならない。 ネットワークACL とセキュリティグループが衝突する場合は、セキュリティグループの方が高い優先順位を持っている。


### NAT Gateway
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76353/444f0077-c644-dcc0-79c2-1deda073f631.png)
NAT ゲートウェイはプライベートサブネットがインターネットと通信するためのアウトバウンドインスタンスである。 プライベートネットワークが外部から要請されるインバウンドの設定が必要でなくても、インスタンスのファームウェアや周期的なアップデートが必要であり、アウトバウンドトラフィックだけが許容されなければならない場合がある。 このとき、パブリック サブネット上で動作する NAT ゲートウェイは、プライベート サブネットから外部に要請するアウトバウンド トラフィックを受けてインターネット ゲートウェイと接続することになる。


## DHCP (Dynamic Host Configuration Protocol )
翻訳すると動的ホスト設定プロトコルである。 IPを必要とするコンピューターに自動的にIPを割り当て、使用しなければ返却して他のコンピューターにIPを使うようにしてくれる。

DHCP がIP を割り当ててくれることをリースといい、基本的に8 日と設定されてるという。 ところが人々が多く居住している地域では8日に設定すればすぐに売り切れてしまうため、2~3時間程度で設定されるという。 そして、使い続けているのに返却してしまうと非効率的になるので、更新（Renewal）をサポートする。 使用期間が50%残った時、そして87.5%残った時に2度試みるという。 言い換えれば、IPを引き続き使用中なら賃貸期間を自動的に更新し、そうでなければ時間に合わせて返すということだ。

AWS では最大 4 つの独自の DNS サーバが使用できる。 そうするためには、VPCと一緒に使用するDHCPオプションを指定しなければならない。

domain-name-servers, domain-name, ntp-servers, netbios-name-servers, netbios-note-typeを指定できるというが、一般的にデフォルト値をそのまま使う。 もっと詳しい設定が必要なら、公式文書を参考にした方が良い。
[公式Wikiはこちら](https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol)


## まとめ
これまで、IP,VPN,VPCなどAWSで一番基本になるネットワークについて書いて見ました。
VPCの目的は色々あると思いますが一般的にはセキュリティーのためにAWSリソース間のつながりを最小限にして、グループ頃に簡単にネットワークを構築するためよくつかいます。　これ以外にもより独立的なVPC間の通信のために作られたVPCピアリング、オンプレとVPCとのネットワークである、AWS Direct Connect、VPCで発生するゴグを管理するVPC Flow logsていうサービスもあります。
次回はWAFについて勉強しようと思ってます。
長い文書読んでいただきありがとうございます。
ご参考になれば嬉しいです。