62
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-10-23

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ゲートウェイについて記載しようと思います。

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

62
66
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
62
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?