VPCのあまり触ってないところ

最近AWSの認定資格のAWS 認定ソリューションアーキテクト – アソシエイトを取得しようかなと思っています。そのこともあって勉強かねて普段あまり個人的に触らないところを触ってみたいと思いました。まずはVPCから。こういう機会は基礎固めにとても良いですね。

VPCエンドポイント

VPCと他のAWSサービスをプライベート接続するための機能です。2015年に追加された機能です。たとえばS3はインターネットアクセスが必要なため本来インターネットする必要がないサブネットであってもインターネットゲートウェイをルートテーブルにアタッチする必要などがありました。VPCエンドポイントを利用するとVPCはプライベートのまま他のAWSサービスを利用できるようになります。

他のAWSサービスといっても今のところS3が主のようでVPCウィザードで作成する際にS3のエンドポイントという表現がされています。実質S3用の機能なのかもしれません。

NewImage

VPCエンドポイントを作成するとルートテーブルにcom.amazonaws.ap-northeast-1.s3が設定されます。この状態になっているとインターネットアクセスができないプライベートサブネットでもS3へのアクセスができます。

$ wget https://www.onecoindog.com
--2016-04-05 22:32:38--  https://www.onecoindog.com/
www.onecoindog.com (www.onecoindog.com) をDNSに問いあわせています... 52.69.64.136, 52.69.22.220
www.onecoindog.com (www.onecoindog.com)|52.69.64.136|:443 に接続しています... ^C

上記の場合自分の環境ではNATインスタンスのセキュリティグループでHTTPSを有効にしていないのでHTTPSはアクセスできないようになっています。

$ wget https://s3-ap-northeast-1.amazonaws.com/takayukii-blog-wp-uploads/acf-images-search-and-insert.zip
--2016-04-05 22:32:45--  https://s3-ap-northeast-1.amazonaws.com/takayukii-blog-wp-uploads/acf-images-search-and-insert.zip
s3-ap-northeast-1.amazonaws.com (s3-ap-northeast-1.amazonaws.com) をDNSに問いあわせています... 54.231.229.18
s3-ap-northeast-1.amazonaws.com (s3-ap-northeast-1.amazonaws.com)|54.231.229.18|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 2358844 (2.2M) [application/zip]
`acf-images-search-and-insert.zip.1' に保存中

acf-images-search-and-insert. 100%[=================================================>]   2.25M  --.-KB/s    in 0.06s   

2016-04-05 22:32:45 (40.6 MB/s) - `acf-images-search-and-insert.zip.1' へ保存完了 [2358844/2358844]

しかしS3へのアクセスであればVPCエンドポイントを作成しているのでNATの有無等に関わらずアクセスが可能になります。接続方法は特に変わらず透過的にVPCエンドポイントがよしなにやってくれるようです。

VPC Endpointを使ってS3にアクセスしてみる

プライベートサブネットからのインターネットアクセス

今まで特にバックエンドで大掛かりに処理をする要件もなくプライベートサブネットを作ってこなかった事もありNATゲートウェイやNATインスタンスなどはあまり馴染みがありません。プライベートサブネットからインターネットへアクセスする方法ですが、これには2つ方法があります。いずれもVPCウィザードからオプションで自動で生成することができます。NATゲートウェイもNATインスタンスもElastic IPが必要になるので事前に割り当てておく必要があります。

NATインスタンスを利用する

NewImage

ルートテーブルにNATインスタンスのENIとインスタンスIDが設定されてます。別途NATインスタンスに対してNAT用のセキュリティグループを設定する必要があります。

NATSG セキュリティグループを作成する

NATゲートウェイを利用する

NewImage

ルートテーブルにNATゲートウェイが設定されてます。なお、NATゲートウェイではセキュリティグループはないので各EC2インスタンス側のセキュリティグループでアウトバウンドの設定などをしっかりしておく必要がありますね。

NAT インスタンスと NAT ゲートウェイの比較

フローログ

VPCのIPトラフィックの監視ができる機能です。VPCとサブネットに作成する事ができます。

手順はほとんど必要なくて事前にCloudWatchのロググループを作っておくのとウィザードの途中でロールを作成するくらいです。ロールは勝手に作ってくれますが必要な権限は下記のような感じでした。

NewImage

CloudWatchのログは少しタイムラグがあるようですが少し待っていたら意図したログが確認できました。ACCEPTの場合はセキュリティグループまたはネットワークACLで許可されていてREJECTの場合はそうでない状態です。下記のログレコードだと最初セキュリティグループでポート80を許可してなかったんですが、許可するようにしたらACCEPTに変わってるのが分かると思います。

NewImage

たとえばフローログでパケットを監視してアクセス状況によってセキュリティグループだけでなくネットワークACLでブロックする等の使い方もありそうですね。

【新機能】VPC Flow LogsでVPC内のIPトラフィックを監視することができるようになりました!

ネットワークACL

ネットワークACLはVPCレベルのアクセス制御を行うものです。VPC単位で設定します。ネットワークACLの特徴としてはブラックリスト型で制御できるという事があるようです。

AWSでブラックリスト型のFirewallを実装する。〜BlackList Firewallパターン〜

たしかにセキュリティグループはホワイトリストのみなので、特定IPからの攻撃に対応するという場合はネットワークACLを使うのが良さそうです。

試しに自分のグローバルIPアドレスからのポート80へのアクセスを遮断してみました。ルール#は優先順位に関係するようでこの場合遮断のルールは全てのトラフィック許可よりも先に読まれないと有効になりません。

NewImage

ブラウザでアクセスしてみるとタイムアウトになるのが確認でき、さきほどのフローログで確認するとREJECTに変わってるのが確認できました。

NewImage

なお、アウトバウンドのアクセス制御の注意点としてネットワークACLではエフェメラルポートを開放する必要があります。エフェメラルポートとは、通信の帰りでクライアントが受けるランダムなポート(1024-65535)です。

VPN接続

設定手順等についてはスライドシェアにもあがっています。

Amazon VPC VPN接続設定 参考資料

オンプレミス側ではインターネットで通信可能なVPNのエンドポイントが必要になります。オンプレミス側でBGPという動的なルーティングに対応している機器の場合はAS番号が必要になります(こちらのほうが障害時の経路変更ができるため優れています)。

こちらの設定を見てると分かりやすいです。自宅のルータを変えてVMware上のVyOSをVPNルータとして使っています。自分でもやってみようかな。1時間$0.05なので月4000円くらいですかね。

AWS VPC VPN ConnectionsがNAT Traversal対応したので試してみた

カスタマーゲートウェイ側の設定ファイルはAWSマネジメントコンソールからダウンロードできます。
VPC側ではサブネットのルートテーブルにオンプレミス側のアクセスしたいネットワークアドレスと作成した作成したVPNゲートウェイのIDを設定します。VPC間のピアリング接続と容量的には同じですね。

その他

こちらの記事がかなり参考になります。

【初心者向け】AWS IPアドレス設計で押さえておきたいポイント

サブネットで利用できるIPアドレスの個数は、AWSで4つ予約されたアドレスがあるため、-4つ減らした個数が利用可能なので注意すること。

インスタンスへの固定IPアドレスの利用は避けること。