Amazon VPCってなんじゃ?(public subnet編)に引き続き、VPCを紹介してみたいと思います。
今回は、publicに加えてprivate subnetも作成してみます。

はじめに、前回同様VPCを作成するために「Get started creating a VPC」もしくは「Create Another VPC」を
クリックします。
そして、今回は下記のように2番目の「VPC with Public and Private Subnets」を選択します。

上記の選択をすると、各項目がデフォルトで設定された状態で表示されます。
VPCが10.0.0.0/16、Publicが10.0.0.0/24、Privateが10.0.1.0/24と設定されています。
また、ここで「One NAT Instance with an Elastic IP Address」という項目がありますが、これはNATインスタンスと呼ばれる、PrivateとPublicの橋渡しをするための専用EC2インスタンスで、この設定ではNATインスタンスが起動されるようになっています。

今回は、2つのサブネットのAZをaゾーンに設定して「Create VPC」をクリックします。

そうすると、作成が完了し、VPCのダッシュボードに作成された各オブジェクトが表示されます。

ここで、「2 Subnets」もしくは左ペインのメニューにある「Subnets」をクリックして、サブネットの一覧を確認すると、設定の通り、10.0.0.0/24, 10.0.1.0/24の2つのサブネットがあります。

このうち、Public(10.0.0.0/24)の行を選択すると、下部ペインにルーティング情報が表示され、10.0.0.0/16がlocal、0.0.0.0/0がigw-xxxxxというインターネットゲートウェイにルーティングされていることが
わかります。

一方、Private(10.0.1.0/24)では、10.0.0.0/16がlocal、0.0.0.0/0がNATインスタンスにルーティングされているのが
わかります。
つまり、Privateから外部への通信はすべてNATインスタンスを経由することになります。

また、NATインスタンスは以下のように、ElasticIPが割り振られており、PublicSubnet内にNATインスタンス専用の
AMIから起動されていることがわかります。
NATインスタンスだとわかるようにnatという名前にしておきます。

ここで、PublicとPrivateにそれぞれEC2インスタンスを作成してみます。
まずは、Publicのインスタンスです。
Subnetに10.0.0.0/24を選択し、IPを10.0.0.4として、public4という名前で起動します。
また、publicという名前のVPCセキュリティグループを新規作成します。

尚、このインスタンスは外部に面しているので、ENIにEIPを割り振ります。

上記と同じように、PrivateにもIPが10.0.1.4でprivate4という名前でEIPは振らずにインスタンスを起動します。
privateという名前のVPCセキュリティグループを付けて新規作成します。

VPCのセキュリティグループを確認してみます。
defaultと、先程作成したpublic、privateの計3つのセキュリティグループが存在します。
この中で、defaultはNATインスタンスに自動的に割り当てられています。

・defaultセキュリティグループでは、privateからアクセスされるnatインスタンスのためのグループなので下記とします。

Inbound – ALL:10.0.1.0/24 Outbound – ALL:0.0.0.0/0

INとOUTで使用されるポートが決まっていたらポートも指定しますが、ここではALLとします。

・publicセキュリティグループは、インターネットからアクセスされ、またprivateサブネットへの踏み台とするため、ここではSSHで接続すると仮定して下記とします。

Inbound – 22番ポート:接続するオフィスのIPアドレス
Outbound – ALL:0.0.0.0/0

WEBサーバーを置く場合は、Inboundに80番ポート:0.0.0.0/0(ALL)を追加しますが、
ここではOutboundを便宜上ALL:0.0.0.0/0としています。
(SSHの踏み台専用のインスタンスを用意するのであれば、publicセキュリティグループには22番ポートを加えずに、踏み台専用のセキュリティグループにオフィスからの22番のInboundとprivateに対しての22番のOutboundを用意します。)

・privateセキュリティグループでは、publicサブネットからのアクセスのみを受付けるため下記とします。

Inbound – 22番ポート:10.0.0.0/24
Outbound – ALL:0.0.0.0/0

(踏み台専用のインスタンスを用意するのであれば、InboundのSourceを
そのインスタンスのプライベートIPに固定します。)

以上の設定が完了したら、nat、public、privateの各インスタンスにSSHでアクセスしてみます。

○natインスタンスにSSH

$ ssh -i /Users/memorycraft/Development/cloudpack/myfirstcloud/keys/myfirstcloudkey.pem ec2-user@103.4.12.222

ssh: connect to host 103.4.12.222 port 22: Operation timed out

上記のようにタイムアウトしました。
これは、NATインスタンスにはdefaultセキュリティグループが割り当てられており、外部からのアクセスを許可していないので、当然接続できません。

○publicインスタンスにSSH

$ ssh -i ~/Development/cloudpack/myfirstcloud/keys/myfirstcloudkey.pem ec2-user@103.4.12.232
Last login: Wed Jan  4 19:22:54 2012 from 219.117.233.241.static.zoot.jp

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|___|___|

See /usr/share/doc/system-release/ for latest release notes.
[ec2-user@ip-10-0-0-4 ~]$

上記のように接続することができました。
publicサブネットはインターネットゲートウェイからルーティングされており、publicセキュリティグループでSSHを
許可しているので、接続することができます。

○privateインスタンスにSSH

privateインスタンスはEIPがないので、接続することができないので、publicインスタンス内からアクセスしてみます。

[ec2-user@ip-10-0-0-4 ~]$ ssh ec2-user@10.0.1.4

The authenticity of host '10.0.1.4 (10.0.1.4)' can't be established.
RSA key fingerprint is 51:f5:d1:f6:96:76:f0:8f:23:95:61:80:32:d1:50:51.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.1.4' (RSA) to the list of known hosts.
Permission denied (publickey).

通信はできるようですが、キーファイルが存在しないために接続することができないようです。
privateインスタンスの作成時にも既存のキーペアの設定を行った為です。
ここで、ローカルマシンのpemファイルを開いて、内容をコピーしpublicインスタンス内にpemファイルを作成します。

[ec2-user@ip-10-0-0-4 ~]$ vi ~/.ssh/myfirstcloudkey.pem
[ec2-user@ip-10-0-0-4 ~]$ chmod 600 ~/.ssh/myfirstcloudkey.pem

作成したpemファイルを用いてSSHアクセスします。

[ec2-user@ip-10-0-0-4 ~]$ ssh -i ~/.ssh/myfirstcloudkey.pem ec2-user@10.0.1.4

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|___|___|

See /usr/share/doc/system-release/ for latest release notes.
[ec2-user@ip-10-0-1-4 ~]$

上記のように接続することができました。
privateインスタンスではpublicサブネットからのSSHアクセスだけを受け付けているため、このように接続することができます。

また、次にpublic, privateからwww.google.comに対してtracerouteしてみます。

○publicインスタンスからtraceroute

$ traceroute www.google.com
traceroute to www.google.com (74.125.235.113), 30 hops max, 60 byte packets
 1  ec2-175-41-192-56.ap-northeast-1.compute.amazonaws.com (175.41.192.56)  0.494 ms  0.478 ms  0.458 ms
 2  27.0.0.146 (27.0.0.146)  1.621 ms  1.608 ms  1.584 ms
 3  27.0.0.134 (27.0.0.134)  1.653 ms  1.636 ms  1.609 ms
 4  15169.tyo.equinix.com (203.190.230.31)  1.691 ms  1.667 ms  1.646 ms
 5  72.14.239.202 (72.14.239.202)  1.991 ms  1.961 ms  2.034 ms
 6  209.85.251.39 (209.85.251.39)  3.411 ms  3.547 ms  3.639 ms
 7  nrt19s02-in-f17.1e100.net (74.125.235.113)  2.219 ms  2.148 ms  2.372 ms

○privateインスタンスからtraceroute

$ traceroute www.google.com
traceroute to www.google.com (74.125.235.180), 30 hops max, 60 byte packets
 1  10.0.0.133 (10.0.0.133)  0.441 ms  0.555 ms  0.535 ms
 2  ec2-175-41-192-58.ap-northeast-1.compute.amazonaws.com (175.41.192.58)  1.022 ms  0.996 ms  0.976 ms
 3  27.0.0.164 (27.0.0.164)  0.931 ms  0.993 ms  0.963 ms
 4  27.0.0.146 (27.0.0.146)  2.147 ms  2.262 ms  2.233 ms
 5  27.0.0.134 (27.0.0.134)  3.154 ms  3.259 ms  3.226 ms
 6  15169.tyo.equinix.com (203.190.230.31)  3.273 ms  2.876 ms  3.125 ms
 7  72.14.239.202 (72.14.239.202)  2.643 ms  2.480 ms  2.598 ms
 8  209.85.241.133 (209.85.241.133)  4.273 ms  4.365 ms  4.475 ms
 9  nrt19s12-in-f20.1e100.net (74.125.235.180)  3.596 ms  3.574 ms  3.664 ms

privateインスタンスからの場合、10.0.0.133(NATインスタンス)を経由しているのが確認できます。
また、前出のルーティングテーブルと、セキュリティグループが機能していることが確認できます。

上述のセキュリティグループでは使用するミドルウェアや要件によって、より詳細な設定をするべきです。
今回はALLで許可をしましたが、WEBサーバーやDBサーバーなどを登場させた場合、80ポートや3306ポート等、必要なポートにのみ許可を与えることでセキュリティレベルを高めるようにする必要があります。

また、セキュリティグループはインスタンスレベルでのファイアーウォール機能です。
ネットワークレベルでのセキュリティにはNetwork ACLというものがVPCにありますので、次の機会に紹介したいと思います。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら