이 글에서는 구글 클라우드의 구글 컴퓨트 엔진의 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 터미널로 접속한다.
* 위 traceroute 명령을 통해 www.google.com까지 위에서 구성한 nat(NAT Gateway)인스턴스의 내부 IP를 통해서 접근하는 것을 확인할 수 있다.
* 네트워크 이동 경로를 보면 내부 IP를 통해서 이동한 것으로 확인되는데 실제로는 인스턴스의 내부IP -> 외부IP로 외부 네트워크(CF. 인터넷)와 통신하게 된다. 내부IP는 외부 네트워크와의 통신이 되지 않는다.
* NAT 구성에서 주의할 점은 백엔드로 사용 될 인스턴스(또는 인스턴스 템플릿)의 네트워크 태그와 경로에 적용할 태그가 같아야하며, NAT Gateway로 사용될 인스턴스의 태그와는 달라야 한다. 예전에는 같은 태그를 적용해도 문제 없었으나, 현재 직접 테스트를 통해 확인해보니 정상적으로 구성되지 않는다.
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 주소, 전화번호등은국제적인형식으로글로벌형태로지원되기때문에적용가능한데이터는더욱많다고볼수있을것이다.
상단의[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의환경변수로지정한다.
보통 솔루션의 형태로 제공되는 DLP 기능을 간단하게 API를 이용해서 사용할 수 있다는 부분만으로도 정보에 대한 관심과 중요도가 높아지고 있는 요즘, 솔루션의 형태로 제한된 범위로만 사용할 수 있는게 아니라 민감한 개인정보를 다루는 모든 경우에서 광범위하게 활용성을 높여줄 것으로 예상된다.
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의 설치가 필요하다. 만약 설치되어
있지 않다면 아래 명령어로 설치한다.
맞춤설정(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이 작업이 필요하다)
프로토콜 전달(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까지 모두 수동으로 생성해야 한다.
방화벽 이름은 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도 같은 방식으로 접속한다. 만약 권한이 부족하다고 나오면 다음 두단계의 명령어를 실행해서 접속을 시도해보고
같은 zone에 생성하였기 때문에 접속시간은 거의 동일하며 서버에서 처리되는 시간과 대기시간에서 차이를 보인다. 앞서 설명한 것처럼 서브넷으로 웹 어플리케이션 서버를 구성하고, 또한 TCP네트워크 로드 밸런서를 이용하여 부하를 분산하기 때문에 나타난 결과이다.
서브넷을 통한 웹 어플리케이션 두대의 서버구성을 하였으며 또한 효율적인 트래픽 처리를 위해 부하를 분산하는 기능을 하는 네트워크 로드 밸런싱을 적용하였으며, 중간에 NAT gateway를 구성하여 외부 인터넷의 직접 연결을 차단하여, 보안성을 높인 구성을 하였다. 이러한 방법을 통해 웹 서버 구성을 조금 더 쉽게 할 수 있기를 바란다.
구글에 대해서 이야기를 할 때 수많은 서비스(검색, 지도, 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범위(아래 이미지 참조)와 게이트웨이를 사용하여 서브넷이 구성된다.
맞춤설정(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을 포함한 모든 서비스 자원들을 묶은 하나의 컨테이너 형태로 프로젝트라는 개념을 사용한다. 처음 무료 평가판을 등록하면 프로젝트가 없으니 새로 생성하여야 한다.
임의로 방화벽규칙명 : 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
여러 명의 사용자가 동시에 자원을 공유해서 사용해야 하는 기업 프로젝트 환경에서 리소스에 대한 접근 및 권한 관리는 선택이 아니라 필수이다. 구글의 클라우드에서 제공하는 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 형식이며,
* 프로젝트의 식별자로 Project Name, ID, Number 세가지 제공되며 Unique한 값으로 생성하여야 하며 Number는 자동으로 부여된다. Project ID의 경우 APP Engine의 어플리케이션 ID로도 사용되며 프로젝트 삭제 시 다시 같은 ID로 생성할 수 없다.
구글 클라우드 IAM은 단순하며 유연한 역할을 제공한다.
기본적인 역할 모델로 보면 다음과 같다.
Viewer
Editor
Owner
먼저 뷰어는 말그대로 구글 클라우드 리소스를 보는 권한만 부여된다.
편집자는 보기 권한 + 리소스의 생성/삭제/변경이 추가된다.
마지막으로 소유자는 앞의 모든 권한을 가지면서 프로젝트 멤버 및 프로젝트 자체를 관리(추가/삭제)할 수 있는 권한이 부여된다.
*프로젝트 최초 생성시에 소유자레벨의 권한이 부여되어 있다.
*기본적인 역할 외에 프로젝트 레벨에서Service Account Actor가 있는데
서비스 별 세분화 한 역할을 지정하여 사용시에 서비스계정의 정보를 획득하고
인증 시 사용하여 보안성을 높인다. (서비스 단위로 권한 적용시 동시 사용)
추가적으로 결제와 관련한 부분은 Billing administrator(결제 관리자)를 통해 관리된다. 처음 프로젝트 생성 시에 소유자로 지정되어 있으며 리소스에 대한 권한은 제한된다.