Cloud/GCP

[GCP] On-Premise to GCP SaaS서비스를 VPN(Privat망)으로 연결하여 사용

달빛궁전- 2024. 3. 26. 16:40
배경 : 
On-Premise에서는 외부, 내부 경계가 명확합니다. Cloud는 VPC로 구획을 나누기는 하지만, iaas외 SaaS는 자체 제공하는 서비스이기 때문에, Public망으로 서비스를 제공받게 됩니다.
물론 CSP에서는 안전하다고는 하나, Public 구간에서의 문제는 사용자의 책임입니다.
목적 : 
GCP의 Managed Service (SaaS)를 Public 망으로 접속하여 사용하는 것이 아니라 VPN, Cloud Interconnect로 연결 후  Private망으로 GCP로 접속 후 Private Service Connect를 통해  보안성을 향상하여 접속하는 방안으로  보안성을 향상하는 방안을 작성합니다.

 


내용 : 
이번 문서 작성시에는 On-Premise와 GCP를 연결 하여 테스트 하였지만, AWS to GCP, Azure to GCP도 가능합니다.
반대인 GCP to AWS는 아래의 문서를 참고해주세요.
https://seonggi.kr/214

 

[AWS] S3 (SaaS 서비스)를 DX, VPN (private)망으로 사용

개요 사무실, IDC에서 public망이 아닌 DX, VPN망을 이용하여 S3를 사용하기 위한 방안작성 입니다. S3외에도 DynamoDB 같은 SaaS형 서비스에는 적용됩니다. 일반적으로 iaas 서비스는 VPN을 구성하면 그것

seonggi.kr

Private Service Connect서비스는 사용자가 VPC내부에서 비공개로 GCP의 관리형 서비스로 액세스할 수 있도록 해주는 제품이며, Google Cloud Networking 기능입니다.
이하 문서에서는 약자인 PSC로 표기하겠습니다.
상세설명은 아래 링크를 참고해주세요.
https://cloud.google.com/vpc/docs/private-service-connect?hl=ko

 

Private Service Connect  |  VPC  |  Google Cloud

Private Service Connect를 사용하여 내부 IP 주소로 VM에서 Google API 및 서비스에 액세스합니다.

cloud.google.com

 

전체구성도

 

데이터의 흐름은 다음과 같습니다.
  1. Server에서 Google Cloud Storage 서비스를 사용하기 위해 해당 storage주소를 내부 DNS에 질의합니다.
  2. 내부 DNS에서는 googleapis.com으로 질의가 왔으므로, GCP DNS에 가서 해당 주소를 질의합니다.
  3. GCP Cloud DNS에서는 googleapis.com으로 질의가 왔을 때 PSC로 안내되도록 되어있습니다.
    Server는 최종적으로 PSC의 주소를 회신 받습니다.
  4. Server가 PSC로 storage 호출을 하게되고, PSC는 해당되는 Cloud Storage로 연결합니다.
  5. 이 모든 과정은 Public망이 아닌 Cloud VPN or Cloud Interconnect로 연결되어, Private망으로 데이터를 주고 받습니다.
이번 실습시 구성도는 간단하지만,  준비해야될 것과 유의사항이 있습니다.
유의사항으로는 On-Premise에서 VPN은 보통 장비를 사용합니다. 저의 경우에는 장비가 없기 때문에 서버에 오픈소스인 strongSwan을 사용했습니다.

해당 오픈소스로는 설정할 것이 꽤 많기 때문에 다른 GCP 프로젝트나 AWS, Azure를 사용하는 방안도 있습니다.
이번 주제는 GCP와 VPN, Interconnect로 연결 후를 상정하였기 때문에 VPN 설정은 제외하고 넘어가겠습니다.
  • 실습 구성사항
On-Premise Network : 192.168.1.0/24
GCP VPC Network : 10.10.10.0/24
GCP PSC Network : 10.10.100.0/24
GCP PSC IP : 10.10.100.100/32
  • 참고
    strongSwan 설정파일 (/etc/ipsec.conf)
seonggi@seonggi-ThinkCentre-M72e:~$ sudo cat /etc/ipsec.conf
conn gcp_to_onpremise
    keyexchange=ikev2
    authby=secret
    type=tunnel
    left=%defaultroute
    leftid=192.168.1.190 // On-premise VPN IP
    leftsubnet=192.168.1.0/24 // On-premise 영역
    right=34.22.89.130 // GCP VPN Public IP
    rightsubnet=10.10.10.0/24, 10.10.100.0/24 // GCP영역
    auto=start
    dpdaction=hold
    dpddelay=20s
    dpdtimeout=300s
 
  • 사전준비
    GCP와 Site To Site VPN이 가능하도록 설치, 설정
    DNS 설정 : googleapis.com 을 GCP DNS에 질의할 수 있도록 내부 DNS 설치, 설정 필요
  • On-Premise
서버에 DNS역활을 주기 위하여 아래의 Bind9 패키지를 설치합니다.
bind9만 설치해도 사용에는 문제 없습니다.
  • bind9 - BIND 9 DNS 소프트웨어.
  • bind9utils - BIND 9 작업을 편리하게 도와주는 유틸리티
패키지 설치는 아래 명령어를 사용합니다. 
apt install bind9 bind9utils
 
  • DNS (Bind 설정)
sudo vi /etc/bind/named.conf.default-zones 
설정파일은 bind 버전에 따라 다를 수 있으므로, 확인이 필요합니다.
위 파일을 아래와 같이 수정합니다.
zone "googleapis.com" {
        type forward;
        forward only;
        forwarders {
        10.10.10.2; // GCP DNS IP
        };
};
 
설정이 완료되었다면, dns 서비스를 재기동하고 서비스 여부를 확인합니다.
sudo service bind9 restart
sudo service bind9 status
 
이제 해당 서버를 DNS로 사용하게 되면 “googleapis.com”을 질의 하였을때 GCP DNS로 질의하게 됩니다.
이외 도메인은 기본 설정된 대로 자기자신의 정보나 외부의 DNS서버로 질의 후 리턴하게 됩니다. 
  • GCP 설정
GCP 설정은 크게 VPN설정, PSC설정으로 나뉩니다.

 

  • PSC설정
메뉴 : 네트워크 서비스 > Private Service Connect 선택
 
PSC 생성

 

 
대상
서비스를 연결할 부분을 정의합니다.
모든 Google API : RDS, Bigquery, Storage GCP의 모든 관리형 서비스를 제한 없이 연결합니다.
VPC-SC : VPC 서비스 제어로 서비스의 경계를 나누고, 권한을 준 상태로 연결합니다.
게시된 서비스 : 각 GCP의 관리형 서비스를 지정하여 해당 서비스만 사용할 수 있도록 합니다. 추가적으로 VPC내 네트워크도 지정할 수 있습니다.
본 문서에서는 “모든 Google API”로 선택합니다.
네트워크는 PSC와 연결될 VPC를 선택합니다.
그리고 PSC의 IP를 지정합니다.
  • Cloud DNS
PSC의 IP주소를 생성 하였으니 이제 On-Premise DNS에서 GCP DNS로 질의 하였을때 PSC IP주소를 알려줄 수 있도록 설정을 진행합니다.
메뉴 : 네트워크 서비스 > Cloud DNS 선택
 
Pravate DNS생성
내부 VPC에서 사용될 DNS이기 때문에 비공개 (private)로 선택합니다.
영역이름은 알기 쉽도록 표기합니다.
본 문서에서는 “googlgapis-com”으로 표기하였습니다.
DNS 이름은 외부에서 해당 DNS 네임으로 질의시 동작 되므로 관리형 서비스를 호출하는 “googleapis.com”을 입력합니다.
설명은 누가봐도 어떤 목적을 가지고 리소스를 만들었는지 알기 쉽도록 작성을 해야 관리하기가 편합니다.
옵션은 기본값인 비공개로 설정합니다.
 
네트워크는 On-premise와 연결된 VPC와 프로젝트를 선택합니다.
 
 
DNS 세부 영역 설정
이제 “googleapis.com” DNS영역이 생성되었습니다.
세부정보로 들어가서 “CNAME”, “A”레코드를 각각 추가합니다.
A 레코드 : PSC IP
CNAME : *.googleapis.com → googleapis.com 레코드​

 

이제 Cloud DNS에 설정된 VPC에서 “googleapis.com”으로 질의가 오면, PSC IP로 가도록 회신을 주게 됩니다.
 
GCP DNS IP 설정
 
레코드를 생성하였으니 이제 GCP DNS의 IP를 설정해야됩니다.
On-Premise DNS가 어디로 찾아갈 지는 알려주어야 하죠.

“다음에서 사용 중" 탭을 선택하고 네트워크 추가를 선택합니다.

VPN으로 연결된 VPC를 선택하고 추가하게 되면 위 화면과 같이 수신 쿼리 전달 IP라는 GCP Cloud DNS의 IP가 생성 됩니다.
해당 DNS IP를 On-Premise DNS에 googleapis.com 쿼리에 질의할 수 있도록 적용합니다.
Cloud DNS설정이 마무리 되었습니다.
이제 VPN을 통해 On-Premise 네트워크가 접근하면, PSC대역을 알려주어야 합니다. 
On-Premise ↔ VPN 서로 양단의 네트워크 대역대는 알고 있어서 통신이 되지만, PSC는 전혀 다른 대역이기 때문입니다.
라우터로 On-Premise에서 온 패킷들이 PSC를 갈 수 있도록 라우터 설정을 진행합니다.

VPN을 생성할 때 필수로 생성되어야 하며, 먼저 만들던가 VPN생성 이후 설정을 변경해도 전혀 상관없습니다.
메뉴 : 네트워크 연결 > Cloud Router
 
라우터에서 PSC 대역을 추가합니다.
 
Cloud Router에 표시되는 모든 서브넷 공지에 체크하며
(이렇게 설정해야 Router에 적용된 모든 서브넷이 광고됩니다.)

커스텀경로를 생성 > PSC대역을 추가합니다.
문서에서는 PSC 대역이 "10.10.100.0/24" 이므로 그렇게 추가하였습니다.
이제 모든 설정이 마무리 되었습니다.
 
  • 테스트
VPN연결 하기 전에 Public 망을 사용한다면 아래와 같은 결과가 나옵니다.
public망을 이용하였을때
On-Premise Client에서 “googleapis.com” 질의시 Public IP인 142.~ 대역이 조회되며, gsutil로 storage를 조회시 정상적으로 출력됩니다.
 
모든 설정을 다 진행 후 다시 진행해보겠습니다.
On-Premise에서 “googleapis.com”을 조회합니다.
 
 
이제 VPN연결이 되어서 GCP 대역과 Private통신 중이며, “googleapis.com”은 forward 설정을 해두었기 때문에 DNS서버가 GCP DNS서버인 “10.10.10.2”으로 되어있음을 확인되며, 도메인에 대한 IP값은 PSC IP인 “10.10.100.100”인 것을 확인 할 수 있습니다.
 
private망을 사용했을 때

 

해당 상태에서 gsutil로 storage 조회시 정상적으로 조회됨을 알 수 있습니다.
이제 public망이 아닌 VPN, Cloud Interconnect를 통해 Storage로 접속하였습니다.
 
참고

 

 

AWS — GCP간 VPN 연결을 통해 보안을 강화하고 비용을 절감하는 방법 — (2) GCP Private Service Con

이전 블로그에서 AWS — GCP간 VPN 연결 방법에 대해서 소개했습니다. 하지만 VPN 연동만 했다고 바로 NAT Gateway를 타고 나가던 트래픽이 VPN 구간으로 이동하는 것이 아닙니다. IP기반으로 네트워

medium.com