■AWS NAT
NATゲートウェイを作成できる
できることは通常のNATと同じだが、AWSのマネージドサービスなので可用性が高い
利用料金や帯域幅については、使用する際に改めて確認する
【新機能】ついに登場!Amazon VPC NAT GatewayでNATがAWSマネージドに
http://dev.classmethod.jp/cloud/aws/introduce-to-amazon-vpc-nat-gateway/
Amazon VPCにNAT Gatewayが追加されたので試してみた
http://yoshidashingo.hatenablog.com/entry/2015/12/18/041217
AWS NAT構成の作り方(NATゲートウェイ編) - Qiita
https://qiita.com/TK1989/items/5d9bd5d49708c02dff3f
AWS NATインスタンスを作成したメモ - Qiita
https://qiita.com/hc_isobe/items/3520173b1065aeae884b
NAT Gatewayによるアクセス元IPアドレスの固定 | DevelopersIO
https://dev.classmethod.jp/articles/fix-sender-ip-address-with-nat-gateway/
【AWS】NATゲートウェイとインターネットゲートウェイの違い - Hanatare's PaPa
https://www.hanatare-papa.jp/entry/technology-aws-natgateway-1-446
NATゲートウェイ構成時の注意事項 | Oji-Cloud
https://oji-cloud.net/2019/09/19/post-3085/
以下、環境構築の検証。以下のような環境を作成する
・VPCはパブリックとプライベートのサブネットを持つ
・パブリックなサブネットに踏み台サーバ、プライベートなサブネットにWebサーバを置く
・WebサーバにSSHでアクセスする場合、踏み台サーバを経由する
・Webサーバにブラウザでアクセスする場合、ロードバランサーを経由する
ロードバランサーを経由しないブラウザアクセス(テスト時など)は、ポートフォワーディングを使用する
・プライベートなサブネットに置かれたWebサーバからインターネットにアクセスする場合、NATゲートウェイを経由する
■VPC環境の作成
このテキストの「VPC」の項目をもとに
・VPCの作成
・サブネットの作成
・インターネットゲートウェイの作成
・ルートテーブルの作成
・セキュリティグループの作成
を行う(RDSやElastiCache用のVPC設定も、必要に応じて行う)
ここまでは通常のVPC作成と同じ
以降はNAT環境のための手順
■踏み台サーバの作成
踏み台用にEC2を作成する
自動割り当てパブリックIPは「有効化」にする。もしくはEIPを割り当てる(外部からアクセスできるようにする)
名前は今回は「Develop-Bastion」とする。EIPは 203.0.113.1 とする
ここではテストのために、まずは最低限Webサーバとして使えるようにする(NATの利用にWebサーバは必須ではない)
あらかじめセキュリティグループで、22番ポートと80番ポートのアクセスを許可しておく
・SSHでサーバ 203.0.113.1 に接続
・必要に応じて日本語設定にしておく
・必要に応じてホスト名を設定しておく(デフォルトでは「ip-10-1-0-87」のようなホスト名。このままでもいい)
・必要に応じてタイムゾーンを設定しておく
・以降は以下を設定
# yum -y install nginx
# service nginx start
# chkconfig nginx on
ブラウザで以下にアクセスできることを確認する
http://203.0.113.1/
SSHの設定ファイルを以下のようにしておけば、「ssh refirio-dev」でアクセスできる
Host refirio-dev
Hostname 203.0.113.1
User ec2-user
IdentityFile C:/Users/refirio/Documents/SSH/refirio/AWS.pem
IdentitiesOnly yes
■NATゲートウェイの作成
VPC → NATゲートウェイ → NATゲートウェイの作成
サブネット: Develop-DMZ-A(作成済みのパブリックなサブネットを選択する)
Elastic IP 割り当て ID: (作成済みのEIPを設定するか、新しく作成する)
と入力してNATゲートウェイを作成する
VPC → ルートテーブル → ルートテーブルの作成
名前タグ: Develop-NAT
VPC : Develop
と入力してルートテーブルを作成する
作成したルートテーブルの「ルート」を編集し、以下を追加する
接続先: 0.0.0.0/0
ターゲット: (作成したNATゲートウェイ)
これで、ルートテーブルに設定されていないIPアドレス宛てのすべてのパケットは、作成したNATゲートウェイに向く
VPC → サブネット
作成済みのプライベートなサブネットを選択し、各サブネットの「ルートテーブル」を上で作成したものに変更する
※NATゲートウェイは、作成してもしばらくは「保留中」となって割り当てたEIPも表示されない
この状態だとNATとして機能していない
5〜10分程度待つと「使用可能」になり、EIPも表示される
■NATゲートウェイの動作確認
パブリックなサーバからtracerouteを試す
curlなどで外部のサーバにアクセスすると、アクセス先のサーバのログにはEC2のIPアドレスが記録されている
$ traceroute www.google.com
traceroute to www.google.com (172.217.25.68), 30 hops max, 60 byte packets
1 ec2-175-41-192-146.ap-northeast-1.compute.amazonaws.com (175.41.192.146) 17.190 ms ec2-175-41-192-148.ap-northeast-1.compute.amazonaws.com (175.41.192.148) 13.897 ms ec2-175-41-192-154.ap-northeast-1.compute.amazonaws.com (175.41.192.154) 17.141 ms
2 100.64.2.206 (100.64.2.206) 13.185 ms 100.64.1.206 (100.64.1.206) 13.061 ms 100.64.2.10 (100.64.2.10) 14.259 ms
3 100.66.2.98 (100.66.2.98) 21.632 ms 100.66.2.10 (100.66.2.10) 17.852 ms 100.66.3.98 (100.66.3.98) 14.524 ms
〜以下略〜
プライベートなサーバからtracerouteを試す
NATゲートウェイのプライベートIPは 10.0.0.154 なので、NATを通じて外にアクセスしていることが分かる
curlなどで外部のサーバにアクセスすると、アクセス先のサーバのログにはNATのパブリックIPアドレスが記録されている
$ traceroute www.google.com
traceroute to www.google.com (172.217.24.132), 30 hops max, 60 byte packets
1 10.0.0.154 (10.0.0.154) 0.244 ms 0.237 ms 0.222 ms
2 ec2-175-41-192-148.ap-northeast-1.compute.amazonaws.com (175.41.192.148) 20.865 ms ec2-175-41-192-144.ap-northeast-1.compute.amazonaws.com (175.41.192.144) 18.352 ms ec2-175-41-192-148.ap-northeast-1.compute.amazonaws.com (175.41.192.148) 20.835 ms
3 100.64.3.14 (100.64.3.14) 16.225 ms 100.64.2.12 (100.64.2.12) 16.641 ms 100.64.1.202 (100.64.1.202) 13.434 ms
〜以下略〜
■Webサーバの作成
名前は今回は「Develop-Web1」とする。プライベートIPは 10.0.2.63 とする
まずは最低限Webサーバとして使えるようにしておく
踏み台サーバからHTTPリクエストを送り、Webサーバにアクセスできることを確認する
$ curl
http://10.0.2.63/
SSHの設定ファイルを以下のようにしておけば、「refirio-dev-web1」でアクセスできる
(Poderosaは多段接続に対応していないようなので、Git Bash や ConEmuで試した)
Host refirio-dev
Hostname 203.0.113.1
User ec2-user
IdentityFile C:/Users/refirio/Documents/SSH/refirio/AWS.pem
IdentitiesOnly yes
Host refirio-dev-web1
Hostname 10.0.2.63
User ec2-user
IdentityFile C:/Users/refirio/Documents/SSH/refirio/AWS.pem
IdentitiesOnly yes
ProxyCommand ssh refirio-dev -W %h:%p
■ポートフォワーディングで確認
Git Bash で以下を実行してポートフォワーディング
ブラウザから
http://localhost/ にアクセスすると、Develop-Web1 サーバの内容が表示される
$ ssh -fNCL 0.0.0.0:80:localhost:80 refirio-dev-web1
■ロードバランサーの作成
以降は通常の手順で大丈夫のはず