背景

個人開発で使える本番サーバー環境が欲しかったのと、ちょうど仕事でも活かせそうだったので、自分でAWSのネットワーク環境を作ってみました。

全体像

用意したいサーバーは2つです。

  • 踏み台
    • sshでログインし、さらにsshで本番サーバーへログインするためのもの
    • sshログイン用のport以外は開けない
  • 本番サーバー
    • 踏み台サーバーからのみsshでログイン可能
    • (Webサーバーを予定してるけど、今回はhttpのportを開けたりとかしない)

VPCの作成

AWSで管理する仮想ネットワークを定義します。

AWSマネジメントコンソールからサービス>VPCを選択

vpc-dashboard

既にデフォルトのVPCが定義されていますが、今回は使わずに削除します。

「VPCの作成」を選択

vpc-create

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ダッシュボードの中から「サブネット」を選択

subnet-dashboard
「サブネットの作成」を選択し、以下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ダッシュボードからインターネットゲートウェイ>インターネットゲートウェイの作成を選択
create-igw
名前は igw-sample としておきます。

ルートテーブルの作成

上で作成したインターネットゲートウェイを紐付けるためのルートテーブルを作成します。
ルートテーブル>ルートテーブルの作成を選択し、 rtb-sample を指定します。
作成後、 0.0.0.0/0 (デフォルトゲートウェイとして) インターネットゲートウェイを紐付けます。
create-rtb
さらに、「サブネットの関連付け」で踏み台用のサブネットである subnet-sample-public を紐付けます。

EC2(踏み台)の作成

いよいよサーバーです。
サービス>EC2>インスタンスから「インスタンスの作成」を選択
ちょうど数日前にリリースされたAmazon Linux 2 が無料枠で選べる状態だったので、これを選択します。

create-ec2-1

t2.micro を選択します。

create-ec2-2

インスタンスの詳細設定です。
create-ec2-3

ちょっと項目数が多いのでかいつまんで。

ネットワーク 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はわざわざ指定しなくても良かったかもしれないです。

参考: VPC初心者がハマりやすいポイントをまとめてみた

次はストレージの追加です。
create-ec2-4
デフォルトのまま進めます。
create-ec2-5
Name タグに bastion を指定します。

create-ec2-6
create-ec2-7

「新しいセキュリティグループを作成する」を選択し、セキュリティグループ名を bastion-sg とします。
セキュリティグループの指定で、sshで 22 をどこからでも受けられるようにします。

「確認と作成」をクリックして、キーペアを作成してダウンロードしたら完了です。

EC2(本番用)の作成

ほぼ踏み台と同じなので、違うところだけピックアップします。

詳細設定

サブネット subnet-sample-private
自動割り当てパブリックIP サブネット設定を使用(無効)
プライマリIP 192.168.2.10

タグ

Name タグに webserver を指定します。

セキュリティグループ

「新しいセキュリティグループを作成する」を選択し、セキュリティグループ名を web-sg とします。
セキュリティグループの指定で、sshで 22192.168.1.0/24 からのみ受けられるようにします。(ここポイントです)

キーペア

踏み台で作成したものと同じものを使うようにします。

sshログインしてみる

踏み台→本番への接続も同じキーペアで通せるように、以下のコマンドを打ちます。

ssh-add {pemファイルのパス}
ssh-add -l # 登録できたか確認

まずは踏み台のログインです。

ssh -i {pemファイルのパス} [email protected]{踏み台に割当てられたパブリック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 {本番用の好きな名前} でログインできます。