구글 클라우드 시작하기

구글 클라우드의 서브넷과 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