구글 클라우드 시작하기

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

 

 

 

+ Recent posts