Amazpn VPCで踏み台経由でログインできるネットワーク環境をつくってみる
背景
個人開発で使える本番サーバー環境が欲しかったのと、ちょうど仕事でも活かせそうだったので、自分でAWSのネットワーク環境を作ってみました。
全体像
用意したいサーバーは2つです。
- 踏み台
- sshでログインし、さらにsshで本番サーバーへログインするためのもの
- sshログイン用のport以外は開けない
- 本番サーバー
- 踏み台サーバーからのみsshでログイン可能
VPCの作成
AWSで管理する仮想ネットワークを定義します。
AWSマネジメントコンソールからサービス>VPCを選択
既にデフォルトのVPCが定義されていますが、今回は使わずに削除します。
「VPCの作成」を選択
Name | vpc-sample |
IPv4 CIDR ブロック | 192.168.0.0/16 |
CIDR ブロックは、仮想ネットワーク内のIPアドレスの範囲を指定します。
今回は 192.168.0.0
~ 192.168.255.255
で 65,536 個のIPアドレスを持つことになります。
VPC とサブネット
CIDRブロックは 16~28の間で指定する必要があるようです。
サブネットの作成
上で作成したVPCの中でネットワークを小分けにします。
VPCダッシュボードの中から「サブネット」を選択
「サブネットの作成」を選択し、以下2つのサブネットを作成しました。
1つ目
名前タグ | subnet-sample-public |
VPC | {作成したvpc-sampleがデフォルトで選択されている} |
アベイラビリティゾーン | ap-northeast-1a |
IPv4 CIDR ブロック | 192.168.1.0/24 |
2つ目
名前タグ | subnet-sample-private |
VPC | {作成したvpc-sampleがデフォルトで選択されている} |
アベイラビリティゾーン | ap-northeast-1a |
IPv4 CIDR ブロック | 192.168.2.0/24 |
1つ目が踏み台用、2つ目が本番用という想定です。
それぞれ256個ずつIPアドレスを持つことになります。
アベイラビリティゾーンは東京では ap-northeact-1a
ap-northeast-1c
の2択ですが、どちらが具体的にどこの場所、というのはなく、仮想ネットワーク毎にAWS側で振り分けられるそうです。
なので、 「 1a
は沢山の人が選んで混んでそうだからa 1c
にしよう」みたいなことは意味がないらしいです。
情報元はどこかのネット記事で読んだのですがどこかへ行ってしまいました。。
インターネットゲートウェイの作成
仮想ネットワークをインターネットと繋げる為に、インターネットゲートウェイを作成します。
VPCダッシュボードからインターネットゲートウェイ>インターネットゲートウェイの作成を選択
名前は igw-sample
としておきます。
ルートテーブルの作成
上で作成したインターネットゲートウェイを紐付けるためのルートテーブルを作成します。
ルートテーブル>ルートテーブルの作成を選択し、 rtb-sample
を指定します。
作成後、 0.0.0.0/0
(デフォルトゲートウェイとして) インターネットゲートウェイを紐付けます。
さらに、「サブネットの関連付け」で踏み台用のサブネットである subnet-sample-public
を紐付けます。
EC2(踏み台)の作成
いよいよサーバーです。
サービス>EC2>インスタンスから「インスタンスの作成」を選択
ちょうど数日前にリリースされたAmazon Linux 2 が無料枠で選べる状態だったので、これを選択します。
t2.micro
を選択します。
インスタンスの詳細設定です。
ちょっと項目数が多いのでかいつまんで。
ネットワーク | vpc-sample |
サブネット | subnet-sample-public |
自動割り当てパブリックIP | 有効化 |
プライマリIP | 192.168.1.10 |
ここは若干ハマってしまった所なのですが、プライマリIPを 192.168.1.1
に指定したら、最後のEC2作成のフェーズでエラーになってしまいました。
プライマリIPは先頭と末尾(192.168.1.0
192.168.1.255
)だけ避ければ良いと思っていたのですが、他にも 192.168.1.1
192.168.1.2
192.168.1.3
は予約済アドレスとなるようです。
プライマリIPはわざわざ指定しなくても良かったかもしれないです。
次はストレージの追加です。
デフォルトのまま進めます。
Name
タグに bastion
を指定します。
「新しいセキュリティグループを作成する」を選択し、セキュリティグループ名を bastion-sg
とします。
セキュリティグループの指定で、sshで 22
をどこからでも受けられるようにします。
「確認と作成」をクリックして、キーペアを作成してダウンロードしたら完了です。
EC2(本番用)の作成
ほぼ踏み台と同じなので、違うところだけピックアップします。
詳細設定
サブネット | subnet-sample-private |
自動割り当てパブリックIP | サブネット設定を使用(無効) |
プライマリIP | 192.168.2.10 |
タグ
Name
タグに webserver
を指定します。
セキュリティグループ
「新しいセキュリティグループを作成する」を選択し、セキュリティグループ名を web-sg
とします。
セキュリティグループの指定で、sshで 22
を 192.168.1.0/24
からのみ受けられるようにします。(ここポイントです)
キーペア
踏み台で作成したものと同じものを使うようにします。
sshログインしてみる
踏み台→本番への接続も同じキーペアで通せるように、以下のコマンドを打ちます。
ssh-add {pemファイルのパス}
ssh-add -l # 登録できたか確認
まずは踏み台のログインです。
ssh -i {pemファイルのパス} ec2-user@{踏み台に割当てられたパブリックIP}
ログインできたら、本番に指定したプライベートIPを使ってさらにsshログインします。
$ ssh 192.168.2.10 # 本番用に指定したプライベートIP
Last login: Sun Dec 17 06:01:04 2017 from 192.168.1.10
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
これでログイン完了です!
ssh/configの設定
踏み台を通して1発で本番へログインできるようにするための設定です。
~/.ssh/config
に記述します。
Host {踏み台用の好きな名前}
HostName {踏み台パブリックIP}
User ec2-user
IdentityFile {pemファイルのパス}
Host {本番用の好きな名前}
HostName {本番用プライベートIP}
User ec2-user
IdentityFile {pemファイルのパス}
ProxyCommand ssh {踏み台用の好きな名前} -W %h:%p
上記を指定しておけば、 ssh {本番用の好きな名前}
でログインできます。