Compute Engine에서 Public 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 네트워크 및 서브넷 만들기

네트워크와 서브넷이 이미 있으면 이 단계를 건너뛸 수 있습니다.

Console

  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. 첫 번째 지역의 서브넷 프리픽스를 지정합니다. 이 예시에서는 192.168.1.0/24를 리전 us-east4에 할당합니다.

    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 인스턴스 만들기

Console

  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. 외부 IPNone으로 설정합니다.
    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 권한 만들기

이후 단계에서 IAP(Identity-Aware Proxy)를 사용하여 테스트 인스턴스에 연결합니다.

Console

  1. Google Cloud 콘솔에서 IAP(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. 'Save(저장)'를 클릭합니다.

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에 로그인하고 인터넷에 연결할 수 없는지 확인

Console

  1. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. nat-test-1의 경우 연결 열에서 SSH 드롭다운 화살표를 클릭한 다음 브라우저 창에서 열기를 선택합니다.

  3. VM의 명령어 프롬프트에서 curl example.com을 입력하고 Enter 키를 누릅니다.

    결과가 표시되지 않습니다. 결과가 표시되면 외부 IP 주소를 사용해서 nat-test-1을 만들었거나 다른 문제가 있을 수 있습니다. 문제를 해결하려면 VM이 Cloud NAT 없이 예기치 않게 인터넷에 연결할 수 있음을 참조하세요.

    명령어를 종료하려면 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을 만들었거나 다른 문제가 있을 수 있습니다. 문제를 해결하려면 VM이 Cloud NAT 없이 예기치 않게 인터넷에 연결할 수 있음을 참조하세요.

    명령어를 종료하려면 Ctrl+C를 입력해야 할 수 있습니다.

6단계: Cloud Router를 사용하여 NAT 구성 만들기

Public NAT를 사용하는 인스턴스와 동일한 리전에 Cloud Router를 만들어야 합니다. Cloud Router는 VM에 NAT 정보를 배치하기 위해서만 사용됩니다. 실제 NAT 게이트웨이의 일부로는 사용되지 않습니다.

이 구성을 사용하면 리전 내 모든 인스턴스가 전체 기본 및 별칭 IP 범위에서 Public NAT를 사용할 수 있습니다. 또한 외부 IP 주소가 NAT 게이트웨이에 자동으로 할당됩니다. 더 많은 옵션은 Google Cloud CLI 문서를 참조하세요.

않습니다.

Console

  1. Google Cloud Console에서 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분 정도 기다린 후 인터넷에 액세스를 다시 시도합니다.

Console

  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>

다음 단계