これまであまり物理的なネットワークに触れてこなかったエンジニアを対象に、AWSを用いてネットワークの基礎知識を解説する連載。初回は、基本的なIPネットワークの概念を解説し、Amazon VPCの操作手順を示す。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
クラウドや無線LANが当たり前になった昨今、以前はLANケーブルやアプライアンス、サーバなどで物理的に理解することができた「IPネットワーク」について、意識することが難しくなっています。一方で、IaaS(Infrastructure as a Service)やPaaS(Platform as a Service)などクラウドを使いこなす上では、ネットワークについて基本から分かっている必要があるにもかかわらず、あいまいなまま使っていて、障害やセキュリティ事故につながっているのではないでしょうか。
本連載では、これまであまり物理的なネットワークに触れてこなかったSEやサーバ管理者、情シスなどを対象に、クラウドサービスの例として「Amazon Web Services」(AWS)を用いてネットワークの基礎知識を解説します。
全7回を予定しており、各回でテーマを設け、そのテーマに合ったAWSのマネージドサービスを操作しながら、理解を深めます。
連載初回の本稿では、基本的なIPネットワークの概念を解説し、「Amazon Virtual Private Cloud」(VPC)の操作手順を示します。最後に、「Appendix」として環境構築の手順も記すので、必要な方はご参照ください。
ネットワークで通信するためにはルールを取り決める必要があります。このようなルールをネットワークの世界では「プロトコル(通信規約)」といいます。これまでにさまざまなプロトコルが作られていますが、その中で現在広く一般的に利用されるようになったものが「インターネットプロトコル(Internet Protocol)」略して「IP」です。このIPは、現在主にVersion 4の「IPv4」ですが、さらにそのアップデート版のVersion 6に当たる「IPv6」も利用されています。
皆さんは普段、物を送る際に相手の名前と住所を指定して送付していると思います。コンピュータの世界でもお互いに通信する際に相手の名前や場所を特定する情報が必要です。IPv4やIPv6で通信するために、コンピュータをはじめとする通信端末に割り当てる特定情報が「IPアドレス」です。
このIPアドレスは、IPv4では32bit、IPv6では128bitで構成されます。そのため、IPv4アドレスは232=42億9496万7296個、IPv6アドレスは2128=約3.4×1038個のアドレスが存在します。ただしbit(2進数)のままでは人には取り扱いにくいので、IPv4アドレスは8bitごとに10進数に変換した4つの数値(0〜255)を「.」(ピリオド)で分けた形、IPv6アドレスは16bitごとに16進数に変換した8つの数値(0〜FFFF)を:(コロン)で分けた形で表現されます。なおIPv6アドレスは、非常に長くなるので、1カ所のみですが0が続く箇所を「::」(コロン2つ)で省略できます。
以降、本稿ではIPv4について説明しますが、基本的な概念はIPv6も同様です。
なお、IPv4アドレスでは4つの10進数表記の1つ1つを「オクテット」、前から順に「第1オクテット」「第2オクテット」「第3オクテット」「第4オクテット」といいます。「192.168.1.10」の場合、「第1オクテットは192、第4オクテットは10」となります。
IPアドレスを複数の通信端末に異なる値を割り当てることで、各端末で通信相手を指定して通信できます。端末同士が直結されるようなネットワークや「ハブ」「スイッチ」といった集線装置を間に入れて数台をつなぐだけの非常に小規模なネットワークなら、これでも通信可能ですが、それ以上のネットワークでは相手の場所の特定が難しく現実的ではありません。
間に「ルーター」という中継装置を入れたネットワークを構築し、「ルーティング」処理をすることで端末間で通信できるようになります。
ルーティングでは、IPアドレスを単純な1つのアドレスと捉えるのではなく、前半を「ネットワーク部」、後半を「ホスト部」という2つの値に分けて考えます。また分ける箇所を指定するために「サブネットマスク」という値を利用します。
サブネットマスクはIPアドレス同様に32bitの値で、2進数表記では1の後に0が続く値です(※1)。IPアドレスのサブネットマスクの1に対応する部分がネットワーク部、0に対応する部分がホスト部となります。
※1:当初はIPアドレスの先頭3bitの値からクラスA〜Eとしてネットワークを分類していました(クラスフル)が、現在はサブネットマスクを用いて任意のサイズでネットワークを分類する方式(クラスレス)が利用されています。
このネットワーク部のアドレスのみ取り出し、ホスト部のbitを全て0にしたアドレスを「ネットワークアドレス」、また全て1にしたアドレスを「ブロードキャストアドレス」といいます。これらの値はそれぞれネットワーク(サブネット)を示すアドレス、ネットワーク内の全端末に送付される通信に使われるアドレスで、個々の端末に割り当てられるアドレスではありません。
例えば、「192.168.1.10」というIPアドレスがあり、このサブネットマスクを「255.255.255.0」とします。この場合、第1オクテットから第3オクテットまでがネットワーク部(ネットワークアドレスは「192.168.1.0」)、第4オクテットがホスト部(10)となります。ブロードキャストアドレスは「192.168.1.255」です。
ネットワーク部とホスト部の境目を示す値としてサブネットマスク以外に「プレフィックス」という値があります。プレフィックスはサブネットマスク中の1の個数をそのまま数値にしたものであり、IPアドレスに続けて「/」(スラッシュ)とプレフィックスを記載する形で表記します。「10.0.0.1」というIPアドレスのサブネットマスクが「255.0.0.0」の場合、255は2進数で1が8個続くので「10.0.0.1/8」と表記します。
各端末間で相手の位置が離れているような環境では、中継機器としてルーターを導入し、ルーティング処理で宛先ネットワークを特定して通信します。このためにルーターは「各ネットワーク(サブネット)がどのポート(インタフェース)の先、あるいは、どのネクストホップ(宛先の端末に通信するために次に送るルーターのことで、IPアドレスで学習します)の先にあるか」という情報をスタティック(静的=手動)に登録します。
あるいは、「ルーティングプロトコル」という機能によりダイナミック(動的=自動)に収集し、「ルーティングテーブル」という経路情報のリストを作成しておきます。
ルーターに「IPパケット」という、IPアドレスなどの通信情報と通信内容が組み合わさった通信情報が転送されてくると、宛先IPアドレスを確認し、ルーティングテーブルを基に転送先を決定して転送します。大規模なネットワーク環境では、多数のルーターによる、この処理によって、直結されていない端末同士で通信できるのです。
ただし大規模なネットワークでは、多数の経路情報を学習する必要が生じ、その管理が非常に大変です。そこで「CIDR(Classless Inter-Domain Routing)」という仕組みによって経路情報を集約し、少ない経路情報でのルーティングを可能にしています。具体的には、「192.168.1.0/24」「192.168.2.0/24」というサブネットが存在する場合、これを例えば「192.168.0.0/16」という1つの経路に集約することが可能です(※2)。
※2:192.168.3.0/24や192.168.128.0/17などの他のサブネットも含まれることになるので、経路を集約する際にはそのような存在しないサブネットの扱いに注意する必要があります。
これによって例えば「192.168.1.1」宛の通信は「192.168.0.0/16」と「192.168.1.0/24」という経路情報があった場合、どちらにもマッチしてしまうことになります。そこで、「どちらの経路を利用させるか」を一意に決められる必要が生じます。この選定ルールは非常に単純で、プレフィックスの数が大きい経路(この場合は192.168.1.0/24)が選択されます。この経路にひも付く宛先に基づいて次のルーター=ネクストホップにパケットが投げられます。このルールを「ロンゲストマッチ」といいます。
プレフィックスが0の経路は全てのbitが0となり「0.0.0.0/0」という経路になります。これは全てのアドレスにマッチするもののロンゲストマッチのルールから他にマッチする経路がなかった場合に利用される経路です。「デフォルトルート」といいます。
デフォルトルートの利用例として、端末が自身のネットワークに属さない宛先の端末と通信する際にまず転送する相手である「デフォルトゲートウェイ」があります。端末から全ての通信をこのデフォルトゲートウェイに転送させるように端末自身にデフォルトルートを記載することになります。デフォルトゲートウェイもルーターの一つです。
ここからは、AWSの環境でこれまでの内容を見ていきます。
AWSでは他の環境から分離しプライベートに利用できるコンピューティング環境としてAmazon VPCというIaaS環境を利用できます。この中に自由にネットワークを作成し、そこに「Amazon EC2」のインスタンスなどを立てて通信させることができます。そこで下記の環境で、EC2のインスタンス間で通信させます。
本稿の説明で用いる環境は下図のようになっています。
「VPC01」というVPCの中に「Subnet01」「Subnet02」という2つのサブネットを作成し、各サブネットにEC2のインスタンスを1つずつ立てています。割り当てるネットワークアドレス(CIDR)は、VPC「VPC01」には「192.168.0.0/24」、その中には2つのサブネットにはVPCのCIDRに含まれる範囲として、「Subnet01」には「192.168.0.0/26」を、「Subnet02」には「192.168.0.64/26」を割り当てています。
下記は「VPC01」の設定情報です。「IPv4 CIDR」という項目に「192.168.0.0/24」というセグメントを指定しています。
次にサブネット「Subnet01」「Subnet02」の設定情報です。どちらも「VPC01」内のサブネットとして作成しており、それぞれの「IPv4 CIDR」を「192.168.0.0/26」「192.168.0.64/26」に設定しています。
なお、どちらも利用可能なIPv4アドレスの数が「58」です。この理由は、「/26」のセグメントのためにホスト部は32 - 26 = 6bit、つまり26=64個のアドレスが存在しますが、ネットワークアドレスおよびブロードキャストアドレスとAWSで予約される3つのIPの計5個に加え、EC2インスタンスに1つアドレスが割り当てられているからです。
これらのサブネットに作成したEC2インスタンスの設定は下記の画面のようになります。
どちらも「VPC01」上のインスタンスで、それぞれ「Subnet01」「Subnet02」に展開されていることを確認できます。AWSではサブネットにひも付けることで、自動でIPアドレスが採番されるようになっており、それぞれ「192.168.0.62」(Subnet01のCIDR 192.168.0.0/26の中から採番)、「192.168.0.81」(Subnet02のCIDR 192.168.0.64/26の中から採番)が割り当てられていることを確認できます。
ここからルーティングについて見ていきます。まず、下記の画面のようにサブネットには明示的には見えないルーターが存在していて、サブネット内のインスタンスと直結されています。
このルーターはインスタンスからするとデフォルトゲートウェイとなります。サブネット「Subnet01」および「Subnet02」のインスタンスのルーティングテーブルを確認すると下記の画面のようになっていて、見えないルーターに対してデフォルトルートが作成されていることを確認できます。
そしてサブネットには「ルートテーブル」というオブジェクトがひも付けられておりサブネット内のインスタンスの通信経路を制御できますが、このルートテーブルは隠れたルーターのルーティングテーブルに割り当てられる設定となります。下記は割り当てているルートテーブルの情報の一例です。
「192.168.0.0/24」(VPC01に割り当てたCIDR)および「0.0.0.0/0」(デフォルトルート)が割り当てられていることを確認できます(※3)。このうち、自動で登録されている「192.168.0.0/24」の経路によってVPC内のサブネットの通信が可能になっています。具体的には、サブネット「Subnet02」のCIDR「192.168.2.0/26」は、この経路内に含まれるセグメントとなり、ロンゲストマッチ規則により通信できるようになります。
※3:デフォルトルートはインターネットからこのVPC環境へアクセスするために手動で設定したものです。詳細は「第2回 インターネットへの接続」で解説します。
これらのネットワーク設定によりインスタンスがルーターを介して、同じVPC内の異なるサブネット内のインスタンスと通信できるようになっており、下記の画面のようにPingで疎通できるようになっています(※4)。
※4:事前にセキュリティグループでPingを通せるようにしています。セキュリティグループについては「第6回 ネットワークセキュリティ」で解説します。
本稿は、「AWSで学ぶクラウド時代のネットワーク基礎知識」というタイトルで、これまであまりネットワークに触れてこなかったエンジニアの方にネットワークの基礎技術をAWSの機能によって理解してもらうことを想定しており、その第1回としてIPネットワークやルーティングという概念について説明し、AWSの環境におけるそれらの設定を紹介しました。
次回、第2回は「インターネットを利用する」という観点で、パブリックIPアドレスやNATについて説明します。
以降、本稿の環境の作成手順を記載します。環境を作って動作を確認したい方は本手順を参考に環境を構築し、試していただければと思います。
本手順で構築する構成は下記の画面のようになります。
VPC作成の前にまずVPCを作成するリージョンを選択します。リージョンとは、リソースを展開する地理的な場所のことで、本稿では「東京」リージョンにVPCを作成します。そこで「AWS マネジメントコンソール」にアクセスし、画面右上の「サポート」メニューの左のリージョンを選択するドロップダウンのメニューをクリックし、表示されるリージョンのリストから「アジアパシフィック(東京) ap-northeast-1」リージョンを選択します。
画面左上の「サービス」メニューでサービスの一覧を表示し、「ネットワークキングとコンテンツ配信」の項にある「VPC」を選択します。
表示された画面の左のメニューから「VPC」を選択すると下記の画面に遷移します。ここで右上の「VPCを作成」ボタンをクリックします。なお、下図のようにデフォルトで1つVPCが存在しますが、今回は別にVPCを作成します。
VPCの名前を「VPC01」、IPv4 CIDRブロックを「192.168.0.0/24」として下記の画面のように設定し、VPCを作成します。VPC内に作成するネットワークの単位となるサブネットはこのIPv4 CIDRブロックで指定する範囲に含まれる必要があります(※5)。
※5:CIDRブロックを追加することもできます(参考:https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Subnets.html#vpc-resize)。
作成後、左のメニューから「VPC」を選択すると、VPCの一覧に先ほど作成した名前、セグメントのVPCが作成されていることを確認できます。デフォルトで作成されているVPCとIPv4 CIDRが同じですが、VPCはそれぞれ分離されているために同じセグメントを指定しても問題はありません(※6)。
※6:ただしセグメントの範囲が重なる場合、VPCピアリングなどの機能によってVPC間で接続できなくなります。そのためにセグメントの範囲が重ならないようにセグメントを割り当てることが推奨されます。
このVPCにサブネットを1つ作成します。左のメニューから「サブネット」を選択し、右上の「サブネットを作成」ボタンをクリックします(※7)。
※7:アベイラビリティーゾーンとは、1つのリージョン内に場所が離れた複数のデータセンターが存在し、それらの中から利用するデータセンターを明示的に指定するパラメーターです。データセンター障害に対する冗長性を明示的に確保する場合に指定します。今回は「指定なし」としていて、ランダムでアベイラビリティーゾーンが選択されます。
サブネットのパラメーターを指定し、「サブネットを作成」ボタンをクリックします。
指定したパラメーターでサブネットが作成されていることを確認できます。なお、利用可能なIPv4アドレスが「59」となっていることを確認できます。これはプレフィックスとして「/26」を指定しており、ホスト部としては0〜63の64個のアドレスが存在しますが、ネットワークアドレス(192.168.0.0)、ブロードキャストアドレス(192.168.0.63)の他、AWSでは最初の3つのIP(192.168.0.1〜192.168.0.3)は予約されており利用できず、5個を除いた192.168.0.4〜192.168.0.62の計59個が仮想マシンなどで利用できるアドレスとなるからです。
また作成したサブネットの「ルートテーブル」を確認するとデフォルトで「192.168.0.0/24」(VPCのCIDR)がひも付いていることを確認できます。これにより、VPC内のあるサブネットのインスタンスは同じVPC内にある他のサブネットのインスタンスとも通信が可能となっています。
次に作成したサブネット内で通信をさせるためにEC2仮想マシンをデプロイします。左上の「サービス」メニューからサービスのリストを表示し、「コンピューティング」の「EC2」を選択します。
左のメニューから「インスタンス」を選択し、右上の「インスタンスを起動」ボタンをクリックします。
インスタンス作成ページに移動するので、画面の指示に従ってインスタンスを作成します。ここでは「Amazon Linux」のイメージを使用します。
ステップ3のインスタンスの詳細設定で、先ほど作成したVPC、サブネットを指定します。IPアドレスはサブネットの中から自動で割り当てられます。また、インターネット経由でこの仮想マシンにアクセスできるように、自動で割り当てられたパブリックIPを有効化します(※パブリックIPは「第2回 インターネットへの接続」で解説します)。
ステップ6のセキュリティグループの設定では、SSHおよびPingの通信確認ができるように新しいセキュリティグループを作成します(※セキュリティグループは「第6回 ネットワークセキュリティ」で解説します)。デフォルトではSSHのみ許可されるため、「ルールの追加」で「すべてのICMP - IPv4」を選択し、VPC内のインスタンスからのみアクセスできるようにICMPのソースに「192.168.0.0/24」(VPCのCIDRアドレス)を指定します。
ウィザードを完了させるとキーペアに関する画面が表示されます。事前にキーペアを作成していない場合はここで作成し、秘密鍵を手元にダウンロードしておく必要があります(※EC2のインスタンスはデフォルトではパスワードが設定されておらず、鍵認証でのログインが必須です)。
下記の画面から、作成されたインスタンスに「プライベートIPv4アドレス192.168.0.62」「パブリックIPv4アドレス18.183.73.63」が割り振られていることを確認できます。これらのアドレスはランダムに割り振られます。
これまでの手順と同様の方法でVPC「VPC01」にサブネット「Subnet02」およびインスタンスを1台作成します。下記の画面は作成したインスタンスの内容です。
IPアドレス192.168.0.81/26が割り振られています。こちらのインスタンスにはインターネットからアクセスを行わせないためにパブリックアドレスは割り当てていません。
ここまででVPC内の環境構築が完了しました。この環境で通信を確認しますが、作成したインスタンスにアクセスするために、インスタンスにひも付けたパブリックIPアドレスに対してインターネット経由でアクセスできるようにする必要があります。そこでインターネットゲートウェイの作成、VPCへの割り当て、ルートテーブルへのひも付けを実施します(詳細は「第2回 インターネットへの接続」で解説します。本稿では設定だけ紹介します)。
・インターネットゲートウェイの作成
まずはインターネットゲートウェイを作成します。VPCのメニューにある「インターネットゲートウェイ」を選択し、画面右上の「インターネットゲートウェイの作成」ボタンをクリックします。
インターネットゲートウェイの名前として「InternetGateway01」と入力し、「インターネットゲートウェイの作成」ボタンをクリックします。
・VPCへの割り当て
作成後、表示されるページの右上のアクションから「VPCにアタッチ」を選択します。
アタッチするVPCとして「VPC01」を選択した後、「インターネットゲートウェイのアタッチ」ボタンをクリックします。
・ルートテーブルへのひも付け
最後に作成したインターネットゲートウェイをルートテーブルにひも付けます。左のメニューから「ルートテーブル」を選択し、右の画面で「VPC01」がひも付いたルートテーブルを選択します。
下側のタブから「ルート」の画面を表示し、「ルートを編集」ボタンをクリックします。
表示される画面で、左下の「ルートを追加」ボタンをクリックし、追加されるエントリで、送信先「0.0.0.0/0」、ターゲットとして作成したインターネットゲートウェイ「InternetGateway01」を選択し、「変更保存」ボタンをクリックします。
・インターネット経由でアクセスできるかどうか確認
上記の操作によって、パブリックIPを持つSubnet01のインスタンスにインターネット経由でアクセスできるようになっており、ローカルの端末からインスタンスにSSHで接続できます(※8)。
※8:鍵認証となるためにインスタンス作成時にダウンロードした秘密鍵を指定し接続します。ユーザー名はAmazon Linuxを利用している場合は「ec2-user」です。
本稿ではAWS マネジメントコンソール上でSSH接続ができる機能を利用してインスタンスにアクセスします。
なお、この機能を利用する場合でもインターネット経由でアクセスができるようにしておく必要があります。コンソール上での接続方法ですが、パブリックIPアドレスを割り当てた1つ目のインスタンスを選択し、「アクション」から「接続」を選択します。
すると「インスタンスに接続」というウィンドウが表示されて4つの接続方法が提示されますが、一番左の「EC2 instance Connect」を利用してインスタンスに接続します。
接続すると、下記の画面のようにインスタンスのコンソールにアクセスできます。
ここまでの設定が正しければ、下記の画面のようにPingで通信できます。
秘密鍵をこのインスタンスに転送しておく必要がありますが、SSHによってSubnet02のインスタンスにログインすることもできます。
Copyright © ITmedia, Inc. All Rights Reserved.