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

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

[NATゲートウェイ編はこちら](http://qiita.com/TK1989/items/5d9bd5d49708c02dff3f)

#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](https://qiita-image-store.s3.amazonaws.com/0/143854/3a496525-f024-2c9f-2cc7-b1a89a2f679c.png)



##サブネット作成

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

| 項目名 | 設定値 |
|:--|:--|
| ネームタグ | nat-test-public-1a-subnet |
| VPC | nat-test-vpc|
| アベイラビリティーゾーン | ap-northeast-1a |
| CIDRブロック | 192.168.0.0/25 |

![image](https://qiita-image-store.s3.amazonaws.com/0/143854/f3f23789-d584-f5d1-dd9b-fd7c334b0d24.png)


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

| 項目名 | 設定値 |
|:--|:--|
| ネームタグ | nat-test-private-1a-subnet |
| VPC | nat-test-vpc|
| アベイラビリティーゾーン | ap-northeast-1a |
| CIDRブロック | 192.168.0.128/25 |

![image](https://qiita-image-store.s3.amazonaws.com/0/143854/b8fc351f-5d67-0f63-6320-6ed4b65db01a.png)


##IGW(インターネットゲートウェイ)作成
###インターネットゲートウェイ作成
| 項目名 | 設定値 |
|:--|:--|
| ネームタグ | nat-test-igw |

![image](https://qiita-image-store.s3.amazonaws.com/0/143854/4030d00f-3802-31c5-abb7-21e0579549ca.png)

###インターネットゲートウェイをVPCにアタッチ
| 項目名 | 設定値 |
|:--|:--|
| VPC | nat-test-vpc |

![image](https://qiita-image-store.s3.amazonaws.com/0/143854/f2728dce-6257-c50c-1dfd-06271de47d55.png)


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

| 項目名 | 設定値 |
|:--|:--|
| ネームタグ | nat-test-public-rt |
| VPC | nat-test-vpc |

![image](https://qiita-image-store.s3.amazonaws.com/0/143854/e2ecf770-2418-cbb4-7949-1912b069e695.png)


###メインルートテーブル編集
####プライベート用サブネット割り当て
サブネットの関連付けで、
**nat-test-private-1a-subnet**
を関連付ける。

![image](https://qiita-image-store.s3.amazonaws.com/0/143854/543947a2-c89e-f99e-2d78-001d2587c870.png)


####ネームタグ変更
変更ついでにネームタグを
**nat-test-private-rt**
に変更して、
ルートテーブルの役割を名前から判別しやすくしておきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/143854/966a9768-e626-59d9-a5ef-3809bce0106f.png)


###カスタムルートテーブル編集
####パブリック用サブネット割り当て
サブネットの関連付けで、
**nat-test-public-1a-subnet**
を関連付ける。

![image](https://qiita-image-store.s3.amazonaws.com/0/143854/ecdaa188-14e2-f8a9-6032-e8127675f886.png)


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

| 送信先 | ターゲット |
|:-:|:-:|
| 0.0.0.0/0 |  nat-test-igw |

![image](https://qiita-image-store.s3.amazonaws.com/0/143854/12aab278-9296-26ac-3117-3c4978aec819.png)


##セキュリティグループ作成
###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](https://qiita-image-store.s3.amazonaws.com/0/143854/d2757a28-52a2-c31d-1860-963613900877.png)

NAT接続インスタンス用セキュリティグループの作成
![image](https://qiita-image-store.s3.amazonaws.com/0/143854/873551b5-c138-2757-aef3-2c3e45333611.png)

NAT用セキュリティグループの編集
![image](https://qiita-image-store.s3.amazonaws.com/0/143854/c841ba2d-02a4-ccac-885d-d9c9aac0c8b9.png)


##EC2作成
###NATインスタンス作成
設定値(重要な箇所のみ抜粋)

| 項目名 | 設定値 |
|:--|:--|
| AMI | ami-831fcde2 <br>(2016/10時点の東京リージョン最新NAT用AMI) |
| ネットワーク | nat-test-vpc |
| サブネット | nat-test-public-1a-subnet |
| 自動割り当てパブリックIP | 有効 |
| セキュリティグループ | nat-test-nat-sg |

####NATインスタンス作成後
NATインスタンスの
**送信元/送信先の変更チェック** を **無効** にする。

![image](https://qiita-image-store.s3.amazonaws.com/0/143854/fded2df5-bcdd-d1f3-8105-110195e43a14.png)

このことは、AWSのドキュメントで、
*EC2 インスタンスは、送信元/送信先チェックをデフォルトで実行します。
つまり、そのインスタンスは、そのインスタンスが送受信する任意のトラフィックの送信元または送信先である必要があります。
しかし、NAT インスタンスは、送信元または送信先がそのインスタンスでないときにも、
トラフィックを送受信できなければなりません。
したがって、NAT インスタンスでは送信元/送信先チェックを無効にする必要があります。*
と記載されています。

私自身、この記載の内容についてきちんと理解はできていませんが、
これはNAT接続するインスタンスがインターネット接続する際、
パケット送信先がNATインスタンスでないのに、パケットは一度NATインスタンスを通る必要があるため、
そこでNATインスタンスでの送信元/送信先チェックによってパケットがはじかれるのでは？
と思っています。


###NAT接続するインスタンス作成
設定値(重要な箇所のみ抜粋)

| 項目名 | 設定値 |
|:--|:--|
| AMI | なんでも<br>(検証ではAmazon Linux：ami-1a15c77b <br>(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](https://qiita-image-store.s3.amazonaws.com/0/143854/dd2f433f-4d8b-01f3-d9bf-1c8721c0d2da.png)


##動作確認

NAT接続するインスタンスに、
NATインスタンスを経由して、
pingやcurlでインターネットに接続できることを確認する。

`ping google.co.jp`
`curl http://google.co.jp/`

![image](https://qiita-image-store.s3.amazonaws.com/0/143854/dc6c64af-326d-d523-d014-39c8efb84496.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/143854/4aca79f0-e83d-78ee-b366-a279e313748d.png)


#最後に
NATインスタンスを用意することで、
インターネット接続できないインスタンスからも
NATによってインターネット接続をすることが出来るようになりました。

しかし、NATインスタンスに冗長性を持たせなければ、
NATインスタンスが単一障害点になってしまいます。
単一障害点とならないような方法として、autoscaling + cloud-initで
インスタンス起動時にルートテーブルの参照するNATインスタンスを付け替えるなどの
方法があるようですが、結構手間だと思われます。

この問題をより簡潔に解決する方法として、
NATゲートウェイという方法があります。
次回はこのNATゲートウェイについて記載しようと思います。

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