Compute Engine でパブリック NAT を使用する

このページでは、Compute Engine VM インスタンスのネットワーク アドレス変換サービスを提供する Public NAT ゲートウェイのデモをご紹介します。開始する前に、Public NAT の概要をご確認ください。

前提条件

Public NAT を設定する前に、以下ことを行う必要があります。

IAM 権限を取得する

roles/compute.networkAdmin ロールにより、Cloud Router での NAT ゲートウェイの作成、NAT IP アドレスの予約と割り当て、トラフィックが NAT ゲートウェイによるネットワーク アドレス変換を使用する必要があるサブネットワーク(サブネット)の指定を行う権限を取得できます。

Google Cloud の設定

始める前に、Google Cloud で次の項目を設定します。

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Google Cloud CLI をインストールします。
  5. gcloud CLI を初期化するには:

    gcloud init
  6. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  7. Google Cloud プロジェクトで課金が有効になっていることを確認します

  8. Google Cloud CLI をインストールします。
  9. gcloud CLI を初期化するには:

    gcloud init

以下のエンドツーエンドの例では、Public NAT ゲートウェイのサンプルと Public NAT ゲートウェイを使用する Compute Engine VM のサンプルを示します。

手順 1: VPC ネットワークとサブネットを作成する

すでにネットワークとサブネットが存在する場合は、この手順をスキップできます。

コンソール

  1. Google Cloud コンソールで、[VPC ネットワーク] ページに移動します。

    [VPC ネットワーク] ページに移動

  2. [VPC ネットワークを作成] をクリックします。

  3. [名前] に「custom-network1」を入力します。

  4. [サブネット] で、[サブネット作成モード] を [カスタム] に設定します。

  5. [新しいサブネット] の [名前] に「subnet-us-east-192」と入力します。

  6. [リージョン] で [us-east4] を選択します。

  7. [IP アドレス範囲] に「192.168.1.0/24」と入力します。

  8. [完了]、[作成] の順にクリックします。

gcloud

  1. プロジェクトに新しいカスタムモードの VPC ネットワークを作成します。

    gcloud compute networks create custom-network1 \
        --subnet-mode custom
  2. 最初のリージョンに対応するサブネット接頭辞を指定します。この例では、リージョン us-east4192.168.1.0/24 を割り当てます。

    gcloud compute networks subnets create subnet-us-east-192 \
       --network custom-network1 \
       --region us-east4 \
       --range 192.168.1.0/24

Terraform

Terraform モジュールを使用して、Virtual Private Cloud(VPC)のカスタムのネットワークとサブネットを作成できます。

module "test-vpc-module" {
  source       = "terraform-google-modules/network/google"
  version      = "~> 9.0"
  project_id   = var.project_id # Replace this with your project ID in quotes
  network_name = "custom-network1"
  mtu          = 1460

  subnets = [
    {
      subnet_name   = "subnet-us-east-192"
      subnet_ip     = "192.168.1.0/24"
      subnet_region = "us-east4"
    }
  ]
}

ステップ 2: 外部 IP アドレスを持たない VM インスタンスを作成する

コンソール

  1. Google Cloud コンソールで [VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. [インスタンスを作成] をクリックします。

  3. インスタンスの [名前] に「nat-test-1」と入力します。

  4. [リージョン] を us-east4 に設定します。

  5. [ゾーン] を us-east4-c に設定します。

  6. [管理、セキュリティ、ディスク、ネットワーキング、単一テナンシー] のリンクをクリックします。

  7. [ネットワーキング] タブをクリックします。

  8. [ネットワーク インターフェース] で、VM のデフォルト インターフェースの [編集] をクリックします。

    1. [ネットワーク] を custom-network1 に設定します。
    2. [サブネットワーク] を subnet-us-east-192 に設定します。
    3. [外部 IP] を None に設定します。
    4. [完了] をクリックします。
  9. インスタンスを作成して起動するには、[作成] をクリックします。

gcloud

gcloud compute instances create nat-test-1 \
    --image-family debian-9 \
    --image-project debian-cloud \
    --network custom-network1 \
    --subnet subnet-us-east-192 \
    --zone us-east4-c \
    --no-address

Terraform

Terraform リソースを使用して VM インスタンスを作成できます。

resource "google_compute_instance" "default" {
  project      = var.project_id
  zone         = "us-east4-c"
  name         = "nat-test-1"
  machine_type = "e2-medium"
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }
  network_interface {
    network    = "custom-network1"
    subnetwork = var.subnet # Replace with a reference or self link to your subnet, in quotes
  }
}

ステップ 3: SSH 接続を許可するファイアウォール ルールを作成する

コンソール

  1. Google Cloud コンソールで [ファイアウォール ポリシー] ページに移動します。

    [ファイアウォール ポリシー] ページに移動

  2. [ファイアウォール ルールを作成] をクリックします。

  3. [名前] に「allow-ssh」を入力します。

  4. [ネットワーク] に custom-network1 を指定します。

  5. [トラフィックの方向] を上り(内向き)に設定します。

  6. [一致したときのアクション] を [許可] に設定します。

  7. [ターゲット] を [ネットワーク上のすべてのインスタンス] に設定します。

  8. [ソースフィルタ] を [IPv4 範囲] に設定します。

  9. [ソース IP の範囲] を 35.235.240.0/20 に設定します。

  10. [プロトコルとポート] を [指定したプロトコルとポート] に設定します。

  11. [tcp] チェックボックスをオンにして、ポート「22」を入力します。

  12. [作成] をクリックします。

gcloud

gcloud compute firewall-rules create allow-ssh \
    --network custom-network1 \
    --source-ranges 35.235.240.0/20 \
    --allow tcp:22

Terraform

Terraform リソースを使用してファイアウォール ルールを作成できます。

resource "google_compute_firewall" "rules" {
  project = var.project_id
  name    = "allow-ssh"
  network = var.network # Replace with a reference or self link to your network, in quotes

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }
  source_ranges = ["35.235.240.0/20"]
}

ステップ 4: テスト インスタンスの IAP SSH 権限を作成する

あとのステップで、Identity-Aware Proxy(IAP)を使用してテスト インスタンスに接続します。

コンソール

  1. Google Cloud コンソールで、[Identity-Aware Proxy] ページに移動します。

    [Identity-Aware Proxy] ページに移動

  2. [SSH と TCP のリソース] タブを選択します。

  3. リソースのメンバー権限を更新するには、[すべてのトンネル リソース] > [us-east4-c] > [nat-test-1] の横にあるチェックボックスをオンにします。

  4. 右側のペインで、[メンバーを追加] をクリックします。

  5. ユーザー、グループ、またはサービス アカウントにリソースへのアクセス権を付与するには、[新しいメンバー] フィールドで、メンバーのメールアドレスを指定します。

    この機能のテストのみを行う場合は、ご自身のメールアドレスを入力できます。

  6. Cloud IAP の TCP 転送機能を使用して、メンバーにリソースへのアクセス権を付与するには、[ロール] プルダウン リストから [Cloud IAP] > [IAP で保護されたトンネル ユーザー] を選択します。

  7. [保存] をクリックします。

gcloud

このコマンドは、IAP を使用してプロジェクト内のすべての VM インスタンスに SSH アクセスを許可します。IAP を使用して個々の VM に SSH アクセスを許可するには、Google Cloud コンソールの手順を行ってください。

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=MEMBER_INFO \
    --role=roles/iap.tunnelResourceAccessor

以下を置き換えます。

  • PROJECT_ID: プロジェクト ID
  • MEMBER_INFO: メンバーの type:email ペアのカンマ区切りリスト。例:
    • 個々のユーザーの場合: user:test-user@example.com
    • グループの場合: group:admins@example.com
    • サービス アカウントの場合: serviceAccount:test123@example.domain.com

Terraform

Terraform リソースを使用して、テスト インスタンスの IAP SSH 権限を作成できます。

resource "google_project_iam_member" "project" {
  project = var.project_id
  role    = "roles/iap.tunnelResourceAccessor"
  member  = "serviceAccount:test123@example.domain.com"
}

ステップ 5: nat-test-1 にログインし、インターネットに接続できないことを確認する

コンソール

  1. Google Cloud コンソールで [VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. nat-test-1 の [接続] 列で、[SSH] プルダウン矢印をクリックして、[ブラウザ ウィンドウで開く] を選択します。

  3. VM のコマンド プロンプトで「curl example.com」と入力し、Enter キーを押します。

    結果は何も表示されません。結果が表示された場合は、外部 IP アドレスを持つ nat-test-1 を作成した、または他の問題が存在する可能性が考えられます。トラブルシューティングを行うには、Cloud NAT を使用せずに VM が予期せずインターネットに接続できるをご覧ください。

    コマンドを終了するには、「Ctrl+C」と入力することが必要な場合があります。

gcloud

  1. Compute Engine の SSH 認証鍵をローカルホストに追加します。

    ssh-add ~/.ssh/google_compute_engine
    
  2. nat-test-1 に接続して、次のコマンドを実行します。

    gcloud compute ssh nat-test-1 \
        --zone us-east4-c \
        --command "curl example.com" \
        --tunnel-through-iap

    結果は何も表示されません。結果が表示された場合は、外部 IP アドレスを持つ nat-test-1 を作成した、または他の問題が存在する可能性が考えられます。トラブルシューティングを行うには、Cloud NAT を使用せずに VM が予期せずインターネットに接続できるをご覧ください。

    コマンドを終了するには、「Ctrl+C」と入力することが必要な場合があります。

手順 6: Cloud Router を使用して NAT 構成を作成する

Public NAT を使用するインスタンスと同じリージョンに Cloud Router を作成する必要があります。Cloud Router は、NAT 情報を VM に配置するためにのみ使用されます。実際の NAT ゲートウェイの一部としては使用されません。

この構成により、リージョン内のすべてのインスタンスが、すべてのプライマリとエイリアス IP の範囲で Public NAT を使用できるようになります。また、NAT ゲートウェイに外部 IP アドレスが自動的に割り振られます。その他のオプションについては、Google Cloud CLI のドキュメントをご覧ください。

コンソール

  1. Google Cloud コンソールで、[Cloud NAT] ページに移動します。

    [Cloud NAT] ページに移動

  2. [開始] または [NAT ゲートウェイを作成] をクリックします。

  3. [ゲートウェイの名前] に 「nat-config」 と入力します。

  4. [VPC ネットワーク] を custom-network1 に設定します。

  5. [リージョン] を us-east4 に設定します。

  6. [Cloud Router] で [新しいルーターを作成] を選択します。

    1. [名前] に「nat-router」を入力します。
    2. [作成] をクリックします。
  7. [作成] をクリックします。

gcloud

  1. Cloud Router を作成します。

    gcloud compute routers create nat-router \
        --network custom-network1 \
        --region us-east4
  2. ルーターに構成を追加します。

    gcloud compute routers nats create nat-config \
        --router-region us-east4 \
        --router nat-router \
        --nat-all-subnet-ip-ranges \
        --auto-allocate-nat-external-ips

Terraform

Terraform リソースを使用して Cloud Router を作成できます。

resource "google_compute_router" "router" {
  project = var.project_id
  name    = "nat-router"
  network = var.network
  region  = "us-east4"
}

Terraform モジュールを使用して NAT 構成を作成できます。

module "cloud-nat" {
  source  = "terraform-google-modules/cloud-nat/google"
  version = "~> 5.0"

  project_id                         = var.project_id
  region                             = "us-east4"
  router                             = google_compute_router.router.name
  name                               = "nat-config"
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
}

ステップ 7: インターネットに再度接続を試みる

NAT 構成が VM に反映されるのに最大で 3 分間要する場合があるため、少なくとも 1 分間待ってから再度インターネットへのアクセスを試みます。

コンソール

  1. Google Cloud コンソールで [VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. nat-test-1 の [接続] 列で、[SSH] プルダウン矢印をクリックして、[ブラウザ ウィンドウで開く] を選択します。

  3. VM のコマンド プロンプトで「curl example.com」と入力し、Enter キーを押します。

gcloud

nat-test-1 に接続して、次のコマンドを実行します。

gcloud compute ssh nat-test-1 \
    --zone us-east4-c \
    --command "curl example.com" \
    --tunnel-through-iap

次のコンテンツを含む出力が表示されます。


<html>
<head>
<title>Example Domain</title>
...
...
...
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You can use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

次のステップ