SSL 프록시 부하 분산 설정

이 문서에서는 SSL 프록시 부하 분산 설정 방법을 안내합니다. 시작하기 전에 SSL 프록시 부하 분산 개념에서 SSL 프록시 부하 분산의 작동 방식에 대한 자세한 내용을 확인하세요.

SSL 부하 분산 설정

이 예시에서는 us-central1us-east1이라는 두 리전에 존재하는 간단한 서비스에 전역 SSL 부하 분산을 설정하는 방법을 보여줍니다. 다음 항목을 구성합니다.

  1. 2개 리전에 분산된 4개의 인스턴스
  2. 인스턴스를 보유하는 인스턴스 그룹
  3. 다음을 포함하는 백엔드 구성요소
    • 상태 확인 - 인스턴스 상태 모니터링에 사용
    • 백엔드 서비스 - 인스턴스 그룹을 모니터링하고 구성된 사용량을 초과하지 못하도록 차단
    • 백엔드 - 인스턴스 그룹 보관
  4. 다음을 포함하는 프런트엔드 구성요소
    • SSL 인증서 리소스. 개발자가 자체 SSL 인증서를 제공하는 자체 관리형 인증서 또는 Google이 도메인에 대해 인증서를 발급하는 Google 관리형 인증서를 사용할 수 있습니다. 자세한 내용은 SSL 인증서 유형을 참조하세요.
    • SSL 인증서가 있는 SSL 프록시 자체
    • 외부 정적 IPv4 주소 및 사용자 트래픽을 프록시로 전송하는 전달 규칙
    • 외부 정적 IPv6 주소 및 사용자 트래픽을 프록시로 전송하는 전달 규칙
  5. 부하 분산기 및 상태 확인기에서 인스턴스로 전송되는 트래픽을 허용하는 방화벽 규칙
  6. 필요한 경우 SSL 프록시 부하 분산기가 클라이언트와 협상하는 SSL 기능을 제어하는 SSL 정책

그런 다음 구성을 테스트합니다.

인스턴스 및 인스턴스 그룹 구성

이 섹션에서는 인스턴스 및 인스턴스 그룹을 만든 다음 인스턴스 그룹에 인스턴스를 추가하는 방법을 보여줍니다. 일반적으로 프로덕션 시스템에서는 인스턴스 템플릿에 기반을 둔 관리형 인스턴스 그룹을 사용하지만 초기 테스트에서는 이렇게 설정하는 방식이 더 빠릅니다.

인스턴스 만들기

테스트를 위해 4개의 인스턴스(2개의 인스턴스 그룹에 각각 2개씩)에 Apache를 설치합니다. 일반적으로 HTTP 트래픽에는 SSL 부하 분산을 사용하지 않지만 Apache는 일반적으로 사용되며 테스트용으로 쉽게 설정할 수 있습니다.

ssl-lb 태그로 이러한 인스턴스를 만듭니다. 이 태그는 나중에 방화벽 규칙에서 사용합니다.

Console


인스턴스 만들기

  1. Google Cloud Platform Console의 VM 인스턴스 페이지로 이동합니다.
    VM 인스턴스 페이지로 이동
  2. 인스턴스 만들기를 클릭합니다.
  3. 이름ig-us-central1-1로 설정합니다.
  4. 영역us-central1-b로 설정합니다.
  5. 관리, 보안, 디스크, 네트워킹, 단독 테넌시를 클릭하여 고급 설정을 표시합니다.
  6. 관리에서 태그 필드를 ssl-lb로 채웁니다.
  7. 시작 스크립트를 다음으로 설정합니다.
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>ig-us-central1-1</h1></body></html>' | sudo tee /var/www/html/index.html
  8. 나머지 필드는 기본값 그대로 둡니다.
  9. 만들기를 클릭합니다.
  10. 동일한 설정으로 ig-us-central1-2를 만듭니다. 단, 시작 스크립트를 다음과 같이 설정합니다.
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>ig-us-central1-2</h1></body></html>' | sudo tee /var/www/html/index.html
  11. 동일한 설정으로 ig-us-east1-1을 만듭니다. 단, 영역us-east1-b로 설정하고 시작 스크립트는 다음과 같이 설정합니다.
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>ig-us-east1-1</h1></body></html>' | sudo tee /var/www/html/index.html
  12. 동일한 설정으로 ig-us-east1-2를 만듭니다. 단, 영역us-east1-b로 설정하고 시작 스크립트는 다음과 같이 설정합니다.
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>ig-us-east1-2</h1></body></html>' | sudo tee /var/www/html/index.html

gcloud


  1. 영역 us-central1-b에서 ig-us-central1-1을 만듭니다.

    gcloud compute instances create ig-us-central1-1 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-central1-b \
        --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo a2ensite default-ssl
          sudo a2enmod ssl
          sudo service apache2 restart
          echo '<!doctype html><html><body><h1>SSL load balanced instance - US central 1</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/ig-us-central1-1].
    NAME             ZONE          MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-1 us-central1-b n1-standard-1             10.240.0.8  23.251.150.133 RUNNING
  2. 영역 us-central1-b에서 ig-us-central1-2를 만듭니다.

    gcloud compute instances create ig-us-central1-2 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-central1-b \
         --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo a2ensite default-ssl
          sudo a2enmod ssl
          sudo service apache2 restart
           echo '<!doctype html><html><body><h1>SSL load balanced instance - US central 2</h1></body></html>' | tee /var/www/html/index.html
           EOF"
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/ig-us-central1-2].
    NAME             ZONE          MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-2 us-central1-b n1-standard-1             10.240.0.11 23.251.148.160 RUNNING
  3. 영역 us-east1-b에서 ig-us-east1-1을 만듭니다.

    gcloud compute instances create ig-us-east1-1 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-east1-b \
        --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo a2ensite default-ssl
          sudo a2enmod ssl
          sudo service apache2 restart
          echo '<!doctype html><html><body><h1>SSL load balanced instance - US east 1</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instances/ig-us-east1-1].
    NAME          ZONE       MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-east1-1 us-east1-b n1-standard-1             10.240.0.12 104.196.31.214 RUNNING
  4. 영역 us-east1-b에서 ig-us-east1-2를 만듭니다.

    gcloud compute instances create ig-us-east1-2 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-east1-b \
        --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo a2ensite default-ssl
          sudo a2enmod ssl
          sudo service apache2 restart
          echo '<!doctype html><html><body><h1>SSL load balanced instance - US east 2</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instances/ig-us-east1-2].
    NAME          ZONE       MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-east1-2 us-east1-b n1-standard-1             10.240.0.13 104.196.25.101 RUNNING

각 영역별로 인스턴스 그룹을 만들고 인스턴스 추가

Console


  1. Google Cloud Platform Console의 인스턴스 그룹 페이지로 이동합니다.
    인스턴스 그룹 페이지로 이동
  2. 인스턴스 그룹 만들기를 클릭합니다.
  3. 이름us-ig1로 설정합니다.
  4. 영역us-central1-b로 설정합니다.
  5. 포트 이름 매핑 지정을 클릭합니다.
    1. 포트 이름 매핑에서 항목 추가를 클릭합니다.
    2. 포트 이름ssl-lb를, 포트 번호443을 입력합니다.
  6. 인스턴스 정의에서 기존 인스턴스 선택을 클릭합니다.
  7. VM 인스턴스에서 ig-us-central1-1ig-us-central1-2를 선택합니다.
  8. 다른 설정은 그대로 둡니다.
  9. 만들기를 클릭합니다.
  10. 단계를 반복하되 다음과 같이 설정합니다.
    • 이름: us-ig2
    • 영역: us-east1-b
    • 포트 이름: ssl-lb포트 번호: 443
    • 인스턴스: ig-us-east1-1ig-us-east1-2
  11. 인스턴스가 2개인 인스턴스 그룹이 2개 있는지 확인합니다.

gcloud


  1. us-ig1 인스턴스 그룹을 만듭니다.

    gcloud compute instance-groups unmanaged create us-ig1 --zone us-central1-b
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instanceGroups/us-ig1].
    NAME   ZONE          NETWORK MANAGED INSTANCES
    us-ig1 us-central1-b                 0
  2. 인스턴스 그룹에 이름이 지정된 포트를 설정합니다.

    gcloud compute instance-groups set-named-ports us-ig1 \
        --named-ports ssl-lb:443 \
        --zone us-central1-b
    
  3. ig-us-central1-1ig-us-central1-2us-ig1에 추가합니다.

    gcloud compute instance-groups unmanaged add-instances us-ig1 \
        --instances ig-us-central1-1,ig-us-central1-2 \
        --zone us-central1-b
    
    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instanceGroups/us-ig1].
  4. us-ig2 인스턴스 그룹을 만듭니다.

    gcloud compute instance-groups unmanaged create us-ig2 --zone us-east1-b
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2].
    NAME   ZONE       NETWORK MANAGED INSTANCES
    us-ig2 us-east1-b                 0
  5. 인스턴스 그룹에 이름이 지정된 포트를 설정합니다.

    gcloud compute instance-groups set-named-ports us-ig2 \
        --named-ports ssl-lb:443 \
        --zone us-east1-b
    
  6. ig-us-east1-1ig-us-east1-2us-ig2에 추가합니다.

    gcloud compute instance-groups unmanaged add-instances us-ig2 \
         --instances ig-us-east1-1,ig-us-east1-2 \
         --zone us-east1-b
    
    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2].

이제 2개의 리전에 각각 2개의 인스턴스가 있는 인스턴스 그룹이 만들어졌습니다.

부하 분산기 구성

Console


부하 분산기를 만들고 백엔드 서비스 구성

  1. Google Cloud Platform Console의 부하 분산 페이지로 이동합니다.
    부하 분산 페이지로 이동
  2. 부하 분산기 만들기를 클릭합니다.
  3. TCP 부하 분산에서 구성 시작을 클릭합니다.
  4. 인터넷 연결 또는 내부 전용 아래에서 인터넷 트래픽을 VM으로 분산을 선택합니다.
  5. 여러 리전 또는 단일 리전에서 **여러 지역(또는 확실하지 않음)을 선택합니다.
  6. 부하 분산기의 이름my-ssl-lb로 설정합니다.
  7. 백엔드 구성을 클릭합니다.
  8. 프로토콜TCP로 설정된 상태로 두거나 필요한 경우 *SSL을 선택합니다.
  9. 이름이 지정된 포트제한 시간에 기본값을 그대로 둡니다.
  10. 백엔드 유형인스턴스 그룹으로 설정된 상태로 둡니다.
  11. 새 백엔드에서 인스턴스 그룹 us-ig1을 선택합니다.
  12. 포트 번호443으로 설정합니다.
  13. 다른 설정은 그대로 둡니다.
  14. 새 백엔드에서 인스턴스 그룹 us-ig2를 선택합니다.
  15. 포트 번호443으로 설정합니다.
  16. 다른 설정은 그대로 둡니다.
  17. 완료를 클릭합니다.
  18. 상태 확인에서 상태 확인 만들기를 선택합니다.
    1. 상태 확인 이름my-ssl-health-check로 설정합니다.
    2. 프로토콜SSL로 설정합니다.
    3. 다른 설정은 동일하게 유지합니다.
    4. 저장 후 계속을 클릭합니다.
  19. Google Cloud Platform Console의 백엔드 구성 옆에 녹색 체크표시가 있는지 확인합니다. 없으면 위의 단계를 모두 완료했는지 다시 한 번 확인합니다.

프런트엔드 서비스 구성

  1. 프런트엔드 구성을 클릭합니다.
  2. 새 프런트엔드 IP 및 포트이름my-ssl-lb-forwarding-rule로 입력합니다.
  3. 프로토콜SSL로 설정합니다.
  4. IP 주소에서 IP 주소 만들기를 선택합니다.
    1. 이름ssl-lb-static-ip로 입력합니다.
    2. 예약을 클릭합니다.
  5. 인증서에서 새 인증서 만들기를 선택합니다.
  6. 이름my-ssl-cert로 입력합니다.
  7. 인증서 업로드를 선택한 경우 다음 단계를 완료합니다.
    1. 해당 필드에 다음을 업로드합니다.
      • 공개 키 인증서(.crt 파일)
      • 인증서 체인(.csr 파일)
      • 비공개 키(.key 파일)
    2. 다른 SSL 인증서를 추가하려면 인증서 추가를 클릭한 다음 인증서 드롭다운 메뉴에서 인증서를 선택하거나 새 인증서 만들기를 선택하고 위의 안내를 따릅니다.
    3. 필요한 경우 프록시 프로토콜을 사용 설정합니다.
    4. 만들기를 클릭합니다.
  8. Google에서 관리하는 인증서 만들기를 선택하는 경우 도메인을 입력합니다.
  9. 완료를 클릭합니다.
  10. 프런트엔드 IP 및 포트 추가를 클릭합니다.
  11. 이름my-ssl-lb-ipv6-forwarding-rule로 입력합니다.
  12. IP 버전IPv6으로 설정합니다.
  13. IP 주소에서 IP 주소 만들기를 선택합니다.
    1. 이름ssl-lb-static-ipv6으로 입력합니다.
    2. 예약을 클릭합니다.
  14. 인증서에서 my-ssl-cert를 선택합니다.
  15. 완료를 클릭합니다.
  16. 기본 SSL 인증서 리소스 외에 인증서 리소스를 추가하려면 다음 안내를 따릅니다.
    1. 인증서 목록에서 인증서를 선택하거나 새 인증서 만들기를 클릭하고 위의 안내를 따릅니다.
  17. 완료를 클릭합니다.
  18. 필요에 따라 SSL 정책을 만들려면 다음을 수행합니다.
    1. SSL 정책에서 정책 만들기를 선택합니다.
    2. 이름my-ssl-policy를 입력합니다.
    3. 최소 TLS 버전으로 TLS 1.0을 선택합니다.
    4. 프로필최신을 선택합니다. 사용 설정된 기능사용 중지된 기능이 표시됩니다.
    5. 만들기를 클릭합니다.
  19. Google Cloud Platform Console의 프런트엔드 구성 옆에 녹색 체크표시가 있는지 확인합니다. 없으면 위의 단계를 모두 완료했는지 다시 한 번 확인합니다.

검토 및 완료

  1. 검토 및 완료를 클릭합니다.
  2. 설정한 내용을 다시 한 번 확인합니다.
  3. 만들기를 클릭합니다.

gcloud


상태 확인 만들기

gcloud compute health-checks create ssl my-ssl-health-check --port 443
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/healthChecks/my-ssl-health-check].
NAME                PROTOCOL
my-ssl-health-check SSL

백엔드 서비스 만들기

gcloud compute backend-services create my-ssl-lb \
    --protocol SSL \
    --health-checks my-ssl-health-check \
    --timeout 5m \
    --global
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb].
NAME      BACKENDS PROTOCOL
my-ssl-lb          SSL

또는 --protocol TCP를 사용하여 부하 분산기와 인스턴스 간에 암호화되지 않은 통신을 구성할 수도 있습니다.

백엔드 서비스에 인스턴스 그룹 추가

gcloud compute backend-services add-backend my-ssl-lb \
    --instance-group us-ig1 \
    --instance-group-zone us-central1-b \
    --balancing-mode UTILIZATION \
    --max-utilization 0.8 \
    --global
Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb].
gcloud compute backend-services add-backend my-ssl-lb \
    --instance-group us-ig2 \
    --instance-group-zone us-east1-b \
    --balancing-mode UTILIZATION \
    --max-utilization 0.8 \
    --global
Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb].

SSL 인증서 리소스 구성

자체 관리형 인증서를 사용 중인 경우 업로드할 SSL 인증서가 하나 이상 있어야 합니다. 그렇지 않으면 SSL 인증서를 참조하세요. 여러 SSL 인증서를 사용하는 경우에는 한 번에 하나씩 인증서를 만들어야 합니다.

자체 관리형 SSL 인증서를 사용 중이며 비공개 키와 서명된 인증서가 없는 경우 테스트용으로 자체 서명된 인증서를 만들어 사용할 수 있습니다.

자체 관리형 SSL 인증서 리소스를 만들려면 다음을 사용하세요.

gcloud compute ssl-certificates create my-ssl-cert \
    --certificate [CRT_FILE_PATH] \
    --private-key [KEY_FILE_PATH]
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/sslCertificates/my-ssl-cert].
NAME      CREATION_TIMESTAMP
my-ssl-cert 2016-02-20T20:53:33.584-08:00

Google에서 관리하는 SSL 인증서 리소스를 만들려면 다음을 사용하세요.

    gcloud beta compute ssl-certificates create www-ssl-cert \
      --domains [DOMAIN]

대상 SSL 프록시 구성

SSL 부하 분산은 1~10개의 SSL 인증서가 있는 대상 SSL 프록시 만들기를 지원합니다. 이 명령어를 실행하기 전에 각 인증서마다 SSL 인증서 리소스를 만들어야 합니다.

프록시 헤더를 사용 설정하려면 none 대신 PROXY_V1로 설정하세요. 선택사항으로 SSL 프록시를 대상 프록시에 연결할 수 있습니다. 먼저 정책을 만듭니다.

gcloud compute ssl-policies create my-ssl-policy \
    --profile MODERN --min-tls-version 1.0

그런 다음 정책을 대상 프록시에 연결합니다.

gcloud compute target-ssl-proxies create my-ssl-lb-target-proxy \
    --backend-service my-ssl-lb \
    --ssl-certificates [SSL_CERT_1][,[SSL_CERT_2],...] \
    --ssl-policy my-ssl-policy \
    --proxy-header NONE
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].
NAME                   PROXY_HEADER SERVICE   SSL_CERTIFICATES
my-ssl-lb-target-proxy NONE         my-ssl-lb my-ssl-cert

전역 정적 IPv4 및 IPv6 주소 예약

고객은 이러한 IP 주소를 사용하여 부하 분산된 서비스에 액세스합니다.

gcloud compute addresses create ssl-lb-static-ipv4 \
        --ip-version=IPV4 \
        --global
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/addresses/ssl-lb-static-ip].
NAME                 REGION ADDRESS               STATUS
ssl-lb-static-ip            [LB_STATIC_IP]        RESERVED
gcloud compute addresses create ssl-lb-static-ipv6 \
        --ip-version=IPV6 \
        --global
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/addresses/ssl-lb-static-ipv6].
NAME                 REGION ADDRESS                 STATUS
ssl-lb-static-ipv6          [LB_STATIC_IPV6]        RESERVED

전역 전달 규칙 구성

대상 프록시와 관련된 전역 전달 규칙을 만듭니다. [LB_STATIC_IP][LB_STATIC_IPV6]Reserve a global static IP address(전역 고정 IP 주소 예약)에서 생성한 IP 주소로 바꿉니다.

gcloud compute forwarding-rules create my-ssl-lb-forwarding-rule \
    --global \
    --target-ssl-proxy my-ssl-lb-target-proxy \
    --address [LB_STATIC_IP] \
    --ports 443
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-ssl-lb-forwarding-rule].
NAME                         REGION IP_ADDRESS     IP_PROTOCOL TARGET
my-ssl-lb-forwarding-rule           [LB_STATIC_IP] SSL         my-ssl-lb-target-proxy
gcloud compute forwarding-rules create my-ssl-lb-ipv6-forwarding-rule \
    --global \
    --target-ssl-proxy my-ssl-lb-target-proxy \
    --address [LB_STATIC_IPV6] \
    --ports 443
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-ssl-lb-ipv6-forwarding-rule].
NAME                           REGION    IP_ADDRESS       IP_PROTOCOL TARGET
my-ssl-lb-ipv6-forwarding-rule           [LB_STATIC_IPV6] SSL         my-ssl-lb-target-proxy

SSL 부하 분산기의 방화벽 규칙 만들기

부하 분산기 및 상태 확인기에서 인스턴스로 전송되는 트래픽을 허용하도록 방화벽을 구성합니다.

Console


  1. Google Cloud Platform Console에서 방화벽 규칙 페이지로 이동합니다.
    방화벽 규칙 페이지로 이동
  2. 방화벽 규칙 만들기를 클릭합니다.
  3. 이름allow-ssl-lb-and-health로 입력합니다.
  4. 네트워크에서 default를 선택합니다.
  5. 대상에서 지정된 대상 태그를 선택합니다.
  6. 대상 태그ssl-lb로 설정합니다.
  7. 소스 필터IP ranges로 설정합니다.
  8. 소스 IP 범위130.211.0.0/2235.191.0.0/16으로 설정합니다.
  9. 허용되는 프로토콜 및 포트tcp:443으로 설정합니다.
  10. 만들기를 클릭합니다.

gcloud


gcloud compute firewall-rules create allow-ssl-lb-and-health \
     --source-ranges 130.211.0.0/22,35.191.0.0/16 \
     --target-tags ssl-lb \
     --allow tcp:443
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-lb-and-health].
NAME                     NETWORK SRC_RANGES                  RULES   SRC_TAGS TARGET_TAGS
allow-ssl-lb-and-health default 130.211.0.0/22,35.191.0.0/16 tcp:443          ssl-lb

Google에서 관리하는 인증서를 사용하는 경우 인증서 리소스의 상태가 ACTIVE인지 확인합니다. 자세한 내용은 Google에서 관리하는 SSL 인증서 리소스 상태를 참조하세요.

gcloud beta compute ssl-certificates list

부하 분산기 테스트

웹 브라우저에서 HTTPS를 사용하여 고정 IP 주소에 연결하세요. 이 테스트 환경에서 인스턴스는 자체 서명된 인증서를 사용합니다. 따라서 처음으로 페이지에 액세스할 때 브라우저에 경고가 표시됩니다. 실제 페이지를 보려면 경고를 클릭하세요. [IP_ADDRESS]를 이전에 만든 IPv4 또는 IPv6 주소로 바꿉니다.

https://[IP_ADDRESS]

가장 가까운 지역의 호스트 중 하나가 표시됩니다. 해당 지역의 다른 인스턴스가 표시될 때까지 페이지를 새로 고치세요. 다른 지역의 인스턴스를 보려면 가장 가까운 지역의 인스턴스를 중지하세요.

또는 로컬 머신의 명령줄에서 curl을 사용할 수도 있습니다. SSL 프록시에서 자체 서명된 인증서를 사용하는 경우 -k도 지정해야 합니다. curl -k 옵션을 사용하면 자체 서명된 인증서가 있거나 인증서가 없는 경우에도 curl이 작동할 수 있습니다. 일반 인증서가 있으면 해당 매개변수를 삭제할 수 있습니다. 자체 사이트를 테스트할 때는 -k 매개변수만 사용해야 합니다. 일반적인 상황에서는 유효한 인증서가 중요한 보안 수단이므로 인증서 경고를 무시하면 안 됩니다.

[IP_ADDRESS]를 이전에 만든 IPv4 또는 IPv6 주소로 바꿉니다.

curl -k https://[IP_ADDRESS]

추가 SSL 프록시 명령어

대상 SSL 프록시 나열

Console


Google Cloud Platform Console의 대상 프록시 목록 페이지로 이동합니다.
대상 프록시 목록 페이지로 이동

gcloud


gcloud compute target-ssl-proxies list
NAME                   PROXY_HEADER SERVICE   SSL_CERTIFICATES
my-ssl-lb-target-proxy NONE         my-ssl-lb my-ssl-cert

대상 SSL 프록시 설명

Console


  1. Google Cloud Platform Console의 대상 프록시 목록 페이지로 이동합니다.
    대상 프록시 목록 페이지로 이동
  2. 대상 SSL 프록시의 이름을 클릭합니다.

gcloud


gcloud compute target-ssl-proxies describe [PROXY_NAME]

creationTimestamp: '2016-02-20T20:55:17.633-08:00'
id: '9208913598676794842'
kind: compute#targetSslProxy
name: my-ssl-lb-target-proxy
proxyHeader: NONE
selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy
service: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb
sslCertificates:

  • https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/sslCertificates/my-ssl-cert

대상 SSL 프록시 삭제

대상 프록시를 삭제하려면 먼저 해당 프록시를 참조하는 모든 전역 전달 규칙을 삭제해야 합니다.

Console


  1. Google Cloud Platform Console에서 전역 전달 규칙 페이지로 이동합니다.
    전역 전달 규칙 목록 페이지로 이동
  2. 전역 전달 규칙 옆의 체크박스를 선택합니다.
  3. 삭제를 클릭합니다.
  4. Google Cloud Platform Console의 대상 프록시 목록 페이지로 이동합니다.
    대상 프록시 목록 페이지로 이동
  5. 대상 SSL 프록시 옆의 체크박스를 선택합니다.
  6. 삭제를 클릭합니다.

또는 안내에 따라 모든 부하 분산기 구성요소를 삭제할 수 있습니다.

  1. Google Cloud Platform Console의 부하 분산 페이지로 이동합니다.
    부하 분산 페이지로 이동
  2. 원하는 행의 오른쪽에 있는 휴지통 아이콘을 클릭합니다.
  3. 부하 분산기 삭제를 클릭하여 확인합니다.

gcloud


  1. 전역 전달 규칙을 삭제합니다.

    gcloud compute forwarding-rules delete my-ssl-lb-forwarding-rule \
        --global
    

    The following global forwarding rules will be deleted:

    • [my-ssl-lb-forwarding-rule]

    Do you want to continue (Y/n)? y

    Deleted [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-ssl-lb-forwarding-rule].

  2. SSL 프록시를 삭제합니다.

    gcloud compute target-ssl-proxies delete my-ssl-lb-target-proxy
    

    The following target ssl proxies will be deleted:

    • [my-ssl-lb-target-proxy]

    Do you want to continue (Y/n)? y

    Deleted [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].

대상 SSL 프록시의 백엔드 서비스 업데이트

update 명령어를 사용하여 다른 백엔드 서비스의 SSL 프록시를 가리킬 수 있습니다. 이 예시에서는 새 백엔드 서비스를 만들고 프록시가 해당 서비스를 가리키도록 합니다. 그런 다음 업데이트를 수행하고 프록시가 다시 원래의 백엔드 서비스를 가리키도록 합니다.

Console


이 단계에서는 gcloud 명령줄 도구를 사용하세요.

gcloud


  1. 동일한 상태 확인을 사용하여 두 번째 백엔드 서비스를 만듭니다.

    gcloud compute backend-services create my-other-backend-service \
        --protocol SSL \
        --health-checks my-ssl-health-check \
        --global
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-other-backend-service].
    NAME                     BACKENDS PROTOCOL
    my-other-backend-service          SSL
  2. SSL 프록시가 새로운 백엔드를 가리키도록 합니다.

    gcloud compute target-ssl-proxies update my-ssl-lb-target-proxy \
        --backend-service my-other-backend-service
    
    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].
  3. 이 백엔드 서비스에는 인스턴스가 없으므로 지금 바로 프록시를 사용하려고 하면 웹 페이지를 가져올 수 없습니다. 원래 구성을 계속 테스트하려면 SSL 프록시가 다시 첫 번째 백엔드 서비스를 가리키도록 합니다.

    gcloud compute target-ssl-proxies update my-ssl-lb-target-proxy \
        --backend-service my-ssl-lb
    
    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].

대상 SSL 프록시의 SSL 인증서 리소스 업데이트

이 명령어를 사용하여 SSL 프록시의 SSL 인증서를 대체합니다. 필요한 추가 SSL 인증서 리소스가 이미 만들어져 있어야 합니다.

Console


  1. Google Cloud Platform Console의 부하 분산 페이지로 이동합니다.
    부하 분산 페이지로 이동
  2. 부하 분산기 옆에 있는 편집을 클릭합니다.
  3. 프런트엔드 구성을 클릭합니다.
  4. 인증서 드롭다운 메뉴에서 새 인증서를 선택합니다.
  5. 추가 인증서를 추가해야 하는 경우 Add certificate를 클릭합니다.
  6. 완료를 클릭합니다.

gcloud


최대 10개의 SSL 인증서를 사용합니다.

gcloud compute target-ssl-proxies set-ssl-certificates {PROXY_NAME] \
    --ssl-certificates [SSL_CERT_1][,[SSL_CERT_2],...]

Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].

선택적 매개변수

클라이언트 연결 정보를 유지하기 위한 프록시 프로토콜

SSL 프록시를 사용하는 Google Cloud Load Balancing은 클라이언트의 SSL 연결을 종료하고 인스턴스에 대한 새 연결을 만듭니다. 따라서 원래 클라이언트 IP 및 포트 정보는 기본적으로 보존되지 않습니다.

원래 연결 정보를 유지하고 인스턴스로 보내려면 PROXY 프로토콜(버전 1)을 사용 설정합니다. 이 프로토콜은 요청의 일부로 소스 IP 주소, 대상 IP 주소, 포트 번호가 포함된 추가 헤더를 인스턴스에 보냅니다.

TCP 및 SSL 상태 확인에 PROXY 프로토콜을 설정할 수도 있습니다.

일반적으로 PROXY 프로토콜 헤더는 사용자가 읽을 수 있는 다음과 같은 형식의 한 줄 텍스트입니다.

PROXY TCP4 <client IP> <load balancing IP> <source port> <dest port>\r\n

이 예시에서 클라이언트 IP 주소는 192.0.2.1, 부하 분산 IP 주소는 198.51.100.1, 클라이언트 포트는 15221, 대상 포트는 443입니다.

PROXY TCP4 192.0.2.1 198.51.100.1 15221 443\r\n

클라이언트 IP 주소를 알 수 없는 경우 부하 분산기는 다음 형식으로 PROXY 프로토콜 헤더를 생성합니다.

PROXY UNKNOWN\r\n

프록시의 PROXY 프로토콜 헤더 업데이트

기존 대상 SSL 프록시의 PROXY 프로토콜 헤더를 변경하려면 이 명령어를 사용하세요.

Console


  1. Google Cloud Platform Console의 부하 분산 페이지로 이동합니다.
    부하 분산 페이지로 이동
  2. 부하 분산기의 편집을 클릭합니다.
  3. 프런트엔드 구성을 클릭합니다.
  4. 프록시 프로토콜 필드의 값을 변경합니다.
  5. 업데이트를 클릭하여 변경사항을 저장합니다.

gcloud


gcloud compute target-ssl-proxies update my-ssl-lb-target-proxy \
    --proxy-header [NONE | PROXY_V1]

연결 드레이닝

백엔드 서비스에서 연결 드레이닝을 사용 설정하면 트래픽을 제공하는 인스턴스가 종료되거나 수동으로 삭제되거나 자동 확장 처리를 통해 삭제되는 경우 사용자에 대한 방해를 최소화할 수 있습니다. 연결 드레이닝에 대해 자세히 알아보려면 연결 드레이닝 사용 설정 문서를 참조하세요.

부하 분산기 구성요소

상태 확인

상태 확인은 새 연결을 수신할 수 있는 인스턴스를 판별합니다. 인스턴스 상태 판별을 위해 TCP, SSL, HTTP 또는 HTTPS 상태 확인을 구성할 수 있습니다.

  • 백엔드 인스턴스에서 실행 중인 서비스가 HTTP 기반이라면 HTTP 상태 확인을 사용하세요.
  • 백엔드 인스턴스에서 실행 중인 서비스가 HTTPS 기반이라면 HTTPS 상태 확인을 사용하세요.
  • 백엔드 인스턴스에서 실행 중인 서비스가 SSL을 사용한다면 SSL 상태 확인을 사용하세요.
  • 다른 종류의 상태 확인을 사용해야 하는 명확한 이유가 없다면 TCP 상태 확인을 사용하세요.

상태 확인 방화벽 규칙

인스턴스의 상태 확인 프로브는 130.211.0.0/2235.191.0.0/16 범위 내의 주소에서 가져옵니다. 방화벽 규칙은 관련 포트에서 이 연결을 허용해야 합니다. 자세한 내용은 SSL 부하 분산기의 방화벽 규칙 만들기를 참조하세요.

상태 확인에 대한 자세한 내용은 상태 확인을 참조하세요.

백엔드 서비스

백엔드 서비스 리소스는 다음을 포함한 구성 정보를 부하 분산기에 제공합니다.

  • 백엔드 서비스는 들어오는 트래픽을 하나 이상의 연결된 백엔드로 보냅니다. 부하 분산 모드에 따라 다르며 이 내용은 나중에 설명합니다. 각 백엔드는 인스턴스 그룹과 인스턴스 그룹의 인스턴스 간에 트래픽을 분산시키기 위한 추가 구성으로 구성됩니다. 각 인스턴스 그룹은 하나 이상의 인스턴스로 구성됩니다.
  • 각 백엔드 서비스는 백엔드 서비스에 추가된 인스턴스 그룹의 인스턴스에 대해 수행되는 상태 확인도 지정합니다.
  • 부하 분산기를 통한 유휴 SSL 프록시 연결 지속 시간에는 백엔드 서비스 시간 제한이 적용됩니다.

백엔드 서비스를 구성할 때 인스턴스를 추가하고 부하 분산기가 인스턴스에 전송할 수 있는 트래픽 양을 결정하는 분산 모드를 지정해야 합니다. 한도에 도달하면 추가 요청이 사용자에게 가장 가까운 인스턴스(용량이 있는 경우)로 전송됩니다.

SSL 프록시는 다음 분산 모드를 지원합니다.

  • UTILIZATION(기본값): 인스턴스 그룹의 평균 현재 CPU 사용률이 지정된 값 미만이면 인스턴스에서 트래픽을 허용할 수 있습니다. 이 값을 설정하려면 --max-utilization 매개변수를 사용하고 0.0(0%)에서 1.0(100%) 사이의 값을 전달합니다. 기본값은 0.8(80%)입니다.
  • CONNECTION: 연결 수가 지정된 값 미만이면 인스턴스에서 트래픽을 허용할 수 있습니다. 이 값은 다음 중 하나일 수 있습니다.
    • --max-connections: 인스턴스 그룹에 속하는 모든 백엔드 인스턴스의 최대 연결 수입니다.
    • --max-connections-per-instance: 단일 인스턴스가 처리할 수 있는 최대 연결 수입니다. 그룹의 평균값이 이 수를 초과하지 않으면 요청이 전달됩니다.

분산 모드를 UTILIZATION으로 설정해도 --max-connections 또는 --max-connections-per-instance를 지정할 수 있습니다. --max-utilization과 연결 매개변수가 모두 지정된 경우에는 하나만 한도에 도달해도 그룹의 사용률이 포화된 것으로 간주됩니다.

백엔드 서비스 리소스에 대한 자세한 내용은 백엔드 서비스 이해를 참조하세요.

SSL 인증서

SSL 부하 분산을 사용하려면 대상 프록시에서 부하 분산기에 사용할 수 있는 SSL 인증서를 하나 이상 만들어야 합니다. 대상 프록시에 최대 15개의 SSL 인증서를 구성할 수 있습니다.

이러한 인증서는 자체 관리형 인증서 또는 Google에서 관리하는 인증서일 수 있습니다.

자체 관리형 SSL 인증서를 사용 중이며 비공개 키와 서명된 인증서가 없는 경우 테스트용으로 자체 서명된 인증서를 만들어 사용할 수 있습니다. 자세한 내용은 SSL 인증서를 참조하세요. 자체 서명된 인증서를 프로덕션 용도로 사용하면 안 됩니다. 여러 SSL 인증서를 사용하는 경우 인증서마다 SSL 인증서 리소스를 만들어야 합니다.

전달 규칙

특정 IP 주소와 포트를 대상 SSL 프록시로 전달하는 전달 규칙을 만듭니다. 고객의 트래픽이 외부 IP 주소에 도달하면 이 전달 규칙에 따라 트래픽이 SSL 프록시로 전송됩니다.

자세한 내용은 전달 규칙을 참조하세요.

권장사항

  • 클라이언트 연결 정보를 유지해야 하면 PROXY 프로토콜 버전 1 헤더 앞에 부하 분산기를 추가하여 구성하세요.
  • 트래픽이 HTTPS이면 부하 분산에 SSL 프록시가 아닌 HTTPS 부하 분산을 사용해야 합니다.

모니터링

SSL 프록시 부하 분산 모니터링에 대한 내용은 TCP/SSL 프록시 모니터링을 참조하세요.

문제해결

부하 분산기 IP에서 페이지 로드 실패

인스턴스의 상태 검증

인스턴스가 HEALTHY인지 확인합니다.

gcloud compute backend-services get-health my-ssl-lb
---
backend: https://www.googleapis.com/resourceviews/v1/projects/[PROJECT_ID]/zones/us-central1-b/resourceViews/us-ig1
status:
  kind: compute#backendServiceGroupHealth
---
backend: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2
status:
  kind: compute#backendServiceGroupHealth

방화벽 규칙이 올바른지 확인

  • 130.211.0.0/2235.191.0.0/16 트래픽을 허용하려면 상태 확인기와 부하 분산기 모두에 이러한 IP 주소가 필요합니다.
  • 부하 분산기와 인스턴스 간에 SSL을 사용 중인 경우 SSL 상태 확인을 사용합니다. 방화벽 규칙이 소스 IP 주소 범위 130.211.0.0/2235.191.0.0/16tcp:443을 허용하는지 확인합니다.
  • 부하 분산기와 인스턴스 간에 TCP를 사용 중인 경우 TCP 상태 확인을 사용합니다. 방화벽 규칙이 소스 IP 범위 130.211.0.0/2235.191.0.0/16에서 tcp:80을 허용하는지 확인합니다.
  • 인스턴스 태그를 사용 중인 경우 태그가 방화벽 규칙의 TARGET_TAGS 아래에 있는지 확인하고 인스턴스에 해당 태그가 모두 있는지 확인합니다. 이 예시에서는 인스턴스에 ssl-lb 태그가 지정되어 있습니다.
gcloud compute firewall-rules list
NAME                      NETWORK SRC_RANGES                  RULES                        SRC_TAGS TARGET_TAGS
allow-ssl-lb-and-health  default 130.211.0.0/22,35.191.0.0/16 tcp:443                      ssl-lb

개별 인스턴스에 접속 시도

인스턴스에 개별적으로 액세스할 수 있는 방화벽 규칙을 임시로 설정한 다음, 특정 인스턴스에서 페이지 로드를 시도합니다.

  1. 모든 소스에서 태그 지정된 인스턴스로 전송되는 트래픽을 허용하도록 방화벽을 엽니다.

    gcloud compute firewall-rules create allow-ssl-0-0-0-0   \
        --source-ranges 0.0.0.0/0   \
        --target-tags ssl-lb    \
        --allow tcp:443
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-0-0-0-0].
    NAME              NETWORK SRC_RANGES RULES   SRC_TAGS TARGET_TAGS
    allow-ssl-0-0-0-0 default 0.0.0.0/0  tcp:443          ssl-lb
  2. 인스턴스 중 하나의 EXTERNAL_IP 주소를 찾습니다.

    gcloud compute instances list
    
    NAME             ZONE           MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-1 us-central1-b  n1-standard-1             10.240.0.8  EXTERNAL_IP RUNNING
    ig-us-central1-2 us-central1-b  n1-standard-1             10.240.0.11 EXTERNAL_IP RUNNING
    ig-us-east1-1    us-east1-b     n1-standard-1             10.240.0.12 EXTERNAL_IP RUNNING
    ig-us-east1-2    us-east1-b     n1-standard-1             10.240.0.13 EXTERNAL_IP RUNNING
  3. 그런 다음 브라우저에서 직접 하나 이상의 인스턴스에 액세스합니다.

    https://[EXTERNAL_IP]
    
  4. 이 방법으로 인스턴스에 액세스할 수 없으면 소프트웨어가 올바르게 실행되고 있는지 확인합니다. 올바르게 실행되고 있다면 부하 분산기 방화벽 규칙이 올바른지 확인합니다.

    gcloud compute firewall-rules describe allow-ssl-lb-and-health
    
    allowed:
      IPProtocol: tcp
      ports:
      '443'
    creationTimestamp: '2016-02-20T22:27:15.094-08:00'
    description: ''
    id: '5304629236729177644'
    kind: compute#firewall
    name: allow-130-211-0-0-22-ssl
    network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
    selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-lb-and-health
    sourceRanges:
      130.211.0.0/22,35.191.0.0/16
    targetTags:
      ssl-lb
  5. 인스턴스가 작동하고 있음이 확실하면 'from anywhere' 방화벽 규칙을 삭제합니다.

    gcloud compute firewall-rules delete allow-ssl-0-0-0-0
    
    The following firewalls will be deleted:
       [allow-ssl-0-0-0-0]
    Do you want to continue (Y/n)?  y
    Deleted [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-0-0-0-0].

다음 단계