🦶

これが踏み台サーバか

に公開

「踏み台サーバ」という言葉、どこか強そうな響きがある。

名前からしても、本来アクセスしたい場所に直接行けないときに、いったん立ち寄る中継地点として置くサーバなのだろうと想像できる。

踏み台サーバについて、Ping-t AWS SAA問題集の解説では次のように説明されている。

踏み台サーバーとは、例えばインターネットからプライベートサブネット内にあるサーバーの保守をしたい場合に、一旦NATインスタンスへSSH接続をした後、NATインスタンスから目的のサーバーへ再度SSH接続をすることで、VPC外からは直接接続できないプライベートサブネット内のサーバーへの接続を可能にするものです。

インフラ初学者の自分にとっては、この説明もいまいちピンとこない。そこで、AWS上で実際に踏み台サーバを構築しながら、その役割や動きを自分の手で確かめてみることにした。

1. VPCの作成

  1. AWSマネジメントコンソールで「VPC」サービスに移動
  2. 「VPCを作成」を選択
  3. 名前タグ:MyNATVPC
  4. IPv4 CIDR ブロック:10.0.0.0/16
  5. 「VPCのみ」を選び「作成」

2. サブネットの作成

2-1. パブリックサブネット

  1. VPC画面→「サブネット」→「サブネットを作成」
  2. 名前タグ:PublicSubnet
  3. VPC:MyNATVPC
  4. アベイラビリティゾーン:任意
  5. IPv4 CIDR ブロック:10.0.1.0/24
  6. 作成

2-2. プライベートサブネット

  1. 名前タグ:PrivateSubnet
  2. VPC:MyNATVPC
  3. アベイラビリティゾーン:任意
  4. IPv4 CIDR ブロック:10.0.2.0/24
  5. 作成

3. インターネットゲートウェイ(IGW)の作成・アタッチ

  1. 「インターネットゲートウェイ」→「作成」
    • 名前タグ:MyNATIGW
  2. 作成したIGWを選択し、「アクション」→「VPCにアタッチ」
  3. 対象VPC:MyNATVPC

インターネットゲートウェイと似たサービスとしてNATゲートウェイがある。インターネットゲートウェイは、パブリックサブネットに配置したリソースがインターネットと直接通信できるようにするための出入口となる一方、NATゲートウェイはプライベートサブネット内のリソースがインターネットへのアウトバウンド通信を行う際に利用されるが、外部からの直接アクセスは遮断される。

今回は、パブリックサブネットのNATインスタンスを経由してプライベートサブネットからインターネットへアクセスさせる構成とするため、NATゲートウェイではなく、インターネットゲートウェイを作成しVPCにアタッチする。

4. ルートテーブルの設定

4-1. パブリックサブネット用ルートテーブル

  1. 「ルートテーブル」→「作成」
    • 名前タグ:PublicRouteTable
    • VPC:MyNATVPC
  2. 「ルート」タブで「ルートの追加」
    • 宛先:0.0.0.0/0
    • ターゲット:IGW(作成したMyNATIGW
  3. 「サブネットの関連付け」でPublicSubnetを関連付け

4-2. プライベートサブネット用ルートテーブル

  1. 「ルートテーブル」→「作成」
    • 名前タグ:PrivateRouteTable
    • VPC:MyNATVPC
  2. いったんデフォルトのままでOK(後ほどNATインスタンス追加)

5. NATインスタンスの作成

5-1. Amazon Linux 2 EC2インスタンスの作成

  1. 「EC2」サービスで「インスタンスを起動」
  2. 名前:NATInstance
  3. AMI:Amazon Linux 2(t2.microでOK)
  4. ネットワーク:MyNATVPC
  5. サブネット:PublicSubnet
  6. パブリックIPの自動割当:有効化
  7. ストレージ・キーペアは適宜
  8. セキュリティグループ:
    • SSH(22)自分のIP
    • ALL traffic(0.0.0.0/0)一時的に許可(本番は必要な範囲に絞る)

5-2. NAT用のOS設定

  1. 作成したインスタンスにSSHでログイン
  2. IPフォワーディング有効化(2つとも実行):
sudo sysctl -w net.ipv4.ip_forward=1
sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
  1. iptablesでNAT動作の設定

ens5等、正しいNIC名を使用

sudo iptables -t nat -A POSTROUTING -o ens5 -s 10.0.2.0/24 -j MASQUERADE
  1. iptables設定を永続化(Amazon Linux 2の場合)
sudo yum install iptables-services
sudo service iptables save
  1. Source/Destination Checkの無効化
  • EC2管理画面でNATInstanceを選択
  • アクション→ネットワーキング→「送信元/送信先チェック中」を停止

6. プライベートサブネット用ルートテーブルの編集

  1. 先ほど作成したPrivateRouteTableを開く
  2. 「ルート」タブで「ルートの追加」
    • 宛先:0.0.0.0/0
    • ターゲット:NATインスタンスのネットワークインターフェイス(ENI)
  3. 「サブネットの関連付け」でPrivateSubnetを関連付け

7. プライベートサブネット内にテスト用EC2を作成

  1. 「EC2」→「インスタンスを起動」
  2. 名前:PrivateInstance
  3. AMI:Amazon Linux 2
  4. ネットワーク:MyNATVPC
  5. サブネット:PrivateSubnet
  6. パブリックIPの自動割当:なし
  7. セキュリティグループ:SSHはパブリックサブネットの踏み台経由用

8. NATインスタンス経由でプライベートEC2にSSHログイン

  1. まずNATインスタンスへSSHログイン
  2. そこからプライベートサブネット内のテスト用EC2インスタンスにSSHログイン

9. インターネット接続の確認

  1. プライベートサブネット内のテスト用EC2インスタンスで下記コマンドを実行
curl https://www.google.co.jp/
  1. インターネット経由で応答が返ればNATインスタンス経由での接続に成功!

参考資料

Discussion