Help us understand the problem. What is going on with this article?

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

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

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

TK1989
大阪に住むWeb系エンジニア。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした