Edited at

AWS NAT構成の作り方(NATインスタンス編)

More than 1 year has passed since last update.

AWSでのNAT接続を実現する方法を備忘を兼ねて記載。

NATゲートウェイ編はこちら


NAT構成の必要性

簡単にいうと、

インターネットから接続される必要のないインスタンスについて、

インターネットからの接続を遮断しつつ、

自身はインターネットに接続を出来るようにするため。

外部から接続される危険性を減らすことと、

ライブラリの取得などで必要になる外部への接続の両立が可能となる。


参考

シナリオ 2: パブリックサブネットとプライベートサブネットを持つ VPC(NAT)

http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Scenario2.html

NAT インスタンス

http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html


NAT構成の作り方(NATインスタンス)

マネジメントコンソール(GUI)にて作成


VPC作成


VPC作成

項目名
設定値

ネームタグ
nat-test-vpc

CIDRブロック
192.168.0.0/24

テナンシー
デフォルト

image


サブネット作成


パブリック用サブネット作成

項目名
設定値

ネームタグ
nat-test-public-1a-subnet

VPC
nat-test-vpc

アベイラビリティーゾーン
ap-northeast-1a

CIDRブロック
192.168.0.0/25

image


プライベート用サブネット作成

項目名
設定値

ネームタグ
nat-test-private-1a-subnet

VPC
nat-test-vpc

アベイラビリティーゾーン
ap-northeast-1a

CIDRブロック
192.168.0.128/25

image


IGW(インターネットゲートウェイ)作成


インターネットゲートウェイ作成

項目名
設定値

ネームタグ
nat-test-igw

image


インターネットゲートウェイをVPCにアタッチ

項目名
設定値

VPC
nat-test-vpc

image


ルートテーブル作成


カスタムルートテーブル作成

項目名
設定値

ネームタグ
nat-test-public-rt

VPC
nat-test-vpc

image


メインルートテーブル編集


プライベート用サブネット割り当て

サブネットの関連付けで、

nat-test-private-1a-subnet

を関連付ける。

image


ネームタグ変更

変更ついでにネームタグを

nat-test-private-rt

に変更して、

ルートテーブルの役割を名前から判別しやすくしておきます。

image


カスタムルートテーブル編集


パブリック用サブネット割り当て

サブネットの関連付けで、

nat-test-public-1a-subnet

を関連付ける。

image


ルート追加

ルートにインターネットゲートウェイを追加

送信先
ターゲット

0.0.0.0/0
nat-test-igw

image


セキュリティグループ作成


NATインスタンス用セキュリティグループ

セキュリティグループ

項目名
設定値

セキュリティグループ名
nat-test-nat-sg

説明
security group for nat

VPC
nat-test-vpc

インバウンド

タイプ
プロトコル
ポート範囲
送信元

SSH
TCP
22
マイIP

HTTP
TCP
80
nat-test-ap-sg

すべてのICMP
すべて
該当なし
nat-test-ap-sg

ここで、NAT接続インスタンスが接続したいポートについて

NAT接続インスタンス用セキュリティグループからの

インバウンドを許可しておく必要があります。

NAT接続用インスタンスはインターネットに接続する際に、

NATインスタンスを経由するので、

NATインスタンスがNAT接続用インスタンスからのインバウンドを許可しておかないと

NATインスタンスとNAT接続用インスタンス間で通信がはじかれるためです。


NAT接続インスタンス用セキュリティグループ

項目名
設定値

セキュリティグループ名
nat-test-ap-sg

説明
security group for ap

VPC
nat-test-vpc

インバウンド

タイプ
プロトコル
ポート範囲
送信元

SSH
TCP
22
nat-test-nat-sg

NAT用セキュリティグループの作成

image

NAT接続インスタンス用セキュリティグループの作成

image

NAT用セキュリティグループの編集

image


EC2作成


NATインスタンス作成

設定値(重要な箇所のみ抜粋)

項目名
設定値

AMI
ami-831fcde2
(2016/10時点の東京リージョン最新NAT用AMI)

ネットワーク
nat-test-vpc

サブネット
nat-test-public-1a-subnet

自動割り当てパブリックIP
有効

セキュリティグループ
nat-test-nat-sg


NATインスタンス作成後

NATインスタンスの

送信元/送信先の変更チェック無効 にする。

image

このことは、AWSのドキュメントで、

EC2 インスタンスは、送信元/送信先チェックをデフォルトで実行します。

つまり、そのインスタンスは、そのインスタンスが送受信する任意のトラフィックの送信元または送信先である必要があります。

しかし、NAT インスタンスは、送信元または送信先がそのインスタンスでないときにも、

トラフィックを送受信できなければなりません。

したがって、NAT インスタンスでは送信元/送信先チェックを無効にする必要があります。


と記載されています。

私自身、この記載の内容についてきちんと理解はできていませんが、

これはNAT接続するインスタンスがインターネット接続する際、

パケット送信先がNATインスタンスでないのに、パケットは一度NATインスタンスを通る必要があるため、

そこでNATインスタンスでの送信元/送信先チェックによってパケットがはじかれるのでは?

と思っています。


NAT接続するインスタンス作成

設定値(重要な箇所のみ抜粋)

項目名
設定値

AMI
なんでも
(検証ではAmazon Linux:ami-1a15c77b
(2016/10時点の東京リージョン最新Amazon Linux用AMI)を使用)

ネットワーク
nat-test-vpc

サブネット
nat-test-private-1a-subnet

自動割り当てパブリックIP
無効

セキュリティグループ
nat-test-ap-sg


ルートテーブル編集


プライベート用ルートテーブル(nat-test-private-rt)修正

送信先
ターゲット

0.0.0.0/0
NATインスタンスのinstance-id

image


動作確認

NAT接続するインスタンスに、

NATインスタンスを経由して、

pingやcurlでインターネットに接続できることを確認する。

ping google.co.jp

curl http://google.co.jp/

image

image


最後に

NATインスタンスを用意することで、

インターネット接続できないインスタンスからも

NATによってインターネット接続をすることが出来るようになりました。

しかし、NATインスタンスに冗長性を持たせなければ、

NATインスタンスが単一障害点になってしまいます。

単一障害点とならないような方法として、autoscaling + cloud-initで

インスタンス起動時にルートテーブルの参照するNATインスタンスを付け替えるなどの

方法があるようですが、結構手間だと思われます。

この問題をより簡潔に解決する方法として、

NATゲートウェイという方法があります。

次回はこのNATゲートウェイについて記載しようと思います。

※記述ミス・認識違いなどがあれば、ご指摘いただけると幸いです。