구글 클라우드 NAT Gateway 구성하기

 
최유석

이 글에서는 구글 클라우드의 구글 컴퓨트 엔진의 VPC 네트워크 서비스와 기능 및 인스턴스, 인스턴스 템플릿과 그룹을 이용하여 NAT Gateway를 구성하는 방법에 대해서 알아보겠다. 작년에 작성했던 글(http://whitechoi.tistory.com/24)의 내용에서 주의해야 할 부분이 추가되어 새로 글을 작성하게 되었다. 이미 많은 글들을 통해 무료평가판 등록, 프로젝트 생성, 과금설정하는 부분에 대해서 언급하였다. 따라서 이러한 부분은 생략하고 NAT Gateway를 구성하는 방법에 대해서만 간략하게 설명하겠다.

이 글을 통해 구성될 NAT Gateway의 구성도이다.

 


 

VPC 네트워크 생성

다음과 같이 VPC네트워크를 맞춤설정 네트워크로 서브넷을 추가하여 새로 생성한다.

  • VPC 네트워크 이름: nat-nw
  • 서브넷(맞춤설정)          

            - 이름 : sub-asia

- 지역: asia-east1

- IP 주소 범위: 192.168.0.0/24

- 비공개 Google 액세스: 사용 설정(이 구성과 연관성은 없지만 사용하는게 보안적으로 좋음)

  • 나머지 기본값

 

방화벽 규칙 생성

다음과 같이 SSH접속을 위한 tcp 22포트, 네트워크 내부 통신을 위한 서브넷 범위의 tcp, udp, icmp 허용 규칙을 생성한다.

SSH접속을 위한 TCP 22포트 허용

  • 방화벽 규칙 이름: asia-allow-ssh
  • 네트워크: nat-nw
  • 대상: 네트워크의 모든 인스턴스
  • 소스 필터: IP 범위
  • 소스 IP 범위: 0.0.0.0/0
  • 프로토콜 및 포트(지정된 프로토콜 및 포트): tcp:22
  • 나머지 기본값

 

서브넷(sub-asia)범위의 내부통신을 위한 TCP, UDP, ICMP 허용

  • 방화벽 규칙 이름: asia-allow-internal
  • 네트워크: nat-nw
  • 대상: 네트워크의 모든 인스턴스
  • 소스 필터: 하위 네트워크
  • 하위 네트워크: sub-asia 192.168.0.0/24
  • 프로토콜 및 포트(지정된 프로토콜 및 포트): tcp;udp;icmp
  • 나머지 기본값

 

인스턴스 생성

 

다음과 같이 NAT Gateway로 사용될 인스턴스를 생성한다.

  • 인스턴스 이름: nat
  • 영역: asia-east1-a
  • 부팅 디스크: Ubuntu 14.04 LTS
  • ID 및 API 액세스: 모든 Cloud API에 대한 전체 액세스 허용
  • 네트워크 태그: nat
  • 네트워크 인터페이스

- 네트워크: nat-nw

- 하위 네트워크: sub-asia(192.168.0.0/24)

- 외부IP: nat-ip(고정 IP로 생성, 임시로 해도 무방) 

- IP 전달: 사용

  • 나머지 기본값

인스턴스 템플릿 생성

다음과 같이 인스턴스 그룹에 사용될 인스턴스 템플릿을 생성한다. 여기에서는 NAT Gateway구성만 할 예정이지만, 인스턴스 템플릿과 그룹을 이용하여 로드밸런서, 오토스케일링에 사용할 수 있는 백엔드로 사용할 수 있다.

  • 인스턴스 템플릿 이름: instance-template

 

  • 머신 유형(맞춤설정): vCPU 1개, 1GB 메모리

 

  • 부팅 디스크: Ubuntu 14.04 LTS
  • ID 및 API 액세스: 모든 Cloud API에 대한 전체 액세스 허용
  • 네트워크 태그: no-ip
  • 네트워크 인터페이스

- 네트워크: nat-nw

- 하위 네트워크: sub-asia(192.168.0.0/24)

- 외부IP: 없음

  • 나머지 기본값

인스턴스 그룹 생성

다음과 같이 인스턴스 템플릿을 사용할 인스턴스 그룹을 생성한다.

  • 인스턴스 그룹 이름: instance-group
  • 영역: asia-east1-a
  • 인스턴스 템플릿: instance-template
  • 나머지 기본값

네트워크 경로 생성

다음과 같이 NAT Gateway 구성에 사용될 네트워크 경로를 생성한다.

  • 경로 이름: nat-route
  • 네트워크: nat-nw
  • 대상 IP 범위: 0.0.0.0/0
  • 우선순위: 800
  • 인스턴스 태그: no-ip (인스턴스 템플릿에 설정한 네트워크 태그와 동일해야하며, NAT Gateway로 사용될 인스턴스와 다른 네트워크 태그이어야 한다.) 
  • 다음 홉: 인스턴스 지정
  • 다음 홉 인스턴스: nat

iptables을 이용한 NAT 설정

iptables를 이용해서 NAT 설정을 위해 VM 인스턴스 페이지의 nat(NAT Gateway 인스턴스)의 우측에 있는 SSH버튼을 클릭하여 SSH 터미널로 접속한다.

 

nat 인스턴스의 SSH에 접속하였다면, NAT 설정을 위해 다음의 명령어를 실행 한다.

$ sudo sysctl -w net.ipv4.ip_forward=1

$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

 

NAT Gateway 구성 확인하기

NAT Gateway 구성이 정상적으로 되었는지 확인하기 위해 다음의 명령어를 이용해서 인스턴스 그룹을 통해 생성된 인스턴스에 SSH로 접속한다.

$ ssh instance-group-nwb2

참고

$ ssh "인스턴스 그룹으로 자동 생성된 인스턴스 명"

NAT Gateway 구성 확인을 위한 traceroute 설치

인스턴스 그룹으로 자동 생성된 인스턴스의 SSH 터미널에서 NAT Gateway가 정상적으로 구성되고 동작되는지 확인을 위해 다음의 명령어로 traceroute를 설치한다.

$ sudo apt-get install -y traceroute

traceroute명령을 이용해서 NAT Gateway 동작 확인하기

traceroute로 외부로 나가는 네트워크 이동경로 확인을 위해 다음의 명령어를 실행한다.

$ traceroute www.google.com

* traceroute 명령을 통해 www.google.com까지 위에서 구성한 nat(NAT Gateway)인스턴스의 내부 IP를 통해서 접근하는 것을 확인할 수 있다.

* 네트워크 이동 경로를 보면 내부 IP를 통해서 이동한 것으로 확인되는데 실제로는 인스턴스의 내부IP -> 외부IP로 외부 네트워크(CF. 인터넷)와 통신하게 된다. 내부IP는 외부 네트워크와의 통신이 되지 않는다.

* NAT 구성에서 주의할 점은 백엔드로 사용 될 인스턴스(또는 인스턴스 템플릿)의 네트워크 태그와 경로에 적용할 태그가 같아야하며, NAT Gateway로 사용될 인스턴스의 태그와는 달라야 한다. 예전에는 같은 태그를 적용해도 문제 없었으나, 현재 직접 테스트를 통해 확인해보니 정상적으로 구성되지 않는다. 

참고링크

https://cloud.google.com/compute/docs/vpc/special-configurations#natgateway

 

 

 

Data Loss Prevention API 사용하기

최유석

DLP

Data Loss Prevention 또는 Data Leakage Prevention 약자로 데이터(또는 정보) 검사 또는 검열하여 지정된 보안 정책에 의해 데이터가 유출되는 것을 방지하는 기술이다이는 기업이나 공공기관등에서 솔루션의 형태로 효과적인 내부 정보 또는 개인 정보 유출에 대한 통제 기술로 활용되어 왔다.

구글 클라우드에서도 DLP기술(또는 기능)  “Data Loss Prevention API”(이하 DLP API)라는 이름으로 제공하고 있으며 텍스트 또는 이미지 에서 Sensitive(민감) 정보(전화번호, 주민등록번호, 여권, 신용카드, 이메일, ) 있는 부분을 자동으로 검사하고 수정하는 기능을 API형태로 제공한다. 기존의 DLP솔루션에 비해서 기능적인 부분은 제한될 있지만, Pay As You Go모델로 사용한 만큼에 대해서만 지불하는 가격정책으로 합리적인 비용으로 사용할 있고 REST API 제공되어 GCP 뿐만 아니라 , 모바일, IoT기기에서도 쉽게 적용할 있다.

 

 

*한국 기준으로 지원되는 데이터는 여권과 주민등록번호 2가지이다. 그러나 신용카드 정보, IP주소, MAC 주소, 전화번호 등은 국제적인 형식으로 글로벌 형태로 지원되기 때문에 적용 가능한 데이터는 더욱 많다고 있을 것이다.

 

Sensitive Data 분류 수정

DLP API는 40 이상의 사전 정의된 감지기(Detectors) 사용하여 패턴, 형식, 체크섬을 식별하여 자동으로 개인정보가 포함된 Sensitive(민감한) 데이터를 텍스트와 이미지에서 자동으로 분류하고 수정하는 기능을 제공한다. 수정된 텍스트 또는 이미지를 생성하는 기능을 제공하고 사용자가 원하는 수치의 가능도(Likelihood Scores) 임계값을 지정하여 분류된 개인정보 데이터로 발생할 있는 문제를 감소할 있다.

 

데이터 이동 최소화

데이터가 저장된 위치를 지정하여 DLP API 실행할 있기 때문에데이터에 대한 수집, 노출, 복사의 작업이 별도로 필요하지 않기 때문에 데이터의 이동을 최소화할 있고 데이터 기록, 로그 생성, 데이터 분석 작업, 등을 하기 전에 텍스트의 스트림에서 자동으로 민감한 개인정보 데이터를 분류하고 수정할 있다.

또한, DLP API 이용하면 데이터의 이동을 최소화 있기 때문에, 기업에서도 추가적인 위험없이 클라우드 데이터에 대한 관리, 분석을 있다.

 

GCPIntegration

Google Cloud Storage 텍스트/이미지,  Datastore 데이터 셋에 대해서 스캔을 지원하여 민감한 개인정보 데이터의 구성을 손쉽게 파악하여 관리를 용이하게 하고 접근 정책을 설정하는데 도움을 있다. 또한 GCP 내부에서 외부로 데이터를 전송하지 않아도 되기 때문에 속도, 보안, 비용 적인 측면에서 이점을 얻을 있다. 

 

DLP API 사용하기

지금까지 DLP 대한 대략적인 개념과 구글 클라우드에서 제공하는 DLP API 사용하면 얻을 있는 이점에 대해서 알아보았다. 이제 텍스트 (스트림 또는 파일) 이미지 파일에 DLP API 사용하는 방법에 대해서 간단한 테스트를 통해서 알아보도록 하자.

 

사전준비

프로젝트가 준비되고 해당 프로젝트의 과금 설정이 되어 있다고 가정한다. 또한, DLP API Node.js 샘플코드를 사용할 예정이기 때문에 Node.js NPM 설치되어 있는 상태라고 가정한다. 글에서는 구글 클라우드의 리소스 관리 도구 Node.js NPM 포함해서 각종 런타임과 툴이 사전 제공되는 브라우저 CLI도구인 Google Cloud Shell(https://cloud.google.com/shell/) 사용하여 테스트를 진행하겠다.

 

 

DLP API활성화

다음의 링크로 이동해서 DLP API 사용할 프로젝트를 선택하고 활성화를 진행한다.

https://console.cloud.google.com/flows/enableapi?apiid=dlp.googleapis.com 

 

Service account Key 생성 – Cloud Shell 제외한 다른 환경에서 진행

DLP API 사용하기 위해서 Service account 해당 Service account 대한JSON형식의 암호화 Key 파일을 생성하기 위해 다음 링크로 이동하여 DLP API 활성화한 프로젝트를 선택한다.

https://console.cloud.google.com/iam-admin/serviceaccounts/serviceaccounts-zero 

 

상단의 [CREATE SERVICE ACCOUNT]버튼을 클릭하여 생성할 Service account name 입력하고 JSON 형식의 Key파일생성을 위해서 Furnish a new private key] 부분에 체크하고 확장된 메뉴에서 Key type JSON으로 체크한다. 또한, 테스트 진행의 편의를 위해서 생성 Service account Role(권한) Project -> Owner(프로젝트 최상위 권한) 지정하여 Service account 생성한다. 생성한 key 파일을 GOOGLE_APPLICATION_CREDENTIALS라는 OS 환경 변수로 지정한다.

 

Node.js 샘플 다운로드 및 NPM설치

Cloud Shell 에서 다음의 명령어를 실행하여 GCP node.js샘플을 다운로드 한다.

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

 

다음의 명령어를 실행해서 node.js DLP API 샘플이 위치한 폴더로 이동한다.

cd nodejs-docs-samples/dlp/

 

NPM 모듈 설치

다음의 명령어를 실행해서 node.js DLP API 샘플을 실행하기 위한 패키지를 설치한다.

npm install

 

텍스트(스트림 또는 파일)에서 개인정보 검사하기

DLP API 테스트하기 위한 준비가 완료되었다. 이제 DLP API 샘플이 구성된 node.js 모듈을 실행해서 텍스트와 텍스트 파일에서 개인정보를 검사해보자.

 

텍스트 스트링에서 검사하기

다음의 명령어를 실행해서 스트링으로 이루어진 텍스트 데이터에서 개인정보를 검사해보자

node inspect string "검사할 텍스트 스트링"

 

이글의 작성자의 전화번호와 주민등록번호를 텍스트에 입력하고 실행한 결과 

DLP API 통해서 실제 검출된 개인정보 데이터는 정확하게 나온다. 실제 정보를 입력하였기에 자체 모자이크 처리하였다.

 

텍스트 파일에서 검사하기

간단하게 테스트를 하기 위해서 .txt 형식으로 개인정보를 입력하여 텍스트파일을 생성한다.

DLP API 실행할 샘플 파일 내용

 

다음의 명령어를 실행해서 텍스트 파일에서 개인정보 데이터를 검사해보자.

node inspect file “텍스트 파일

이글의 작성자의 개인정보(전화번호, 이메일, 주민등록번호, 신용카드번호) 텍스트에 입력하고 실행한 결과 

 

마무리

보통 솔루션의 형태로 제공되는 DLP 기능을 간단하게 API를 이용해서 사용할 수 있다는 부분만으로도 정보에 대한 관심과 중요도가 높아지고 있는 요즘,  솔루션의 형태로 제한된 범위로만 사용할 수 있는게 아니라 민감한 개인정보를 다루는 모든 경우에서 광범위하게 활용성을 높여줄 것으로 예상된다.

*

테스트 자체나 샘플이 한정되고 샘플이 문제일 수 도 있지만, 

아직은 베타단계라서 그런지 

나머지 부분에 대해서도 테스트를 진행했지만만족할만한 결과가 나오지 않아서 따로 기재하지는 않는다. 

 

참고자료

https://cloud.google.com/dlp/

https://cloud.google.com/sensitive-data-classification/demo/#/

https://en.wikipedia.org/wiki/Personally_identifiable_information

https://en.wikipedia.org/wiki/Protected_health_information

 

 


Private Google Access 적용하기

 최유석

Private Google Access?

Priavte Google Access가 적용된 서브 네트워크의 Compute Engine Instances(VM)에서 Google APIs Services에 외부(External) IP가 아닌 내부(Internal) IP로 통신해서 접근하게 된다. 이 경우 적용하지 않았을 때와 전송속도에서는 차이가 없지만, Private Google access가 지원되는 (BigQuery, GCS, Pub/Sub, )에 내부 IP를 통해 접근하게 되니, 보안상의 이점을 얻을 수 있을 것으로 예상된다. 또한, App Engine Flexible Environment  Instances(VM)에도 적용된다.

 

Private Google Access 적용 방법

Google Cloud Console에서의 Private Google Access적용 방법 

1. Networks 상세 페이지 접속


2. Subnetworks상세페이지 접속

*각각의 Subnetworks단위로 적용할 수 있다.

 

3. EDIT 

4. Private Google access (Disabled -> Enabled) 변경 후 Save

 

5. Private Google access 적용여부 확인


Google Cloud SDK에서 Private Google Access 적용 방법

gcloud beta component의 설치가 필요하다. 만약 설치되어 있지 않다면 아래 명령어로 설치한다.


gcloud components install beta

 

Private Google access 적용 명령어


gcloud beta compute networks subnets update [
서브넷명] --enable-private-ip-google-access --region [리전명]

ex) gcloud beta compute networks subnets update default --enable-private-ip-google-access --region us-central1

*해제 시에는 --enable-private-ip-google-access 옵션을 --no-enable-private-ip-google-access로 변경해서 실행하면 된다.


참고) GCP 리전 리스트

- us-central1

- europe-west1

- us-west1

- asia-east1

- us-east1

- asia-northeast1

 

Google Cloud SDK에서 Private Google Access 적용여부 확인

gcloud beta compute networks subnets describe [서브넷명] --region [리전명]

ex) gcloud beta compute networks subnets describe default --region us-central1

*privateIpGoogleAccess항목에 true가 적용, false가 해제 상태 이다. 

 

 

자세한 내용은 아래 주소를 참고

Private Google Access Overview

https://cloud.google.com/compute/docs/private-google-access

Private Google Access 구성방법

https://cloud.google.com/compute/docs/configure-private-google-access

 

구글 클라우드 사용팁

최유석

 

Compute Engine

여러 VM인스턴스에서 디스크 공유 하기

VM인스턴스들은 read-only(읽기전용) mode로 성능하락 없이 디스크를 공유할 수 있다.

read-write(읽기-쓰기) mode에서는 하나의 VM인스턴스에서만 해당 디스크를 사용할 수 있다.

 

디스크 공유하기

1.VM 상세 페이지에서 Edit를 클릭하고 Boot disk and local disk탭에서 Additional disks부분의

+Add item을 클릭한다.

 

2. Mode를  Read only로 변경하고 Name에서 Create disk를 클릭하여 디스크를 생성한다.

적당한 디스크 이름(test-disk)을 입력하고 Source type탭에서 None(blank disk)를 지정하고 

생성하기를 원하는 Size를 입력하고 Create버튼을 클릭하여 디스크를 생성한다.

 

 

*기존에 생성했던 디스크가 있다면 해당 디스크를 사용 할 수 있다. 

추가적인 disk가 없기에 새로 생성하는 방법으로 진행한다.

 

3. VM인스턴스 상세페이지에서 Save를 클릭하여 적용한다.

 

4. 읽기전용 disk를 공유하기 위해 다른 VM의 상세 페이지에서 Edit를 

클릭하고 디스크 탭으로 이동한다. 위와 마찬가지로 +Add item을 클릭한다.

5. 앞서 다른 VM에서 생성한 disk를 Name을 클릭하면 선택 할 수 있으며, 

해당 disk를 선택하고 Mode를 Read only로 지정한 후 페이지 하단의 Save를

 클릭하여 해당 내용을 저장한다.

6. 디스크 공유가 완료되었다. 디스크를 생성해서 연결한 VM과 뒤에 추가로 

같은 disk를 연결한 VM의 상세페이지에서 각각 읽기전용으로 디스크가 공유된 것을 확인 할 수 있다.

 

  • 디스크를 생성하고 연결한 VM

  • 추가적으로 디스크를 공유한 VM

같은 방법으로 다른 VM에도 추가적으로 디스크 연결이 가능하다.

 

* 주의할 점은 하나의 디스크로 각각 다른 VM에 읽기전용, 읽기/쓰기 동시 지원이 안되니 참고바란다. 

오직 디스크가 읽기전용에서만 여러 VM인스턴스에서 공유 가능하다.

* 하나의 VM에 연결 된 디스크는 읽기전용, 읽기/쓰기 모드의 상호변경이 가능하다.

 

디스크 공유하기 참고페이지

https://cloud.google.com/compute/docs/disks/add-persistent-disk

 

구글 클라우드 시작하기

구글 클라우드의 서브넷과 NAT 네트워크 구성하기

 최유석

구글 클라우드의 인스턴스(VM)과 네트워크를 활용하여 서브넷 구성으로 간단한 웹 어플리케이션을 구성해보고 그 웹 어플레케이션 서버에 NAT(Network Address Translation) Gateway를 추가하여 구성해 보도록 한다.

 

네트워크 구성요소 

 

서브넷 정의?

하나의 공공 네트워크(공인IP)를 논리적으로 분할하여 여러 개의 지역 네트워크(사설IP)로 사용할 수 있게 해주는 방법이다.

 

한정적인 네트워크 자원인 공인IP주소의 효율적인 관리 및 사용을 할 수 있게 해준다. 또한 트래픽을 분산하여 통신속도를 높이는 효과가 있으며, 네트워크를 분할 하여 독립적인 네트워크로 사용하여 보안상에서의 이점을 얻을 수 있다.

 

구글 클라우드에서 서브넷(사설IP : Internal IP)은 리전 범위에서 미리 지정된 범위에서 생성되는 자동(auto)모드와 사용자가 직접 IP범위를 지정하여 생성할 수 있는 맞춤설정(custom) 모드로 서브넷 생성이 가능하다.

 

네트워크 종류

자동(auto)모드

자동(auto)모드에서는 사전에 지정된 IP범위로 자동 생성되며 리전 당 각각 하나의 서브넷으로 구성 할 수 있다.

자동(AUTO)모드에서 사전에 지정된 범위

출처 : https://cloud.google.com/compute/docs/networking#subnet_network

 

맞춤설정(custom)모드

맞춤설정(custom)모드는 사용자가 직접 IP범위(10.0.0.0/8 또는 192.168.0.0/16이내)를 지정하여 서브넷을 구성할 수 있다.

 

레거시(Legacy) 모드 : non-subnetwork

구글 클라우드 안에서 서브넷없이 단일 IP범위로 단일 게이트웨이로 구성되는 네트워크로 모든 리전범위에 걸쳐서 사용 할 수 있다. IP주소는 전체범위로 생성되기 때문에 리전이나 존범위에서 연속적이지 않을 수 있다.

*레거시 모드의 경우 클라우드 콘솔(Web UI)로 생성 할 수 없으며, CLI 툴(Cloud SDK, SSH등)을 사용해서 gcloud명령어를 통해서 만 생성 가능하다.

 

네트워크 참고사항

Default네트워크는 자동(auto)모드로 생성되는 네트워크이다.

* 네트워크는 프로젝트당 5개까지 구성할 수 있다.

* 프로젝트당 최대 100개까지 서브넷 생성이 가능하다.

*각각의 네트워크들은 상호 변경이 불가능하며, VM인스턴스 또한 처음 생성할 때에 지정한 네트워크(Internal IP)의 경우 변경이 불가능하다.

 

NAT(Network Address Translation) Gateway

사설IP를 공인IP로 변환하여 주는 통신망의 통신 변환기이다. NAT을 사용하는 목적은 다수의 사설IP를 하나의 공인IP로 변환하여 다수의 사설IP가 하나의 공인IP를 사용할 수 있도록 함으로써 한정자원인 공인IP를 절약하는 효과가 있다. 또한 공개된 인터넷에 사설IP의 외부노출 및 직접연결을 차단하고 방화벽을 설치하여 외부공격으로부터 사용자의 통신망을 보호하는 기본적인 수단으로 활용 할 수 있다.

 

IP주소

Internal IP(내부/사설 IP) :

모든 VM은 생성 시 내부 IP를 가진다. 적용되는 IP는 위에서 설명한 서브넷(auto or custom)또는 레거시(legacy)로 지정한 IP범위를 가지게 되고 같은 네트워크 상에서는 VM인스턴스의 이름을 기반으로 내부 VM들과 통신을 한다. 외부 인터넷과의 통신이 제한된다.

 

External IP(외부/공인 IP) :

내/외부(인터넷) 통신이 가능하며, 임시(ephemeral), 고정(static), 없음(none)으로 생성 가능하다. 구글 클라우드에서 같은 네트워크가 아니더라도 VM인스턴스들은 외부IP를 통해 통신하게 되며 외부IP로 통신하더라도 구글 내부망을 이용하기 때문에 속도, 보안, 비용적인 측면에서 이점을 가진다.

 

Routes(경로)

네트워크에서 효율적인 통신을 위해서 수많은 네트워크들 중 최적의 경로를 결정하는 역할이 필요하다. 이때 필요한 것들 중의 하나가 Route이다. 이러한 Route들이 모여서 Routing Table(라우팅 테이블)이 된다.

구글 클라우드에서의 Routes란 일종의 라우팅 테이블이며 전체 글로벌 범위에서 사용 가능하다. 네트워크 생성 시 인터넷 게이트웨이와 내부 네트워크에 대한 경로는 기본적으로 생성되며, 추가적인 경로 설정을 통해 다대일(many-to-one) NAT(Network Address Translation) Gateway, VPN(Virtual Private network) Gateway 구성 등에 사용할 수 있다.

 

방화벽 규칙(Firewall-rules)

구글 클라우드 네트워크로 들어오는 모든 Inbound 트래픽에 대해서 막혀 있으며, 인바운드 허용(Inbound Allow)규칙만 생성 할 수 있다.

 

default네트워크에서 TCP 22번포트(SSH), 3389(RDP), icmp, Internal(VM간의 통신)을 제외하고 모두 막혀 있다(= 직접 서브넷이나 레거시로 구성하여 내트워크를 생성하는 경우에 방화벽 규칙이 없다.)

 

CIDR표기법과 VM인스턴스 태그를 사용한 범위로 트래픽을 제한 할 수 있다.

 

네트워크 로드밸런싱(TCP/UDP 기반)

TCP 로드밸런서는 HTTP 로드밸런서와는 다르게 리전 단위로만 사용이 가능하다. (리전간의 밸런싱은 HTTP 로드밸런서만 가능하다.) 리전 범위에서 서버의 부하를 분산하고 장애를 인지하여 밸런싱 하는L4스위치와 비슷한 기능을 가진다.

또한 pre-warming이 필요 없어서 구성 후 바로 사용 가능하다.(몇몇 클라우드 로드밸런서의 경우 갑자기 높은 부하를 주면 받아내지 못하는 경우가 있어서 미리 그만한 부하를 지속적으로 줘서 로드밸런서의 크기를 키워주는 pre-warming이 작업이 필요하다)

 

HTTP(S)로드 밸런싱도 가능하며 자세한 내용은 아래의 주소를 참고하기 바란다.

http://bcho.tistory.com/1111

http://bcho.tistory.com/1113

 

*기본적인 TCP/UDP 네트워크 로드밸런싱의 흐름

출처: https://cloud.google.com/compute/docs/load-balancing-and-autoscaling#network_load_balancing

 

프로토콜 전달(protocol forwarding)을 사용하기 위해서 전달규칙(Forwarding rule)에서 지정한 IP를 통해 요청이 들어오면 해당 요청에 대해서 처리할 수 있게 지정한 인스턴스 또는 인스턴스 풀에 전달하여 요청을 처리한다. 추가적인 옵션으로 Health check를 구성하여 주기적으로 인스턴스의 상태를 체크하고 상태가 안좋은 인스턴스의 경우 제외하는 기능을 한다.

 

리전과 존(Region / Zone)

리전은 지리적인 위치인 대륙 범위로 생각하면 될 것이다.

현재 미국 동부, 중앙과 유럽 서부와 아시아 동부 리전이 있다. 존은 각각의 리전(지역)에 실제로 위치한 데이터 센터이다.

 

 

기본적으로 구성될 구성요소들과 용어들에 대한 간단한 소개를 하였으며 이제 서브넷과 TCP로드 밸런싱을 이용해 간단한 웹 어플리케이션을 구성해보고, 추가적으로 NAT gateway구성을 해보도록 하자.

 

네트워크 및 서버 구성하기

 

구글 클라우드 가입하기

먼저 https://cloud.google.com/ 에 접속해서 Try It Free버튼을 클릭하여 로그인을 한 후, 해당되는 내용들을 입력하여 구글 클라우드 서비스에 가입을 한다.(신용카드 정보 입력 필요)

 

계정이 생성되면 자동으로 $300한도로 60일동안 사용할 수 있는 무료 평가판으로 이용 가능하다. ($300을 먼저 소모하거나 60일이 경과하면 소멸한다.)

신용 카드정보를 입력하지만 확인 용도이며, 사용자가 직접 업그레이드를 하지 않는 이상 비용이 결제 되지 않는다.

 

프로젝트 생성

구글 클라우드는 VM을 포함한 모든 서비스 자원들을 묶은 하나의 컨테이너 형태로 프로젝트라는 개념을 사용한다. 처음 무료 평가판을 등록하면 프로젝트가 없으니 새로 생성하여야 한다.

 

네트워크 생성하기

좌측 상단의 탭을 선택하고 COMPUTE부분에서 하단의 Networking을 선택하여 네트워크 메뉴로 이동한다.

 

 

 

상단의 CREATE NETWORK메뉴를 선택하고 네트워크를 생성한다.

  • Name : sub-nw
  • Subnetworks -> custom : Name : sub-asia

Region : asia-east1

IP address range : 192.168.10.0/24

 

이번 예제는 네트워크 이름 sub-nw(임의의 값)

Subnetworks에서 Custom을 선택하고 서브넷의 이름은 sub-asia(임의의 값)

Region(지역)은 asia-east1을 선택하고 범위는 192.168.10.0/24(지정가능한 범위<10.0.0.0/8 또는 192.168.0.0/16이내>에서 임의의 범위) 로 지정하였다.

 

아래와 같이 네트워크가 생성되었다.

 

간단하게 프로젝트내부의 네트워크 정보를 확인 할 수 있으며 해당 이름을 클릭하면 자세한 정보를 얻을 수 있다.

 

방화벽규칙(Firewall-rules) 생성

좌측메뉴에서 Firewall rules를 선택하면 방화벽 규칙들에 대한 정보를 얻을 수 있으며 관리를 할 수 있다. 위에 설명한대로 default네트워크를 제외하고는 내부통신을 위한 TCP, UDP, ICMP까지 모두 수동으로 생성해야 한다.

 

상단의 CREATE FIRLWALL RULE메뉴를 클릭하여 방화벽을 생성한다 

 

  • Name : asia-sub-internal
  • Network : sub-nw
  • Source filter : Subnetworks -> sub-aisa 192.168.10.0/24
  • Allowed protocols and ports : tcp;udp;icmp

 

방화벽 이름은 asia-sub-internal 으로 Network는 이전에 생성한 sub-nw 를 선택하고

Source filter는 Subnetworks를 지정해서 이전에 생성한 sub-asia를 선택한다.

Source filter의 경우 위에 설명한 CIDR범위나 인스턴스 태그를 지정하여 허용하게 할 수 있다. 또한 하단의 Target tags는 인스턴스 태그만 지정 가능하며, 지정하지 않을 경우 해당 네트워크의 모든 인스턴스에 적용된다.

Allowed protocols and ports같은 네트워크안에서 VM들의 통신을 위해 tcp;udp;icmp 를 입력하여 생성한다.

 

추가로 SSH접속을 위한 TCP 22번 포트 방화벽 생성

 

  • Name : asia-sub-ssh
  • Network : sub-nw
  • Source filter : Allow form any source (0.0.0.0/0)
  • Allowed protocols and ports : tcp:22

 

TCP 22번 포트의 경우 외부에서 SSH 접속을 위한 용도 때문에 0.0.0.0/0(모든 범위)로 생성한다.

프로젝트 환경에 맞게 지정하길 바라며 이 예제에서는 모든 범위로 지정한다.

 

VM 인스턴스 생성

좌측 상단 탭을 클릭하여 Compute Engine탭으로 이동한다.

 

상단의 CREATE INSTANCE를 클릭하여 VM을 생성한다.

 

이 예제에서는 다음과 같이 구성한다.(각자 원하는 환경으로 Machine type, Zone등은 편하게 구성해도 무방하며 리눅스 기반의 OS로 설명한다)

 

  • VM인스턴스 이름 : nat-node-as-1
  • Zone : asia-east1-a
  • Machine type: 1vCPU, 3.75 – n1-standard-1
  • Boot disk는 Change클릭하여 Ubuntu 14.04 LTS / SSD 10GB
  • Identity and API access는 default access로도 충분하지만 Full access선택
    (구글 클라우드 서비스들에 대한 VM의 액세스 범위를 지정하는 부분이다. 생성 후 에는 추후에 변경이 불가능하니 신중하게 선택해야 한다.)
  • 하단의 Management, disk, networking, SSH keys를 클릭하여 첫번째 Management탭에서 Tags를 nat-as 세번째 Networking탭에서 network는 위에서 생성한 sub-nw를 선택하고
  • Subnetwork는 역시 위에서 생성한 sub-asia 을 선택한다
  • Internal IP(내부IP)는 Automatic(자동)또는 Custom(맞춤설정)으로 직접 이전에 생성한 범위에 맞춰서 생성한 범위로 지정 가능하나, 이 예제에서는 자동으로 생성하겠다. (위에서 생성한 아시아 리전의 서브넷인 sub-asia범위로 지정한 192.168.10.0/24범위에서 자동 생성된다.)
  • External(외부IP)는 Ephemeral(임시)로 생성한다. 이후 NAT구성시 none(없음)으로 변경 예정이다.
  • 나머지 값은 기본값으로 적용하여 생성한다.

 

두번째 VM인스턴스 생성

위에서 생성한 인스턴스 nat-node-as-1이 생성되면 이름을 클릭하고 상세페이지로 들어가서 상단의 CLONE를 클릭한다.

 

 

모든 값이 동일한지 확인하고 만약 다르다면 위에서 설정한 값과 동일하게 설정하고 인스턴스 이름을

nat-node-as-2 , Zone을 asia-east1-b로 선택하여 추가로 인스턴스를 생성한다.

 

기존의 구성이 완료된 인스턴스를 복제하는 방법

먼저 복제할 인스턴스의 디스크를 이용해 Snapshots(복제본)을 만든다.

 

CREATE SNAPSHOT을 클릭하여 스냅샷을 생성한다.

 

  • Name : node-ex-my-disk
  • Source disk : nat-node-as-1
  • 나머지 : 기본값

스냅샷의 이름(임의의 값)을 입력하고 source disk를 선택(기본적으로 인스턴스 들의 이름과 동일하게 생성되어 있음)하여 생성한다.

 

그 다음 Disks 탭으로 이동하여


CREATE DISK를 클릭하여 DISK를 생성한다.

 

  • Name : node-ex-my-disk
  • Zone : asia-east1-a
  • Source type : Snapshot
  • Source snapshot : node-ex-my
  • Size : 10GB (스냅샷과 동일하게 또는 더 크게)
  • 나머지 : 기본값

디스크의 이름(임의의 값)을 입력하고 해당 DISK를 위치 시킬 Zone를 선택한다.

DISK의 경우 Zone범위의 리소스이다.

디스크 타입을 원하는 대로 선택하고 source type에서 중간의 Snapshot를 선택한다.

Source snapshot에서 앞서 생성한 스냅샷(모든 설치, 구성이 완료된 VM디스크의 스냅샷)을 선택하고 디스크 크기는 기존의 크기와 같게 또는 더 크게 생성한다.

 

스냅샷을 이용해서 디스크를 생성하고 Images탭으로 이동해서 해당 디스크에 대한 이미지를 생성한다. 이미지란 OS를 포함한 DISK를 말하며 해당 사이즈는 최소 크기이다.

 

상단의 CREATE IMAGE를 선택하여 이미지를 생성한다

 

  • Name : node-ex-my-ubunt
  • Source : Disk
  • Source disk : node-ex-my-disk (스냅샷을 통해 새로 생성한 디스크)

이미지의 이름(임의의 값)을 입력하고 소스를 DISK로 지정하고 Source disk는 앞서 스냅샷으로 생성한 디스크를 선택하여 생성을 완료한다

생성이 완료되면 VM인스턴스 생성 시 이미지(OS) 선택 부분에서 Your image탭에서 임의로 생성한 이미지를 통해 기존 VM인스턴스의 디스크를 복제한 이미지로 생성이 가능하다.

 

 

 

이 예제에서는 node.js와 MySQL을 이용해 간단한 웹 어플리케이션을 구성할 예정이다. node.js 및 MySQL설치 및 구성에 대한 자세한 설명은 생략한다.

프로그램의 기본적인 설치 후 npm express로 웹 프로젝트를 생성하고 MySQL에 입력한 값을 select query를 통해 읽어서 화면에 출력하는 웹 어플리케이션이다

 

VM인스턴스 페이지에서 해당 VM의 오른쪽에 있는 SSH 버튼을 클릭하여 터미널에 접속하여 프로그램들을 설치하고 구성한다.

 

웹 브라우저 접근을 위한 http(80포트) 방화벽 규칙을 추가한다.

  • Name : asia-sub-http
  • Network : sub-nw
  • Source filter : Allow form any source (0.0.0.0/0)
  • Allowed protocols and ports : tcp:80

 

먼저 앞서 생성한 VM의 내/외부 IP정보를 확인하자.

 

다음은 간단하게 node.js express 모듈로 웹 프로젝트를 만들고 MySQL서버에서 사전에 입력한 테이블 데이터를 가져오는 웹 어플리케이션이다.

어플리케이션이나 데이터 값이 적기 때문에 nat-node-as-1에 MySQL을 설치하고 테이블을 구성하고 값을 입력하였으며, nat-node-as-2에서는 nat-node-as-1의 MySQL DB정보를 참조하여 데이터를 읽는다.

MySQL 접속 정보이다. 인스턴스 nat-node-as-1은 자신의 DB를 사용하기 때문에 localhost로 접근하고

인스턴스 nat-node-as-2은 nat-node-as-1과 내부통신을 통해서 nat-node-as-1의 MySQL에 접근하기 위해 접속할 호스트를 nat-node-as-1의 내부IP정보(192.168.10.2)로 설정한다.


해당 웹 어플리케이션을 구동한 모습

이제 서로 다른 IP로 구성된 VM인스턴스들을 네트워크 로드밸런싱을 적용하여 하나의 IP를 사용하여 접근 할 수 있도록 하겠다.

 

네트워크 로드밸런싱 구성하기

좌측상단 탭을 이용해 네트워킹메뉴로 이동하여 좌측 중간의 로드 밸런싱 메뉴를 선택한다.

 

Create load balancer 버튼을 클릭하여 나온 3가지 메뉴 중 TCP Load Balancing에서 Start configuration을 클릭한다.

 

이름은 임의로 web-target을 입력하고

 

  • Name : web-target

 

Backend configuration

  • Region : asia-east-1
  • Backends : Select existing instances -> add an instance 

                                                                            : nat-node-as-1,nat-node-as-2

 

리전을 asia-east1을 선택하고Backends에서 기존 인스턴스를 클릭하고 Add an instance를 통해 앞서 생성한 nat-node-as-1, 2를 추가한다.

나머지 값은 기본값으로 하고 설정한다.

*Backup pool은 사전에 백업해서 구성 인스턴스 풀을 이용하여 헬스체크를 하여 장애조치를 하는 옵션이고,

Health check는 백엔드에 구성된 인스턴스의 상태를 체크하여 상태가 나쁜 인스턴스를 제외하는 기능이며,

Session affinity는 설정 옵션에 따라서 요청에 대한 처리를 지정해서 할 수 있게 하는 기능이다.

 

Frontend configuration으로 이동한다. IP의 경우 새로 고정IP를 생성하여 진행하며 포트는 80으로 설정한다.

 

 

임의로 IP 이름이 lb-ip인 고정 IP를 생성하고 선택한다.

 

  • IP : 104.155.228.179(lb-ip)
  • Port : 80

이제 기본적인 설정은 끝났으며 TCP로드밸런서를 생성한다.

Health check 생략하여 경고가 나온다. 해당 옵션은 추가가 가능하며 로드밸런서 설정이 이 가이드에서 설명하고자하는 주요내용이 아니기 때문에 이 예제에서는 생략하고 진행한다.

 

nat-node-as-1, 2 인스턴스에서 어플리케이션을 실행하고 로드밸런서의 동작을 테스트해보자. 프론트로 설정한 IP인 104.155.228.179로 접근 하면 다음과 같이 정상적으로 동작됨을 확인 할 수 있다.

 

VM인스턴스 페이지로 이동하면 앞서 생성한 VM들이 앞서 구성한TCP 로드밸런서인 web-target에 사용되고 있음을 확인할 수 있다.

 

기본적인 TCP네트워크 로드밸런싱을 적용하여 웹 어플리케이션 서버와 네트워크 구성을 완성하였다.

 

TCP네트워크 로드밸런싱을 적용한 네트워크 및 VM구성도

 

NAT를 이용하기

이제 로드밸런싱을 통해 고정IP로 접속이 가능하기 때문에 해당 VM들의 외부IP를

제거하여 외부인터넷과의 직접 연결을 차단하여 보안성을 향상 시킬 수 있다.   


앞서 설명한 것처럼 내부IP만으로는 인터넷에 접근이 안되기 때문에 이후 인터넷에

연결이 필요한 경우(추가적인 프로그램설치, 등) 에 제한이 생긴다. 따라서

현재의 보안성을 유지하고 외부 인터넷에 접근할 수 있게 하기 위해서 NAT gateway를 구성해보자.

 

외부(External IP제거)

이제 로드밸런싱을 통해 고정IP로 접속이 가능하기 때문에 해당 VM들의 외부IP를 없애고 인터넷과의 직접 연결을 차단하여 보안성을 높여보자

 

VM인스턴스의 이름을 클릭하여 상세페이지로 이동하여 상단의 EDIT를 클릭한다.

External IP부분이 선택할 수 있게 변경되며 None를 선택하고 저장한다..

nat-node-as-2도 같은 방식으로 외부IP를 제거한다.

 

아래 이미지는 외부 IP를 제거한 모습이다.

 

NAT Gateway 역할의 VM생성

VM 인스턴스 명은 nat-gw-as(임의의 값)으로 하고  나머지부분은 전체적으로  앞서  생성한 VM(어플리케이션 서버)들의 설정을 따라 구성한다.  

 

다르게 구성할 부분은 태그는 생략해도 되고,  하단의 추가 옵션부분에서 IP forwarding를 On으로 지정 하여야 한다. (해당부분을 제외하고 임의로 구성하여 생성할 수 있음)

 

*IP forwarding의 경우 최초 VM생성 시에만 적용 할 수 있다.

*일관된 기능을 위해 외부IP는 고정IP로 생성하는 게 권장되나 FREE TRIAL의 경우 리전 당 하나의 고정IP만 생성 가능하다.  

앞서 설정한 로드밸런서 생성 시에 해당 리전에서 고정 IP를 사용하였기에 임시IP로 생성한다.

 

Route 생성

앞서 설명한 것처럼, Route(경로)란 네트워크에서 통신을 위해서 필요한 경로이다. 이러한 경로에 여러가지 옵션을 적용하여 외부 인터넷과의 연결이 가능하게 할 수 있게 해주는 NAT gateway에 필요한 설정을 할 수 있다.

여기에서는 어플리케이션 역할을 하는 nat-node-as-1, 2에서 외부 인터넷으로 트래픽을 내부통신을 통해서 NAT gateway역할을 하는 nat-gw-as로 전달하고 전달받은 트래픽 요청을  nat-gw-as의 외부IP로 외부 인터넷에 접근하는 방식을 적용한다.

 

네트워크 메뉴로 이동해 Routes탭으로 이동한다.

 

CREATE ROUTE버튼을 클릭하여 route를 생성한다

  • Name : nat-route
  • Network : sub-nw
  • Destionation IP range : 0.0.0.0/0
  • Priority : 800
  • Instance tags : nat-as
  • Next hop : Specify an instance
  • Next hop instance : nat-gw-as

 

route 이름은 nat-route(임의의 값)으로 입력하고 Network는 해당 네트워크인 sub-nw를 선택한다.

Destination IP range는 0.0.0.0/0 (전체 인터넷에 접속하기 위해 제한을 두지 않음) 으로 지정하고  

Priority(우선순위) 는 800 (기본적으로 자동 생성된 route의 경우 1000)  

Instance tags(인스턴스 태그)는 앞서 nat-node-as-1, 2인스턴스 생성 시 입력한 태그인 nat-as를 입력하고  

Next hop은 Specify an instance로 변경하여 인스턴스를 NAT gateway역할을 할 VM인스턴스 인 nat-gw-as로 선택하고 생성한다.

 

iptables을 통한 NAT gateway 구성

iptables란?

리눅스에서 사용하는 방화벽을 구성하는 유틸리티이다.

 

VM인스턴스 SSH접속

VM인스턴스 페이지에서 nat-gw-as VM의 오른쪽에 있는 SSH버튼을 통해 SSH터미널에 접속한다.

 

접속 후 다음 명령어를 실행하여 IP전송을 활성화 한다

%echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

 

이후, 다음 명령어를 실행하여 마스커레이드(MASQUERADE)를 활성화하여 사설IP를 외부 인터넷과 연결 가능하게 한다. (따로 표시되는 내용 없음)

%sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

 

앞서 구성한 TCP로드밸런싱이 적용된 웹 어플리케이션 서버들에 추가적으로 구성한 NAT gateway에 대한 구성이 완료되었다.

 

NAT gateway 적용이 완료된 네트워크 및 VM 구성도

 

NAT gateway 테스트

SSH를 통해 nat-node-as-1, 2에 접속

%ssh nat-node-as-1

 

nat-node-as-2도 같은 방식으로 접속한다. 만약 권한이 부족하다고 나오면 다음 두단계의 명령어를 실행해서 접속을 시도해보고

% eval `ssh-agent`

% ssh-add ~/.ssh/google_compute_engine

만약 두번째 명령어 실행 시 해당 파일, 디렉토리를 찾지 못한다면

다음 명렁어를 실행하여 SSH 키를 생성하고 다시 시도한다

% gcloud compute ssh nat-gw-as --ssh-flag="-A" --zone asia-east1-a

 

리눅스의 router 경로추적 명령어인 traceroute를 입력하여 경로 확인하기

NAT gateway로 지정한 nat-gw-as의 내부IP인 192.168.10.4를 경유해서 www.google.com에 접속하는 것을 확인 할 수 있다.

VM인스턴스 : nat-node-as-1

VM인스턴스 : nat-node-as-2

 

기존에 외부IP를 제거하기 전 traceroute로 경로를 수집한 결과이다.

아파치 벤치마크를 이용해서 부하를 주고 테스트 해보자

100개의 클라이언트로 각각 3000개의 부하를 주었다

먼저 위에서 구성한 TCP 로드밸런싱으로 구성한 어플리케이션의 경우

% ab -n 3000 -c 100 http://104.155.228.179/

 

단일 노드(동일한 내부구성을 가진 단일 VM인스턴스를 신규 생성)

%b -n 3000 -c 100 http://104.199.169.70/

같은 zone에 생성하였기 때문에 접속시간은 거의 동일하며 서버에서 처리되는 시간과 대기시간에서 차이를 보인다. 앞서 설명한 것처럼 서브넷으로 웹 어플리케이션 서버를 구성하고, 또한  TCP네트워크 로드 밸런서를 이용하여 부하를 분산하기 때문에 나타난 결과이다.

 

서브넷을 통한 웹 어플리케이션 두대의 서버구성을 하였으며 또한 효율적인 트래픽 처리를 위해 부하를 분산하는 기능을 하는 네트워크 로드 밸런싱을 적용하였으며, 중간에 NAT gateway를 구성하여 외부 인터넷의 직접 연결을 차단하여, 보안성을 높인 구성을 하였다. 이러한 방법을 통해 웹 서버 구성을 조금 더 쉽게 할 수 있기를 바란다.

 

참고자료

https://cloud.google.com/compute/docs/networking

https://cloud.google.com/compute/docs/subnetworks

https://cloud.google.com/compute/docs/protocol-forwarding/

https://cloud.google.com/compute/docs/load-balancing/network/forwarding-rules

https://cloud.google.com/compute/docs/load-balancing/network/target-pools

https://cloud.google.com/compute/docs/load-balancing/network/

 

실습 참고 자료

https://cloud.google.com/compute/docs/load-balancing/network/example

https://codelabs.developers.google.com/codelabs/cloud-subnetworks/index.html?index=..%2F..%2Findex#0

https://codelabs.developers.google.com/codelabs/cloud-networking-101/index.html?index=..%2F..%2Findex

https://codelabs.developers.google.com/codelabs/cloud-networking-102/index.html?index=..%2F..%2Findex#0

 

 

 

구글 클라우드 시작하기

구글 클라우드 네트워크 이해하기

최유석

 

구글에 대해서 이야기를 할 때 수많은 서비스(검색, 지도, Apps, Gmail, YouTube, 등)뿐만 아니라 그러한 서비스들의 기반이 되는 수많은 데이터센터와 네트워크에 대해서 이견이 없는 한 그 어떤 기업도 따라오기 힘든 가장 강력한 인프라를 가진 회사라는 것에 대하여 인정 할 것이다. 앞서 언급한 구글의 내부 서비스뿐만 아니라 구글 클라우드에서 제공하는 네트워크 서비스에도 같은 인프라를 사용하고 있다. 이 글에서는 그러한 구글 클라우드에서 제공하는 기본적인 네트워크 서비스에 대해서 설명하고자 한다.

 

구글의 클라우드의 네트워크 인프라

구글 클라우드에 구축된 네트워크 기술인 주피터(Jupiter)는 초당 양방향 대역폭이 1페타비트 이상을 제공하며 최대 1.3Pbps을 지원한다. 메쉬구조인 클로스 토폴리지(Clos topology)를 적용하고 범용 스위치를 활용해 큰 규모의 스위치를 논리적으로 구현했다. 이를 효율적으로 제어하기 위해 중앙에서 제어하는 SDN(Software Defined Networking)을 구현했으며 오픈소스인 오픈 플로우(Open Flow)를 활용해 작동된다.

 

구글의 데이터센터들은 서로 광케이블 기반의 백본 네트워크로 묶여 있다. 또한 30개의 국가에 70개이상의 Points of presence(또는 Edge node)라고 해서 일종의 중계 서버를 배치하여 이 중계서버를 활용해 광케이블 네트워크를 사용할 수 있어서 글로벌 서비스 시에 거리에 따라 속도가 저하되는 일반 인터넷 망을 이용한 서비스에 비해 빠른 응답속도를 보장할 수 있다. (자세한 내용은 http://bcho.tistory.com/1109 참고)

 

리전과 존(Region / Zone)

리전은 지리적인 위치인 대륙 범위로 생각하면 될 것이다.

현재 미국 동부, 중앙과 유럽 서부와 아시아 동부 리전이 있다. 존은 각각의 리전(지역)에 실제로 위치한 데이터 센터이다.

네트워크의 구성요소 및 참고사항

구글 클라우드에서 내부 통신은 IPv4 유니캐스트(unicast)기반으로 통신하며, IPv6는 아직 지원되지 않는다.

 

네트워크와 프로젝트, 인스턴스의 관계

네트워크는 하나의 프로젝트안에 묶이고 하나의 프로젝트에 5개까지 생성 가능하다. 또한 VM인스턴스들은 하나의 네트워크안에 묶이고 하나의 네트워크에 다수의 VM을 연결할 수 있다.

 

VM인스턴스사이의 통신

각각의 VM들은 TCP, UDP, ICMP를 통해서만 통신한다.

 

네트워크 종류

네트워크 구성은 범위의 제약이 없는 하나의 글로벌 IP를 가지는 레거시 네트워크(legacy network) 또는 리전 범위의 서브넷(Subnet network)을 구성 할 수 있다.

 

레거시 네트워크의 경우 IP주소가 리전 또는 존 범위로 그룹화 되어있지 않다. (IP가 연속적이지 않다)

 

Legacy Networks (non-subnet) 예시

이미지 출처 : https://cloud.google.com/compute/docs/networking

 

서브넷의 경우 자동(auto)모드와 맞춤설정(custom)모드로 구성할 수 있으며 자동(auto)모드로 구성 시 미리 정의 된 IP범위(아래 이미지 참조)와 게이트웨이를 사용하여 서브넷이 구성된다.

리전 당 하나의 자동(auto)모드 서브넷 생성 가능

출처 : https://cloud.google.com/compute/docs/networking#subnet_network

맞춤설정(custom)모드로 서브넷을 구성 시에는 생성 시 리전범위에서 IP범위(10.0.0.0/8 또는 192.168.0.0/16이내)를 지정하여야 하며 0, 1또는 다수의 서브넷을 구성 할 수 있다. (프로제트 당 최대 100개)

 

Subnet network 예시

이미지 출처 : https://cloud.google.com/compute/docs/networking

 

레거시(legacy) 네트워크와 서브넷(subnet) 네트워크는 상호 변경이 불가능하다.

 

방화벽 규칙(Firewall-rules)

기본적으로 모든 Inbound(내부로 들어오는) 트래픽에 대해 막혀 있으며Allow 규칙만 생성 할 수 있다. (default네트워크의 경우 SSH연결을 위한 TCP 22번포트, RDP연결을 위한 TCP 3389포트 및 internal, icmp는 생성되어 있다)

 

IP Addresses

Internal IP : 모든 VM은 생성시 임시의 내부 IP를 가지고 있으며 이를 통해 같은 네트워크 상에서 포함된 VM인스턴스의 이름을 기반으로 내부VM들과 통신을 한다. subnet(auto/custom) 및 legacy 네트워크를 구성 시에 Internal IP에 적용된다.

아래 도식은 내부 및 외부와 통신하는 기본 구조를 나타낸 예이다.

External IP : 내부 및 외부(인터넷) 통신이 가능하며 VM생성 시에 임시(ephemeral)또는 고정(static)으로 생성하거나 없음(none)을 선택하여 외부IP(public IP) 없이 생성하고 앞서 설명한 내부IP(private IP)를 이용하여 로드밸런서를 통해 접근을 하게 하는 등의 방법을 이용하여 외부로의 접근을 차단하여 보안을 향상 시킬 수 있다. 또한 임시로 외부IP를 생성하고 고정IP로 변경도 가능하다.

 

아래 도식은 서로 다른 네트워크나 서로 다른 프로젝트에서의 VM간의 통신 예시이다.

**GCP내부에서의 서로 다른 프로젝트, 같은 프로젝트라도 서로 다른 네트워크에서 VM끼리 통신 시 External IP를 통해 통신을 하게 된다. 이 경우에도 외부 인터넷을 통하지 않고 구글 클라우드의 내부 광케이블 네트워크를 이용해서 통신하기 때문에 속도, 보안, 비용적인 부분에서의 이점을 얻을 수 있다.

 

Routes

네트워크에 연결된 글로벌 리소스이다. 각각의 VM인스턴스에 대해 읽기전용으로 생성된 라우팅 테이블이다.

VPN, many-to-one NAT, proxies구성 등에 사용된다.

 

네트워크 구성하기

가입하기

먼저 https://cloud.google.com/ 에 접속해서 Try It Free버튼을 클릭하여 로그인을 한 후, 해당되는 내용들을 입력하여 구글 클라우드 서비스에 가입을 한다.(신용카드 정보 입력 필요)

 

계정이 생성되면 자동으로 $300한도로 60일동안 사용할 수 있는 무료 평가판으로 이용 가능하다. ($300을 먼저 소모하거나 60일이 경과하면 소멸한다.)

신용 카드정보를 입력하지만 확인 용도이며, 사용자가 직접 업그레이드를 하지 않는 이상 비용이 결제 되지 않는다.

 

프로젝트 생성

구글 클라우드는 VM을 포함한 모든 서비스 자원들을 묶은 하나의 컨테이너 형태로 프로젝트라는 개념을 사용한다. 처음 무료 평가판을 등록하면 프로젝트가 없으니 새로 생성하여야 한다.

 

VM 인스턴스 생성하기 (자세한 정보는 http://bcho.tistory.com/1107를 참고)

좌측 상단의 탭을 클릭하여 Compute Engine을 선택하고 VM을 생성한다.

인스턴스이름은 net-test로 zone은 asia-east1-b로 생성하였으며, 나머지는 기본값으로 설정했다. 기본값으로 생성시 Internal IP의 경우 auto로 External IP의 경우 Ephemeral(임시)로 생성된다.

방화벽을 통해 HTTP트래픽 허용하는 부분은 인스턴스 생성 후 에도 변경가능하다.

액세스 범위(Access scopes)는 인스턴스 생성 시에만 지정할 수 있고 이후 변경이 불가능하다. 인스턴스를 사용 할 범위를 생각해서 신중하게 지정하여야 한다.

(기본적인 네트워크 구성 및 확인만 할 예정이다. 이름을 제외하고 기본값으로 선택해도 문제없다. 실제 서비스 구성을 위해 구성 시 에는 해당 서비스에 적합한 구성으로 생성하길 바란다. )

 

구글 클라우드 콘솔(Web UI)을 통해 SSH접속하기

VM생성 후 우측에 SSH버튼을 누르면 SSH에 접속된다.

 

자동(auto)모드로 서브넷 네트워크 생성하기

서브넷을 추가하기전에 다음 명령어를 통해 default로 구성된 서브넷을 확인해보면

%gcloud compute networks subnets list

리전 별로 IP범위가 지정되어 있음을 확인 할 수 있다. 또한 auto모드로 서브넷 생성 시 사전 정의된 IP범위에서 생성되며, 따로 리전과 범위를 지정할 필요 없다.

 

다음 명령어를 통해 자동(auto)모드로 서브넷을 생성한다. create 다음 auto-networks1은 서브넷 이름이니 임의로 생성해도 되며, --mode flag뒤에 auto를 지정하여야 한다.

%gcloud compute networks create auto-networks1 --mode auto

네트워크가 생성된 것을 확인 할 수 있으며, 방화벽 규칙을 생성해야 해당 네트워크를 통한 통신이 허용된다. 기본적으로 전부 막혀있다.

 

방화벽 규칙 생성 예시

%gcloud compute firewall-rules create autonet --network auto-networks1 --allow tcp:22,tcp:3389,udp,icmp --source-ranges 10.140.0.0/20

임의로 방화벽규칙명 : autonet으로 설정하였으며 프로토콜은 tcp22, 3389포트, udp, icmp를 지정하였고 IP범위를 아시아 리전의 사전 정의 범위인 10.140.0.0/20를 지정하였다. 단순 예시일 뿐이며 상황 및 조건에 따라 원하는 형태로 방화벽규칙을 생성 할 수 있다.

 

임의로 방화벽이름을 설정하고 –-network flag를 통해 네트워크를 지정하고 필요한 프로토콜 및 포트를 지정하여 방화벽규칙을 생성하면 된다. IP범위를 지정할 수 도 있다.

 

(참고 : gcloud 명령어 사용 시 다음 명령어가 기억이 안난다면 –-help를 입력하면 다음 명령어에 대한 정보를 얻을 수 있다.

예시

%gcloud –-help

%gcloud compute –-help

%gcloud compute networks –-help

경우에 따라서 –h로 입력해야 나올 수 있음)

다음 명령어를 통해 앞서 생성한 auto-networks를 확인 할 수 있다.

%gcloud compute networks subnets list –-sort-by NAME

 

맞춤설정(custom)모드로 서브넷 네트워크 생성하기

다음 명령어를 실행하여 custom네트워크를 생성한다. 앞서 생성할 때의

–-mode auto를 custom으로 변경해주고 임의의 네트워크 이름만 지정하면된다.

%gcloud compute networks create custom-network1 --mode custom

임의로 네트워크명을 custom-network1으로 지정했다.

네트워크가 생성된 것을 확인 할 수 있으며, 역시 마찬가지로 방화벽 규칙을 생성해야 통신이 가능하다.

 

사용자 정의 서브넷 구성하기 (네트워크와 헷갈릴 수 있으니 유의)

앞서 생성한 custom네트워크에 서브넷을 연결해 생성한다.

auto모드와 다르게 custom모드로 서브넷 구성 시 리전과 IP범위를 지정해야 한다.

 

%gcloud compute networks subnets create subnet-us-central-192 \

--network custom-network1 \

--region us-central1 \

--range 192.168.1.0/24

 

%gcloud compute networks subnets create subnet-asia-east-192 \

--network custom-network1 \

--region asia-east1 \

--range 192.168.7.0/24

%gcloud compute networks subnets create subnet-europe-west-192 \

--network custom-network1 \

--region europe-west1 \

--range 192.168.5.0/24

 

다음 명령어를 실행해 생성한 서브넷들을 확인 할 수 있다.

%gcloud compute networks subnets list --sort-by NAME

 

서브넷을 지정해서 인스턴스생성

%gcloud compute instances create instance1 \

--zone us-central1-a \

--subnet subnet-us-central-192

앞서 생성한 subnet-us-central-192의 IP범위 192.168.1.0/24로 Internal IP가 생성된 것을 확인 할 수 있다. (네트워크끼리 변경은 안되며, 인스턴스에 할당된 네트워크도 변경이 안됨. 신중하게 진행 해야함)

 

앞서 설명한 것처럼 레거시(Legacy) 네트워크로도 구성할 수 있으며, 각각의 환경에 따라서 필요한 네트워크를 구성해서 사용하길 바란다.

 

또한, 구글 클라우드 콘솔(브라우져)에서 좌측 상단 Networking탭으로 이동하면

네트워크와 관련한 정보들을 쉽게 확인 할 수 있다.

 

자세한 내용은 아래 페이지들 참고

https://cloud.google.com/compute/docs/networking

https://cloud.google.com/compute/docs/subnetworks

https://cloud.google.com/compute/docs/networks-and-firewalls

https://cloud.google.com/compute/docs/vm-ip-addresses

네트워크 실습 및 이해하기 좋은 페이지

https://codelabs.developers.google.com/codelabs/cloud-networking-101/index.html?index=..%2F..%2Findex#0

https://codelabs.developers.google.com/codelabs/cloud-networking-102/index.html?index=..%2F..%2Findex#0

구글 클라우드 시작하기

IAM으로 권한 설정하기

최유석 

여러 명의 사용자가 동시에 자원을 공유해서 사용해야 하는 기업 프로젝트 환경에서 리소스에 대한 접근 및 권한 관리는 선택이 아니라 필수이다. 구글의 클라우드에서 제공하는 IAM(Identity and Access Management)은 구글 클라우드 서비스들에 대한 편리하고 일관된 방식으로 통합적인 접근 제어를 제공한다.

 

IAM (Identity and Access Management) 이란?

 

구글 클라우드 서비스의 전체 리소스에 대해서 뿐만 아니라 통합적으로 사용자 또는 특정유형 별로 구글 클라우드 서비스 각각의 단위로 리소스의 접근 범위를 지정해서 해당 리소스에 대한 권한의 관리를 쉽게 할 수 있게 하는 서비스이다.

  

다른 예로, 리눅스의 Permissions은 파일, 디렉토리 단위로 적용한다면, IAM은 구글 클라우드의 서비스의 프로젝트 레벨에서의 전체 리소스 또는 세부적인 단위로 적용한다고 생각할 수 있다..

 

IAM의 필요성

예를들면, 만약에 어떤 기업에서 구글 클라우드 Compute Engine의 VM과 구글 클라우드 스토리지를 이용해서 미디어 서비스를 하고 있으며, 개발자 또는 엔지니어와 디자이너는 각각의 미디어파일과 소스코드의 정보는 공유가 필요하다면 디자이너에게 어플리케이션의 소스코드를 수정할 수 있는 권한을 줄 수도 없고 반대의 경우도 마찬가지 아닌가? 보안도 문제가 되고 안정적인 운영에도 문제가 될 수 있다. 이러한 문제들을 극복하기 위해 구글 클라우드에서 제공하는 권한 제어 서비스가 IAM이다.

 

먼저 구글 클라우드 IAM에서 권한을 부여할 수 있는 유형은 다음과 같다.

  • Google account
  • Service account
  • Google group
  • Google Apps domain
     

IAM 기본 유형 별 정의

 

먼저 구글 계정은 gmail계정이다. (예 : test@gmail.com)

 

다음으로 서비스 계정은 구글 클라우드 서비스에 대한 ID이며 하나의 ID로 다른 구글 클라우드 서비스에 접근할 수 있도록 해주는 이메일 형태의 계정이다. IAM관리 페이지에서 추가로 생성 가능하다. (기본 GCE, GAE 서비스 ID제공)

(예 : <project_id or project number>@developer.gserviceaccount.com 형식이며,

Test-1234@appspot.gserviceaccount.com – project_id 형식,

1234567891011-compute@developer.gserviceaccount.com – project-number 형식)

 

마지막 구글그룹과 구글앱스 도메인은 지정하게 될 경우 해당 모든 구성원에게 권한이 부여된다.

구글그룹 - (예 : test@googlegroups.com) / 구글앱스 도메인 – (예 : test-company.com)

 

* 프로젝트의 식별자로 Project Name, ID, Number 세가지 제공되며 Unique한 값으로 생성하여야 하며 Number는 자동으로 부여된다. Project ID의 경우 APP Engine의 어플리케이션 ID로도 사용되며 프로젝트 삭제 시 다시 같은 ID로 생성할 수 없다.

 

구글 클라우드 IAM은 단순하며 유연한 역할을 제공한다.

기본적인 역할 모델로 보면 다음과 같다.

  • Viewer
  • Editor
  • Owner

먼저 뷰어는 말그대로 구글 클라우드 리소스를 보는 권한만 부여된다.

 

편집자는 보기 권한 + 리소스의 생성/삭제/변경이 추가된다.

 

마지막으로 소유자는 앞의 모든 권한을 가지면서 프로젝트 멤버 및 프로젝트 자체를 관리(추가/삭제)할 수 있는 권한이 부여된다.

*프로젝트 최초 생성시에 소유자레벨의 권한이 부여되어 있다.

 

*기본적인 역할 외에 프로젝트 레벨에서Service Account Actor가 있는데

서비스 별 세분화 한 역할을 지정하여 사용시에 서비스계정의 정보를 획득하고

인증 시 사용하여 보안성을 높인다. (서비스 단위로 권한 적용시 동시 사용)

 

추가적으로 결제와 관련한 부분은 Billing administrator(결제 관리자)를 통해 관리된다. 처음 프로젝트 생성 시에 소유자로 지정되어 있으며 리소스에 대한 권한은 제한된다.

 

IAM설정 방법은 매우 단순하다.

설명을 위해 임의로 프로젝트를 생성하여 진행한다.

예시 프로젝트 명 : iamtest / 프로젝트ID : iamtest-1341

프로젝트 소유 계정 : namu.test1@gmail.com

추가권한 부여 계정 : namu.test2@gmail.com

(만약 기존 프로젝트가 없다면 새로 생성한다. 프로젝트 생성 방법의 자세한 내용은 http://bcho.tistory.com/1107 참고)

 

 

좌측 상단 탭을 이용해서 IAM페이지로 이동한다.

 

먼저 IAM페이지에서 멤버를 추가하려면 ADD MEMBER를 클릭 한다.

Name에 추가하려는 계정 명을 넣고

 

부여하려는 권한 레벨을 선택하고 ADD버튼을 누르면 추가가 완료된다. .

Viewer권한을 가진 멤버의 추가가 완료된 모습이다.

 

추가한 계정(namu.test2@gmail.com)에서 접속한 모습이다. 해당 계정은 이제 프로젝트 iamtest의 리소스를 확인 할 수 있다.

   

프로젝트 소유 계정으로 임의로 인스턴스 생성 후, VM인스턴스 페이지를 확인한 모습이다.

 

비교를 위해 뷰어 권한을 받은 계정으로 접속한 모습이다. 리소스를 변경할 수 있는 권한이 없어서 인스턴스 및 그룹 생성, SSH접속 등이 비활성화 되어있다.

 

임의로 생성한 VM의 상세페이지에서도 VM인스턴스에 대한 조작이 비활성화 되어있다. 이렇듯 리소스에 대한 정보 확인만 가능하다.

 

기본적인 역할 Owner, Editor, Viewer는 프로젝트 전체 리소스에 대해서 적용된다.

 

 

구글 클라우드에서는 앞서 설명한 것처럼 아래와 같이 서비스별로 세분화된 제어도 제공한다.

 

(이미지 출처: https://cloud.google.com/iam/docs/overview)

 

프로젝트 레벨에서의 권한제어를 각각의 서비스 모듈 별로 할 수 있게 확장된 것으로 볼 수 있으며, 이러한 서비스 모듈 별 세부적인 적용을 통해서

전체 프로젝트 리소스 관리의 부담을 줄일 수 있다.

 

자세한 내용은 https://cloud.google.com/iam/docs/를 참고

+ Recent posts