비공개 인스턴스의 이그레스 제어

이 섹션에서는 개발 단계와 파이프라인 실행 단계 중에 비공개 Cloud Data Fusion 인스턴스에서 이그레스 제어를 설정하는 개략적인 아키텍처를 설명합니다.

다음 시스템 아키텍처 다이어그램은 파이프라인을 개발할 때 비공개 Cloud Data Fusion 인스턴스가 공용 인터넷에 연결되는 방법을 보여줍니다.

비공개 인스턴스 아키텍처 다이어그램

고객 프로젝트를 통해 모든 이그레스 트래픽을 라우팅하면 파이프라인 개발 또는 실행 중에 SaaS 애플리케이션 및 타사 퍼블릭 클라우드 서비스에 대한 연결을 제어할 수 있습니다. 이 프로세스에는 다음 리소스가 사용됩니다.

  • 커스텀 VPC 네트워크 경로: 커스텀 VPC 네트워크가 가져온 커스텀 경로를 통해 트래픽을 게이트웨이 VM으로 라우팅하고 게이트웨이 VM은 VPC 피어링을 사용하여 테넌트 프로젝트 VPC로 내보냅니다.

  • 프록시 VM: 프록시 VM은 Google Cloud에서 나온 이그레스 트래픽을 공용 인터넷을 통해 Cloud Data Fusion 테넌트 프로젝트에서 지정된 대상으로 라우팅합니다. 게이트웨이 VM은 고객 프로젝트에서 만들어 관리합니다. 내부 부하 분산기(ILB)를 사용하여 고가용성(HA) 설정에서 이를 구성하는 것이 좋습니다. 동일한 VPC 네트워크를 사용하는 비공개 Cloud Data Fusion 인스턴스가 여러 개 있는 경우 VPC 내에서 동일한 VM을 재사용할 수 있습니다.

시작하기 전에

파이프라인 개발 단계의 이그레스 제어 설정

이그레스 제어를 사용하면 네트워크를 벗어날 수 있는 항목을 제어하거나 필터링할 수 있어 VPC 서비스 제어 환경에서 유용합니다. 이 작업을 수행하기 위한 기본 네트워크 프록시는 없습니다. 프록시의 예시에는 Squid 프록시, HAProxy, Envoy가 있습니다.

이 가이드의 예시에서는 Debian 이미지를 사용하는 VM 인스턴스에서 HTTP 필터링을 위한 HTTP 프록시를 설정하는 방법을 설명합니다. 여기서는 Squid 프록시 서버를 사용하지만 이는 프록시 서버를 설정하는 방법 중 하나일 뿐입니다.

프록시 VM 만들기

다음 시작 스크립트 및 IP 전달을 사용하여 비공개 Cloud Data Fusion 인스턴스와 동일한 VPC에 VM을 만듭니다.

이 스크립트는 Squid 프록시를 설치하며 HTTP 트래픽을 가로채고 .squid-cache.org.google.com 도메인을 허용하도록 프록시를 구성합니다. 이 도메인을 Cloud Data Fusion 인스턴스와 연결하려는 도메인으로 바꿀 수 있습니다.

Console

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기를 클릭합니다.

  3. 비공개 Cloud Data Fusion 인스턴스로 네트워크 피어링이 설정된 VPC를 사용합니다. 이 시나리오의 VPC 네트워크 피어링에 대한 자세한 내용은 시작하기 전에를 참조하세요.

  4. Cloud Data Fusion 인스턴스와 동일한 네트워크에 있는 인스턴스에 IP 전달을 사용 설정합니다.

  5. 시작 스크립트 필드에 다음 스크립트를 입력합니다.

    #! /bin/bash
    apt-get -y install squid3
    cat <<EOF > /etc/squid/conf.d/debian.conf
    #
    # Squid configuration settings for Debian
    #
    logformat squid %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %ssl::>sni %Sh/%<a %mt
    logfile_rotate 10
    debug_options rotate=10
    
    # configure intercept port
    http_port 3129 intercept
    
    # allow only certain sites
    acl allowed_domains dstdomain "/etc/squid/allowed_domains.txt"
    http_access allow allowed_domains
    
    # deny all other http requests
    http_access deny all
    EOF
    
    # Create a file with allowed egress domains
    # Replace these example domains with the domains that you want to allow
    # egress from in Data Fusion pipelines
    cat <<EOF > /etc/squid/allowed_domains.txt
    .squid-cache.org
    .google.com
    EOF
    
    /etc/init.d/squid restart
    
    iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3129
    
    echo 1 > /proc/sys/net/ipv4/ip_forward
    echo net.ipv4.ip_forward=1 > /etc/sysctl.d/11-gce-network-security.conf
    iptables -t nat -A POSTROUTING -s 0.0.0.0/0 -p tcp --dport 443 -j MASQUERADE
    

gcloud

export CDF_PROJECT=<cdf-project>
export PROXY_VM=<proxy-vm>
export ZONE=<vm-zone>
export SUBNET=<subnet>
export VPC_NETWORK=<vpc-network>
export COMPUTE_ENGINE_SA=<compute-engine-sa>

gcloud beta compute --project=$CDF_PROJECT instances create $PROXY_VM --zone=$ZONE --machine-type=e2-medium --subnet=$SUBNET --no-address --metadata=startup-script=\#\!\ /bin/bash$'\n'apt-get\ -y\ install\ squid3$'\n'cat\ \<\<EOF\ \>\ /etc/squid/conf.d/debian.conf$'\n'\#$'\n'\#\ Squid\ configuration\ settings\ for\ Debian$'\n'\#$'\n'logformat\ squid\ \%ts.\%03tu\ \%6tr\ \%\>a\ \%Ss/\%03\>Hs\ \%\<st\ \%rm\ \%ru\ \%ssl::\>sni\ \%Sh/\%\<a\ \%mt$'\n'logfile_rotate\ 10$'\n'debug_options\ rotate=10$'\n'$'\n'\#\ configure\ intercept\ port$'\n'http_port\ 3129\ intercept$'\n'$'\n'\#\ allow\ only\ certain\ sites$'\n'acl\ allowed_domains\ dstdomain\ \"/etc/squid/allowed_domains.txt\"$'\n'http_access\ allow\ allowed_domains$'\n'$'\n'\#\ deny\ all\ other\ http\ requests$'\n'http_access\ deny\ all$'\n'EOF$'\n'$'\n'$'\n'\#\ Create\ a\ file\ with\ allowed\ egress\ domains$'\n'\#\ Replace\ these\ example\ domains\ with\ the\ domains\ that\ you\ want\ to\ allow\ $'\n'\#\ egress\ from\ in\ Data\ Fusion\ pipelines$'\n'cat\ \<\<EOF\ \>\ /etc/squid/allowed_domains.txt$'\n'.squid-cache.org$'\n'.google.com$'\n'EOF$'\n'$'\n'/etc/init.d/squid\ restart$'\n'$'\n'iptables\ -t\ nat\ -A\ PREROUTING\ -p\ tcp\ --dport\ 80\ -j\ REDIRECT\ --to-port\ 3129$'\n'echo\ 1\ \>\ /proc/sys/net/ipv4/ip_forward$'\n'echo\ net.ipv4.ip_forward=1\ \>\ /etc/sysctl.d/11-gce-network-security.conf$'\n'iptables\ -t\ nat\ -A\ POSTROUTING\ -s\ 0.0.0.0/0\ -p\ tcp\ --dport\ 443\ -j\ MASQUERADE --can-ip-forward --maintenance-policy=MIGRATE --service-account=$COMPUTE_ENGINE_SA --scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append --tags=http-server,https-server --image=debian-10-buster-v20210420 --image-project=debian-cloud --boot-disk-size=10GB --boot-disk-type=pd-balanced --boot-disk-device-name=instance-1 --no-shielded-secure-boot --shielded-vtpm --shielded-integrity-monitoring --reservation-affinity=any

gcloud compute --project=$CDF_PROJECT firewall-rules create egress-allow-http --direction=INGRESS --priority=1000 --network=$VPC_NETWORK --action=ALLOW --rules=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=https-server

gcloud compute --project=$CDF_PROJECT firewall-rules create egress-allow-https --direction=INGRESS --priority=1000 --network=$VPC_NETWORK --action=ALLOW --rules=tcp:443 --source-ranges=0.0.0.0/0 --target-tags=https-server

커스텀 경로 만들기

내가 만든 게이트웨이 VM 인스턴스에 연결할 커스텀 경로를 만듭니다.

Console

Cloud Console에서 경로를 만들려면 정적 경로 추가를 참조하세요.

경로를 구성할 때 다음을 수행합니다.

  • 우선순위1001 이상으로 설정합니다.
  • 비공개 Cloud Data Fusion 인스턴스와 동일한 프로젝트 및 VPC를 사용합니다.
  • VPC 네트워크 피어링 구성에서 경로 내보내기를 허용하는지 확인합니다. 이렇게 하면 Cloud Data Fusion 테넌트 프로젝트 VPC가 VPC 네트워크 피어링을 통해 이 커스텀 경로를 가져올 수 있습니다.

gcloud

gcloud 도구에서 경로를 만들려면 다음 안내를 따르세요.

gcloud beta compute routes create $ROUTE --project=$CDF_PROJECT \
    --network=$VPC_NETWORK --priority=1001 \
    --destination-range=0.0.0.0/0 \
    --next-hop-instance=$PROXY_VM \
    --next-hop-instance-zone=$ZONE

파이프라인 실행을 위한 이그레스 제어 설정

설계 환경에서 미리보기 및 랭글러의 허용 호스트 이름을 사용하여 공용 인터넷에 액세스할 수 있게 되면 파이프라인을 배포합니다. 배포된 Cloud Data Fusion 파이프라인은 Dataproc 클러스터에서 기본적으로 실행됩니다.

Dataproc 클러스터의 모든 공용 인터넷 트래픽이 하나 이상의 프록시 VM을 거치도록 하려면 비공개 DNS 영역과 레코드를 추가합니다. 이는 Cloud NAT가 필터링을 지원하지 않기 때문에 필요한 절차입니다.

DNS 레코드에 프록시 VM 또는 ILB의 IP 주소를 포함합니다.

파이프라인 배포

위의 단계의 설계 단계에서 파이프라인을 확인한 후에 파이프라인을 배포합니다. 배포된 파이프라인은 기본적으로 Dataproc 클러스터에서 실행됩니다. Dataproc 클러스터의 모든 공용 인터넷 트래픽이 프록시 VM 집합을 통과하도록 하려면 인스턴스 태그가 'proxy'이고 우선순위가 '1000'인 커스텀 경로를 Dataproc VM과 동일한 VPC에 추가합니다.

커스텀 경로 만들기

또한 Dataproc 태그를 사용하도록 파이프라인을 수정합니다. Cloud NAT가 현재 이그레스 필터링을 지원하지 않기 때문에 필요한 절차입니다. 커스텀 경로를 만들면 위 단계와 같이 Dataproc VM의 모든 공용 인터넷 트래픽이 프록시 VM 집합을 통과합니다.

다음 단계