#0008

AWSでWebサーバー構築!VPC設計に必要なIPアドレスとサブネットの基礎知識(第1回)

2018-04-05 17:00 2018-10-25 14:05 "みやび"

みやびです(@miyabi_lab)。

連載『知識ゼロからAWS VPCネットワークを構築してセキュアな環境にEC2 Webサーバーを設置・運営する』の第1回です!

このサイト(MIYABI Lab)を製作するにあたり、初めてAmazon Web Service(以下、AWS)にてVPCネットワークを構築して比較的安全性の高いWebサーバーを立ててみましたので、その全学習プロセスと学んだことをまとめます

この連載記事のゴールは、『無知の状態からAWSネットワークを構築してセキュアなWebサーバーを設置できるようになること』です。

AWSの存在はもちろん知ってはいたのですが、ネットワークやサーバー周りの知識についてはやたら難しそうなイメージを持っておりまして、これまで手をつけられていませんでした。

今回は新しくサイトを立ち上げるという絶好のタイミングだったので、完全に知識ゼロの状態からがっつり勉強して、10日ほどかけて全体的な仕組みを理解して設計および構築を行いました。

連載の第1回は、AWSで作るネットワークと、その要であるIPアドレスとサブネットに焦点を当てて解説していきます。

スポンサーリンク

ネットワークの全体像を確認しておく(まだ理解できなくてOK!)

まず初めに、こちらのネットーワーク図をご覧ください。

最終目標とするVPCネットワーク完成図

現時点ではまだ何も理解できなくて大丈夫です!ひとつずつ順番に解説していくので、この記事を読み終える頃にはネットワークの基礎が理解できるようになるはずなので、安心して読み進めてください。

※Elastic Load Balancer(ELB)の先のAvailability Zone(AZ)の左の分岐先に何もありませんが、その理由も後ほど説明します。

上のネットワーク図は、実際に私たちがこのサイトを運用しているAWS Virtual Private Cloud(VPC)ネットワークの概略図です(一部セキュリティに関わる部分は省略しています)。

この類の図はGoogle画像検索で「AWS ネットワーク」などと検索すれば山ほどヒットしますので、適宜参考にしてみてください。

この記事では、インターネットやAWS、VPCネットワーク、IPアドレスなどに焦点を絞り、これからAWSを設計するために絶対に知っておかなければならない基礎知識について詳しく解説していきます。

AWSとWebサーバーの関係について

そもそもAWSで作るWebサーバーというのは、どのような設計になっているのでしょうか?基本的なフローから順に見ていきます。

基本的な流れをイメージしよう

AWS VPCネットワークの最小構成図

この項目では、図のようなAWS VPCネットワークの基本概念を解説します。

新しい単語がいくつか出てきます。以下のようにお好きなイメージで読み進めてください。

AWS

  1. 様々な実験設備が整った研究機関
  2. なんでも備え付けの高級マンション

VPC

  1. 自分だけの研究室
  2. 自分の家(305号室)

EC2

  1. コンピューティングリソースを提供してくれるマシン(=サーバー)
  2. 自分のパソコン(=サーバー)

Linux

  • OSのひとつ

Apache/Nginx

  • Webサーバーソフトウェア。
  • Hyper Text Transfer Protocol(HTTP)通信のリクエストを処理するために必須のソフトで、これがないとWebサーバーとしての機能を持つことができない。

 

AWSとは、Amazonが提供するクラウドコンピューティングサービスの総称で、仮想サーバーやストレージ、データベース、アプリケーション、機械学習などの様々なソリューションが提供されています。

AWSというとサーバーそのものだと勘違いしている方が多いですが、サーバーは数あるサービスのうちの1つであり、Amazon EC2というサービス名で提供されています。

厳密には、このEC2はAmazonが保有するコンピューティングリソースをレンタルするサービスの名称であり、小さく分割してレンタルされた仮想マシンをEC2インスタンスと呼びます

このEC2インスタンスにてLinuxなどのOSを導入、起動し、そこにApache(アパッチ)やNginx(エンジンエックス)といったWebサーバーソフトウェアをインストールすることで、初めてWebサーバーとして機能することができます。

(※詳しく知りたい方は、Amazon Machine Image (AMI) で検索してください)

それではこのEC2インスタンスをどう使えばいいのかというと、VPC内に配置した上で起動する必要があります。

VPCとは直訳で仮想プラベートクラウド(ほぼそのままw)で、AWSクラウドの他の仮想ネットワークから論理的に切り離されている、いわば自分だけの自由なプライベート空間です。

もう一度先ほどの図を貼っておきます。

AWS VPCネットワークの最小構成図

ここまでの説明をまとめると、

  • AWSは、Amazonが提供するクラウドコンピューティングサービスの総称
  • VPCは、AWS内で独立したネットワーク空間
  • EC2インスタンスは、VPCネットワーク内に設置する仮想マシン(サーバー)

となり、実際にアクセスするユーザーは、

  1. インターネット(HTTP/HTTPS)を経由して、
  2. 自分のVPC内に入り込み、
  3. その中のEC2 Webサーバーのコンテンツにアクセスする。

という流れになります。

IPアドレスとネットワークの関係を最低限理解する

EC2インスタンスにてWebサイトを公開する上で避けて通れないのが、IPアドレスに関する知識です。

IPアドレスについて詳しく書こうとすると、それだけで何記事も書けてしまうほど奥が深いので、ここではVPCネットワークの構築やパブリック(グローバル)IPアドレスについて最低限必要な項目を解説します。

話が脱線しているようにも感じるかと思いますが、ここが理解できていないとネットーワークを構築することは不可能です。

IPアドレスとは何か?

まずはIPアドレスから確認していきましょう。

現実世界でそれぞれの家に住所があるように、インターネット上のコンピューターにも住所が存在します。これこそが俗に言うIPアドレスであり、厳密にはIPアドレスの中でもパブリック(グローバル)IPアドレスと呼ばれるものです。

一方で、VPCなどのプライベート空間内でのみ利用されるIPアドレスは、ローカル(プライベート)IPアドレスと呼びます。

例えば、社内ネットワーク内の各パソコンはローカルIPアドレスで管理されているが、社外からはひとつのパブリックIPアドレス(会社の住所)でのみアクセスできる、といったように使い分けられます。

IPアドレスの実態

IPアドレスの実態は、いずれも以下のように32ビットの2進数(0か1)で表されます。

// IPv4の例(32ビット)
00001010000000000000001101010101

// 読みづらいので8ビットずつ区切ります
00001010 00000000 00000011 01010101

8ビットずつ区切っても人間には理解しずらいので、これを10進数に変換します。

// 2進数から10進数に変換してピリオドでつなぎました
10.0.3.85

これで私たちがよく見る形のIPアドレスになりました。

2進数から10進数への変換計算

後々、VPCネットワークを設計するのに必要になりますので、2進数の01010101が10進数の85になる仕組みを簡単に解説します。

// 01010101のそれぞれの数値に対して、
// 左から順に2の7乗〜0乗の範囲で以下のように掛け算

0 * 2^7 = 0 * 128 = 0
1 * 2^6 = 1 * 64  = 64
0 * 2^5 = 0 * 32  = 0
1 * 2^4 = 1 * 16  = 16
0 * 2^3 = 0 * 8   = 0
1 * 2^2 = 1 * 4   = 4
0 * 2^1 = 0 * 2   = 0
1 * 2^0 = 1 * 1   = 1

// 計算結果を足し合わせる
0 + 64 + 0 + 16 + 0 + 4 + 0 + 1

-> 合計:85

計算方法は他にもいくつかありますが、暗算が得意なら、なんだかんだでこれが一番早いです。

他の8ビットも同じように計算すると、上の例では10.0.3.85になります。

同じ要領で、

  • 2進数の00000000は10進数の0
  • 2進数の11111111は10進数の255

となります。

サブネットマスク/ネットワーク部/ホスト部を理解する

また新しい単語が出てきましたが、これらはまとめて理解するのがベストです。

サブネットとは何か?

サブネットとは、ある1つの大きなネットワークの中をさらに小さく分割した小規模ネットワークのことをいいます。

現実社会でいうと、会社の中に営業本部(メインネットワーク)があり、その組織がさらに〇〇課や△△課(サブネット)に分割されている、といった感じです。

AWSにおけるサブネットの位置付けは、図で示すと以下のようになります。

サブネットの例

細かい数値については後々説明しますが、VPC(10.0.0.0 / 16)というネットワーク内を4つのサブネット(10.0.0.0 / 18など)で分割しているのがおわかりいただけるかと思います。

このサブネットごとに、例えば、EC2 Webサーバーを設置する領域、データのバックアップを保管しておく領域、といったように、利用する目的に応じて自由に部屋を分けてあげることができます

分割された各サブネットは、お互いの関係性を明示的に示さない限り、相互的な干渉が許可されません

それぞれはサブネットワークとして独立している、ということがイメージできれば十分です。

それでは、このサブネットはどのようにして分割するのでしょうか?この鍵を握るのが「サブネットマスク」という考え方です。

サブネットマスクの特徴

先ほど、IPアドレスは32ビットの2進数などで表現すると説明しましたが、実はその中には区切りがあり、これをサブネットマスクとして以下のように表現します。

// 2進数サブネットマスクの例
11111111 11111111 11111111 00000000

// 10進数サブネットマスクの例
255.255.255.0

// CIDR表記(IPアドレス / xx)
*.*.*.* / 24

区切りじゃないんかい...と言う声が聞こえてきそうですが、これが区切りなんです。

サブネットマスクの書き方には、11111.....や255.255.255.0のようなIPアドレスと同様の書き方と、IPアドレスの後ろにスラッシュを置いてネットワーク部のビット数を書くClassless Inter-Domain Routing(CIDR:サイダー)表記の3種類があります。

(※AWSにおいては、VPCのCIDRブロックとして / 16 から / 28 までが利用できます。)

上の例だと、32ビットのうち上位24ビットが1、残り8ビットが0で構成されており、1の連続と0の連続の境目が区切りになります。

区切り位置について、以前まではクラスA( / 8 )、クラスB( / 16 )、クラスC( / 24)のように区切りが明確に決められていましたが、最近ではCIDR表記が採用されており、区切り位置を状況に応じて自由に調節できるようになっています。

IPアドレスをサブネットで区切ることによって、IPアドレスをネットワーク部とホスト部に分割することができます。

ネットワーク部とホスト部は何を意味しているのか?

サブネットマスクよって分割されたネットワーク部とホスト部が何を意味しているのかを解説します。

// 10.0.3.85 を 255.255.255.0 で区切る
00001010 00000000 00000011 ~ ~ 01010101
11111111 11111111 11111111 ~ ~ 00000000

上記のように10.0.3.85のIPアドレスを255.255.255.0のサブネットマスクで区切ると、

  • 10.0.3:ネットワーク部
  • 85:ホスト部

に分割することができます。

単純計算すると、ネットワーク部は256*256*16 = 1,048,576通り、ホスト部は256通り*になります。

(*実際には、末尾が0と255のものは一般的に予約番号として押さえられているのでホストを割り当てられません。AWSの場合は、末尾が0, 1, 2, 3, 255が使用できません。ここでは計算の簡略化のため予約番号やサブネットワークの計算は無視します。)

これが意味することは、1つのネットワークの中に255個のIPアドレスを自由に割り当てることが可能だと言うことです。

社内ネットワークの例でいうと、もしサブネットを255.255.255.0で区切ったとしたら、1つのローカルネットワーク内に、パソコンやプリンターなど合計256台を接続できるという意味になります。

でもちょっと待ってください。もし社員が3000人の組織でローカルネットワークを作ろうとしたら、社内ネットワークのサブネットマスクは255.255.255.0( = / 24)では足りませんよね。

こうした想定が事前にできる場合には、サブネットマスクは / 24 よりも小さい数値でなくてはなりません。

// サブネットマスクと利用可能なホスト数
...
/16	 255.255.0.0		65,536
/17	 255.255.128.0		32,768
/18	 255.255.192.0		16,384
/19	 255.255.224.0		8,192
/20	 255.255.240.0		4,096
/21	 255.255.248.0		2,048
/22	 255.255.252.0		1,024
/23	 255.255.254.0		512
/24	 255.255.255.0		256
/25	 255.255.255.128	128
...

組織が3000人なら、 / 20 であれば充分に割り当てられそうです。

これを2進数で表すと以下の通りになります。

// サブネットマスク(全て同じ)
11111111 11111111 11110000 00000000
255.255.240.0
*.*.*.* / 20

// 240の計算方法は上で紹介した通り
1 * 2^7 = 1 * 128 = 128
1 * 2^6 = 1 * 64  = 64
1 * 2^5 = 1 * 32  = 32
1 * 2^4 = 1 * 16  = 16
0 * 2^3 = 0 * 8   = 0
0 * 2^2 = 0 * 4   = 0
0 * 2^1 = 0 * 2   = 0
0 * 2^0 = 0 * 1   = 0

// 計算結果を足し合わせる
128 + 64 + 32 + 16 + 0 + 0 + 0 + 0

-> 合計:240

途中で分割されていますね。

こちらも単純計算すると、ネットワーク部は256*256*240 = 15,728,640通り、ホスト部は16*256 = 4096通りになります。

ただし、前述したCIDRの導入によって区切りが自由になった一方で、255.255.240.0のような記法では視覚的に綺麗に分割されないケースもあります。

例えば、AWSのVPC(10.0.0.0/16)というプライベート空間の内部をさらに4分割して、4つの独立したサブネットワークを作成したいという場合が出てくることがあります。

図で説明すると以下のような状況です。

サブネットの例

この場合、/ 16 で区切っているので、ネットワーク部は256*256= 65,536通り、ホスト部も256*256= 65,536通りになります。

その内部を、ホスト部を2ビット分犠牲にすることで、 / 18 で4分割しているので、ネットワーク部は256*256= 65,536通り、「サブ」ネットワーク部は2*2= 4通り、ホスト部も2^6 * 2^8 = 64*256 = 16,384通りになります。

この時のサブネットマスクは以下のようになります。

// 10.0.0.0 / 16
00001010 00000000 ~ ~ 00000000 00000000 : VPCのネットワークアドレス
11111111 11111111 ~ ~ 00000000 00000000 : VPCのサブネットマスク

// ↓さらに内部を4分割するためのサブネットマスク

// 10.0.0.0 / 18
00001010 00000000 ~ ~ 00 ~ 000000 00000000 : VPC内のサブネットワーク1のネットワークアドレス
00001010 00000000 ~ ~ 01 ~ 000000 00000000 : VPC内のサブネットワーク2のネットワークアドレス
00001010 00000000 ~ ~ 10 ~ 000000 00000000 : VPC内のサブネットワーク3のネットワークアドレス
00001010 00000000 ~ ~ 11 ~ 000000 00000000 : VPC内のサブネットワーク4のネットワークアドレス
11111111 11111111 ~ ~ 11 ~ 000000 00000000 : VPC内のサブネットワークのサブネットマスク

// ↓10進数に変換すると
10.0.0.0 : VPC内のサブネットワーク1のネットワークアドレス
10.0.64.0 : VPC内のサブネットワーク2のネットワークアドレス
10.0.128.0 : VPC内のサブネットワーク3のネットワークアドレス
10.0.192.0 : VPC内のサブネットワーク4のネットワークアドレス
255.255.240.0 : VPC内のサブネットワークのサブネットマスク

// ↓それぞれのIPアドレスの有効範囲
10.0.0.0 ~ 10.0.63.255 : 計16,384ホスト分
10.0.64.0 ~ 10.0.127.255 : 計16,384ホスト分
10.0.128.0 ~ 10.0.191.255 : 計16,384ホスト分
10.0.192.0 ~ 10.0.255.255 : 計16,384ホスト分

ここの理解はかなり難しい部分で、人によっても理解の速度が全然違います。

ただ、じっくりと順を追ってイメージしていけば必ず理解できます。ネットワークの最初の鬼門かもしれませんので、数字に弱い方はめげずに頑張ってください。

サブネットマスクを用いてネットワークアドレスを特定する

IPアドレスとサブネットマスクの論理積(AND演算/掛け算)を求めることで、そのIPアドレスがどのネットワークに属しているかが分かります。実際に計算してみましょう。

  • 10.0.3.85
  • 10.0.4.86

この2つのIPアドレスを持ったコンピューターが同じネットワーク内に存在するかどうかを検証します。

サブネットマスクは255.255.255.0です。

// 10.0.3.85のネットワークアドレスを求める
00001010 00000000 00000011 01010101 // 10.0.3.85 IPアドレス
11111111 11111111 11111111 00000000 // 255.255.255.0 サブネットマスク
00001010 00000000 00000011 00000000 // 10.0.3.0 計算結果=ネットワークアドレス

// 10.0.4.86のネットワークアドレスを求める
00001010 00000000 00000100 01010110 // 10.0.4.86 IPアドレス
11111111 11111111 11111111 00000000 // 255.255.255.0 サブネットマスク
00001010 00000000 00000100 00000000 // 10.0.4.0 計算結果=ネットワークアドレス

計算の結果、10.0.3.85のネットワークアドレスは10.0.3.0、10.0.4.86のネットワークアドレスは10.0.4.0となり、これら2つのIPアドレスを持つ機器は異なるネットワークに属していることが分かりました。

この場合、通常では互いに通信を行うことができない状態にあります。

 

ついでに、一つ前で「VPCネットワーク内を4つのサブネットワークに分割する」方法をご紹介しましたが、そちらの数値も使って検証してみましょう。

  • 10.0.127.246
  • 10.0.129.135

先ほどと同様に、この2つのIPアドレスを持ったコンピューターが同じネットワーク内に存在するかどうかを検証します。

// 前回の抜粋 ==========================================================================
// 10.0.0.0 / 18
00001010 00000000 ~ ~ 00 ~ 000000 00000000 : VPC内のサブネットワーク1のネットワークアドレス
00001010 00000000 ~ ~ 01 ~ 000000 00000000 : VPC内のサブネットワーク2のネットワークアドレス
00001010 00000000 ~ ~ 10 ~ 000000 00000000 : VPC内のサブネットワーク3のネットワークアドレス
00001010 00000000 ~ ~ 11 ~ 000000 00000000 : VPC内のサブネットワーク4のネットワークアドレス
11111111 11111111 ~ ~ 11 ~ 000000 00000000 : VPC内のサブネットワークのサブネットマスク

// ↓それぞれのIPアドレスの有効範囲
10.0.0.0 ~ 10.0.63.255 : 計16,384ホスト分
10.0.64.0 ~ 10.0.127.255 : 計16,384ホスト分
10.0.128.0 ~ 10.0.191.255 : 計16,384ホスト分
10.0.192.0 ~ 10.0.255.255 : 計16,384ホスト分

// サブネットマスクを用いた検証 ==========================================================================

// 10.0.127.246のネットワークアドレスを求める
00001010 00000000 01111111 11110110 // 10.0.127.246 IPアドレス
11111111 11111111 11000000 00000000 // 255.255.240.0 サブネットマスク
00001010 00000000 01000000 00000000 // 10.0.64.0 計算結果=ネットワークアドレス

// 10.0.129.135のネットワークアドレスを求める
00001010 00000000 10000001 10000111 // 10.0.129.135 IPアドレス
11111111 11111111 11000000 00000000 // 255.255.240.0 サブネットマスク
00001010 00000000 10000000 00000000 // 10.0.128.0 計算結果=ネットワークアドレス

計算の結果、10.0.127.246のネットワークアドレスは10.0.64.0、10.0.129.135のネットワークアドレスは10.0.128.0となり、これら2つのIPアドレスは当初のネットワーク設計通り、異なるサブネットワークに属していることが分かりました。

余談ですが、このサブネットワークがどこのVPCに属しているかも計算してみます。

// 10.0.64.0のネットワークアドレスを求める
00001010 00000000 01111111 11110110 // 10.0.127.246 IPアドレス
11111111 11111111 00000000 00000000 // 255.255.0.0 サブネットマスク
00001010 00000000 00000000 00000000 // 10.0.0.0 計算結果=ネットワークアドレス

// 10.0.128.0のネットワークアドレスを求める
00001010 00000000 10000001 10000111 // 10.0.129.135 IPアドレス
11111111 11111111 00000000 00000000 // 255.255.255.0 サブネットマスク
00001010 00000000 00000000 00000000 // 10.0.0.0 計算結果=ネットワークアドレス

まぁ計算するまでもなかったですが、最初の設計通り、どちらのサブネットワークも同じVPCネットワーク(10.0.0.0/16)に属していることが確認できました。

ここまで理解できていれば問題なし!

お疲れ様でした。知らない状態で読んだ方にとっては非常に重たい内容だったかと思います。

AWSにてVPCネットワークを設計していくと、上で学習したIPアドレスの知識は必須になりますが、ここに書いてあることがイメージできているのであれば、問題なく先に進めます。

もしここで少し躓いてしまったとしても、自分が理解できない部分のキーワードだけをしっかりと書き留めておいて、他の詳しいサイトなども参考にしながら理解を深めていただければと思います。

当初、IPアドレスとは住所のようなものだよ、と最初に説明しました。そこまでは簡単な話でしたね。

でもその住所の市区町村はどこなのか?どこかのマンションの一室なのか?など、ネットワークという大小様々なグルーピングと共に考えていくと、その仕組みと奥深さが実感できたかと思います。

次回はこの知識をフル活用し、VPCやサブネットといったネットワーク環境の構築手順を解説していきます。

また、AWS内で使われる専門用語についてもしっかり解説していきます。

引き続きどうぞよろしくお願いいたします!

連載(知識ゼロからAWS VPCネットワークを構築してセキュアな環境にEC2 Webサーバーを設置・運営する)の記事一覧

この記事を書いた人

Webエンジニア PHPエンジニア HTML CSS JS jQuery PHP Laravel Python SQL WordPress AWS Linux Apache

【名前】 "みやび"

【関連】 株式会社PLAN / MIYABI Lab / JAPAN MENSA /

【MIYABI Lab】平日オフィスを勉強用に解放中!みんなで楽しくプログラミングを学べる環境を作る!詳しくはコチラ(https://miyabi-lab.space)◆HTML, CSS, JS, PHP, Python, SQL, AWS◆生物学系修士→製薬会社→Webエンジニア(株式会社PLAN)・MENSA会員

Twitterやってます

最新の技術ブログはこちら