TCP 프록시 Codelab - TCP 프록시 부하 분산기를 사용한 비율 제한 및 IP 거부 목록

1. 소개

Google Cloud 부하 분산은 전 세계 Google 접속 지점 (POP)의 Google 네트워크 에지에 배포됩니다. TCP 프록시 부하 분산기로 전달된 사용자 트래픽은 사용자에게 가장 가까운 POP로 유입되고, 이어서 Google의 글로벌 네트워크를 통해 사용 가능한 용량이 충분한 가장 가까운 백엔드로 부하가 분산됩니다.

Cloud Armor는 Google의 DDoS 및 웹 애플리케이션 방화벽 (WAF) 감지 시스템입니다. Cloud Armor는 Google Cloud TCP 프록시 부하 분산기와 긴밀하게 결합되어 있으며, 들어오는 트래픽에서 원치 않는 요청을 탐색할 수 있습니다. 이 서비스의 비율 제한 기능을 사용하면 요청 수를 기준으로 백엔드 리소스에 대한 트래픽을 줄이고 원치 않는 트래픽이 Virtual Private Cloud (VPC) 네트워크에서 리소스를 소비하지 못하도록 할 수 있습니다.

Google Cloud TCP/SSL 프록시 부하 분산기를 사용하면 백엔드 서비스 간에 TCP/ SSL 유형 트래픽을 프록시할 수 있습니다.

이 실습에서는 백엔드 서비스가 있는 TCP/SSL 부하 분산기를 만들고 부하 분산기에 대한 액세스를 특정 사용자 클라이언트 집합으로만 제한합니다.

be33dadf836374bb.png

학습할 내용

  • TCP/SSL 프록시 부하 분산기를 만드는 방법
  • Cloud Armor 보안 정책을 만드는 방법
  • Cloud Armor에서 TCP/SSL 프록시 부하 분산기에 대한 IP 거부 목록 규칙을 만드는 방법
  • Cloud Armor에서 TCP 프록시 부하 분산기에 대한 비율 제한 규칙을 만드는 방법
  • TCP/SSL 부하 분산 백엔드 서비스에 보안 정책을 추가하는 방법

필요한 항목

  • Google Compute Engine에 관한 기본 지식 ( codelab)
  • 기본 네트워킹 및 TCP/IP 지식
  • 기본 Unix/Linux 명령줄 지식
  • Google Cloud의 네트워킹을 통해 GCP의 네트워킹 둘러보기를 완료하면 도움이 됩니다.

2. 요구사항

자습형 환경 설정

  1. Cloud 콘솔에 로그인하고 새 프로젝트를 만들거나 기존 프로젝트를 다시 사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

참고: console.cloud.google.com URL을 외워 두면 Cloud 콘솔에 쉽게 액세스할 수 있습니다.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억하세요(위의 이름은 이미 사용되었으므로 사용할 수 없습니다). 이 이름은 나중에 이 Codelab에서 PROJECT_ID로 참조됩니다.

참고: Gmail 계정을 사용하는 경우 기본 위치를 '조직 없음'으로 설정된 그대로 둘 수 있습니다. Google Workspace 계정을 사용하는 경우 조직에 적합한 위치를 선택합니다.

  1. 그런 후 Google Cloud 리소스를 사용할 수 있도록 Cloud Console에서 결제를 사용 설정해야 합니다.

이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 가이드를 마친 후 비용이 결제되지 않도록 리소스 종료 방법을 알려주는 '삭제' 섹션의 안내를 따르세요. Google Cloud 신규 사용자는 미화 300달러 상당의 무료 체험판 프로그램에 참여할 수 있습니다.

Cloud Shell 시작

Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

GCP 콘솔에서 오른쪽 상단 툴바의 Cloud Shell 아이콘을 클릭합니다.

bce75f34b2c53987.png

환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.

f6ef2b5f13479f3a.png

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉토리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 실습의 모든 작업은 브라우저만으로 수행할 수 있습니다.

시작하기 전에

Cloud Shell 내에서 프로젝트 ID가 설정되어 있는지 확인합니다.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
PROJECT_ID=[YOUR-PROJECT-NAME]
echo $PROJECT_ID

API 사용 설정

필요한 모든 서비스 사용 설정

gcloud services enable compute.googleapis.com
gcloud services enable logging.googleapis.com        
gcloud services enable monitoring.googleapis.com

3. 백엔드 서비스 만들기

다음과 같이 인스턴스 2개를 만듭니다. us-central1-b 영역에 instance1-b1을 만듭니다.

gcloud compute instances create vm-1-b1 \
    --image-family debian-9 \
    --image-project debian-cloud \
    --tags tcp-lb \
    --zone us-central1-b \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
      sudo service apache2 restart
      echo '<!doctype html><html><body><h1>This is VM1-b1 in central1-b</h1></body></html>' | tee /var/www/html/index.html
      EOF"

us-central1-b 영역에서 인스턴스 1-b2 만들기

gcloud compute instances create vm-1-b2 \
    --image-family debian-9 \
    --image-project debian-cloud \
    --tags tcp-lb \
    --zone us-central1-b \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
      sudo service apache2 restart
      echo '<!doctype html><html><body><h1>This is VM1-b2 in central1-b</h1></body></html>' | tee /var/www/html/index.html
      EOF"

인스턴스 그룹 vm-ig1 만들기

gcloud compute instance-groups unmanaged create vm-ig1  --zone us-central1-b

인스턴스 그룹에 대해 이름이 지정된 포트를 만듭니다. 이 실습에서는 포트 110을 사용합니다.

    gcloud compute instance-groups set-named-ports vm-ig1 \
--named-ports tcp 110:110 --zone us-central1-b

인스턴스 그룹에 인스턴스 추가

gcloud compute instance-groups unmanaged add-instances vm-ig1 \
   --instances vm-1-b1,vm-1-b2 --zone us-central1-b

4. 부하 분산기 구성

다음으로 상태 점검을 만듭니다.

gcloud compute health-checks create tcp my-tcp-health-check --port 110

백엔드 서비스 만들기

gcloud compute backend-services create my-tcp-lb  --global-health-checks --global \
--protocol TCP --health-checks my-tcp-health-check --timeout 5m --port-name tcp110

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

gcloud compute backend-services add-backend my-tcp-lb --global --instance-group \ vm-ig1 --instance-group-zone us-central1-b --balancing-mode UTILIZATION \ --max-utilization 0.8

대상 TCP 프록시 구성

gcloud compute target-tcp-proxies create my-tcp-lb-target-proxy --backend-service \ my-tcp-lb --proxy-header NONE

전역 고정 IPv4 주소 예약

이 IP 주소를 사용하여 부하 분산된 서비스에 도달합니다.

gcloud compute addresses create tcp-lb-static-ipv4  --ip-version=IPV4   --global

LB IP 주소에 전역 전달 규칙을 구성합니다.

gcloud compute forwarding-rules create my-tcp-lb-ipv4-forwarding-rule \
    --global --target-tcp-proxy my-tcp-lb-target-proxy --address LB_STATIC_IPV4 \ --ports 110

5. TCP 프록시 부하 분산기에 대한 방화벽 규칙 만들기

gcloud compute firewall-rules create allow-tcplb-and-health \
   --source-ranges 130.211.0.0/22,35.191.0.0/16 \
   --target-tags tcp-lb \
   --allow tcp:110

부하 분산기가 생성되면 다음 명령어로 테스트합니다.

Curl LB_IP:110

그런 다음 LB에 대한 액세스 거부 확인을 위한 VM을 만듭니다.

공개 IP 주소가 있고 이름이 각각 test-server1 및 test-server2인 인스턴스 2개를 만들어야 합니다.

6. Cloud Armor에서 보안 정책 만들기

이 섹션에서는 Cloud Armor의 정책에서 백엔드 보안 정책과 2개의 규칙을 만듭니다.

첫 번째 규칙은 특정 IP를 거부하도록 보안 정책을 설정하여 제한된 IP 집합이 TCP 부하 분산기에 액세스하는 것을 거부하고 두 번째 규칙은 비율 제한을 실행합니다.

  1. Cloud Shell(Cloud Shell 사용 방법에 관한 안내는 '설정 및 요구사항'의 'Cloud Shell 시작' 참고)에서 다음과 같이 rate-limit-and-deny-tcp라는 백엔드 서비스 보안 정책을 만듭니다.
gcloud compute security-policies create rate-limit-and-deny-tcp \
    --description "policy for tcp proxy rate limiting and IP deny"

보안 정책에 규칙 추가

그런 다음 Cloud Armor 정책 'rate-limit-and-deny-tcp'에 거부 목록 규칙을 추가합니다.

gcloud compute security-policies rules create 1000 --action deny --security-policy \ rate-limit-and-deny-tcp --description "deny test-server1" --src-ip-ranges \ "enter-test-server-1ip-here"

Cloud Armor 보안 정책 'rate-limit-and-deny-tcp'에 비율 제한 규칙 추가

gcloud compute security-policies rules create 3000   \ --security-policy=rate-limit-and-deny-tcp  \       
--expression="true"  --action=rate-based-ban  --rate-limit-threshold-count=5  \          
--rate-limit-threshold-interval-sec=60  --ban-duration-sec=300      \         
--conform-action=allow  --exceed-action=deny-404  --enforce-on-key=IP

TCP 프록시 백엔드 서비스에 정책 연결

다음 명령어를 실행하여 보안 정책이 TCP 프록시 백엔드 서비스에 연결되어 있는지 확인합니다.

gcloud compute backend-services update my-tcp-lb --security-policy \ rate-limit-and-deny-tcp

TCP 프록시 부하 분산기에서 로깅 사용 설정

gcloud beta compute backend-services update my-tcp-lb \ 
--enable-logging --logging-sample-rate=1

7. 거부 목록 규칙 검증

거부 목록 규칙에 IP가 지정된 test-server에 로그인하고 다음 명령어를 실행하여 거부 목록 규칙을 확인합니다.

Curl LB_IP:110

즉시 요청하면 LB에서 응답을 받을 수 있지만 curl 요청이 거부되거나 삭제될 때까지 기다린 후 Cloud Logging의 로그를 살펴보고 트리거된 IP 거부 규칙의 로그 항목을 확인합니다.

Cloud Logging으로 이동하여 리소스에서 리소스 유형을 'tcp_ssl_proxy_rule'로 선택하고 백엔드 타겟을 'my-tcp-lb'로 설정합니다.

필터링에 정의된 리소스를 사용하면 로그 항목의 PRIORITY 값 1000에서 IP 거부 규칙이 적용되고 구성된 작업 'DENY' 작업이 적용되는지 확인할 수 있습니다. 아래와 같이 거부 규칙 및 거부되는 IP에서 모두 지시되었기 때문입니다.

db9b835e0360dcaf.png

8. 비율 제한 규칙 검증

정의된 기준 (분당 5회 요청)을 초과하는 많은 요청을 짧은 시간 내에 전송하여 비율 제한 규칙이 적용되는지 확인합니다.

완료되면 Cloud Armor 서비스에서 로그 보기를 클릭합니다. 그러면 Cloud Logging으로 이동하여 부하 분산기별로 로그를 필터링하여 Cloud Armor 로그가 들어올 때 이를 확인할 수 있습니다.

비율 제한 항목은 아래 스크린샷과 같아야 합니다. 로그 항목의 우선순위 값 3000과 구성된 작업에서 비율 제한 규칙이 적용되고 있는지 확인할 수 있으며, 비율 제한 규칙의 안내에 따라 '비율 기반 차단' 작업이 적용되고 있습니다.

37c76e5d7532623.png

9. 환경 정리

미사용 인프라의 운영 비용이 발생하지 않도록 생성된 인프라를 삭제해야 합니다.

가장 빠른 방법은 GCP에서 전체 프로젝트를 삭제하여 관리되지 않는 중단된 리소스가 없도록 하는 것입니다. 그러나 다음 명령어를 사용하여 개별 리소스를 삭제합니다.

TCP 프록시 부하 분산기

gcloud compute target-tcp-proxies delete my-tcp-lb

인스턴스 그룹

gcloud compute instance-groups unmanaged delete vm-ig1

테스트 VM 인스턴스 2개가 생성됨

gcloud compute instances delete Instance_name --zone=instance_zone

백엔드 서비스

gcloud compute backend-services delete BACKEND_SERVICE_NAME

정책 내 Cloud Armor 규칙

gcloud compute security-policies rules delete 1000  \ --security-policy=rate-limit-and-deny-tcp && 
gcloud compute security-policies rules delete 3000  \ --security-policy=rate-limit-and-deny-tcp

Cloud Armor 보안 정책

gcloud compute security-policies delete rate-limit-and-deny-tcp