1. AWS GWLB (Gateway Load Balancer) 란?
AWS 의 GWLB (Gateway Load Balancer) 는 네트워크 트래픽을 다루는 다양한 여러 업체의 가상 어플라이언스 들을 쉽고 비용 효율적으로 배포, 확장 그리고 관리 해주는 완전 관리형 서비스입니다. 예를 들어, 컨트롤 플레인 (Control Plane) 과 데이터 플레인 (Data Plane) 이 별도로 존재하는 방화벽이나 SD-WAN 과 같은 일종의 SDN (Software-Defined Networking) 환경을 구축/운영하고자 하는 경우, 다음과 같이 (1) 직접 구성하고 관리 해야 했던 기존 환경과 (2) 완전 관리형 기반의 GWLB 환경을 비교할 수 있습니다.
** 참고> 2021년 2월 현재 AWS GWLB 를 이용할 수 있는 가용한 리전들은 다음과 같습니다 : 미국 동부(북부 버지니아), 미국 서부(오레곤), EU(아일랜드), 남아메리카(상파울루), 아시아 태평양(시드니)
** 참고> 2021년 3월 현재 서울 리전을 포함하여 AWS GWLB 를 이용할 수 있는 가용한 리전들이 다음과 같이 추가되었습니다 : 미국 동부(오하이오), 아시아 태평양(도쿄) 및 EU(프랑크푸르트 및 스톡홀름), 미국 서부(캘리포니아 북부), EU(런던), EU(파리), EU(밀라노), 아프리카(케이프타운), 중동(바레인), 아시아 태평양(홍콩), 아시아 태평양(싱가포르), 아시아 태평양(뭄바이), 캐나다(센트럴), 아시아 태평양(오사카), 아시아 태평양(서울)
(1) 기존의 환경
– 관리자가 AWS 내로 유입되는 모든 트래픽이 먼저 방화벽을 거친 다음 내부로 분산하여 전달되는 구조를 구성해야 한다고 가정해보겠습니다.
– 이 때, 사용자는 직접 VPC (Virtual Private Cloud) 에 IGW (Internet Gateway), VGW (Virtual Private Gateway) 등을 구성합니다. 이 후 방화벽 등의 기능 (예> 트래픽을 분석, 차단 처리) 을 하는 EC2 인스턴스를 생성하고, 이 인스턴스에서는 수행하는 기능에 따라 특정 트래픽이 지정되는 라우팅으로 흐르도록 합니다. 특히 VPC 에서 Ingress Routing 을 사용하여 IGW, VGW 를 거쳐 들어오는 VPC 트래픽에 대해 라우팅 테이블을 적용하여 VPC 내에 있는 해당 인스턴스로 경로를 통하도록 합니다.
– 위와 같은 환경을 직접 구성 및 관리하는 경우, 일일이 구성을 하기가 어렵고 번거로울 뿐 만 아니라 고가용성과 확장성을 확보하기는 어렵습니다. 또한 트래픽의 부하를 처리하기 위해 사용자가 직접 어플라이언스를 스케일아웃 (Scale-out) 하거나 다른 도구 등을 사용해야 합니다. 이 경우, 비용과 시간이 비교적 많이 소요될 수 있습니다.
(2) GWLB 의 환경
– GWLB 는 VPC 로 들어오는 트래픽들을 관리자가 설정한 VPC 의 라우팅 테이블에 따라 방화벽 역할을 수행하는 가상 어플라이언스들로 보낸 후 방화벽 정책에 따라 돌아오는 트래픽들을 지정된 라우팅으로 전달합니다.
– 방화벽 어플라이언스들을 트래픽에 따라 탄력적으로 확장/축소해주기도 합니다.
– GWLB 는 트래픽 흐름을 정상 가상 어플라이언스를 통해 라우팅이 되도록하여 가용성을 확보합니다.
– 요약해서, GWLB 는 네트워크 게이트웨이 (트래픽이 오고가는 단일지점), 로드밸런서, 가상 어플라이언스들에 대한 오토 스케일링 그리고 VPC 엔드포인트 (예> AWS PrivateLink) 와 같은 역할을 동시에 완전 관리형 서비스로 지원 및 수행합니다.
아래 예시의 구성과 같이 VPC 1 의 고객과 VPC 2 의 다른 고객 또는 사용자가 인입되는 트래픽에 대해 방화벽 정책을 적용받아야 하는 경우를 가정해보겠습니다.
1) 외부에서 트래픽이 인입되는 경우, GWLBe (Gateway Load Balancer Endpoint) 로 트래픽 도달
2) 라우팅에 따라 GWLBe 는 GWLB 로 트래픽 전달
3) GWLB 는 하위 레벨에 있는 방화벽 어플라이언스로 로드밸런싱 하여 트래픽을 전달
4) 방화벽 어플라이언스에서 트래픽에 대한 보안 기능 수행 (예> 필터링 등) – 방화벽 어플라이언스들은 탄력적으로 확장/축소
5) 반환되는 정상 트래픽은 GWLB 로 다시 전달
6) GWLB 는 GWLBe 로 트래픽 다시 전달
7) GWLBe 는 내부 VPC 로 트래픽 전달
8) 이 후 설정된 라우팅에 따라 최종 목적지까지 트래픽 전달
(3) 아키텍처 패턴
위와 같은 예제 구성도 이외에도 상황이나 요구 사항에 맞게 다음과 같은 다양한 아키텍처 패턴들을 구성할 수 있습니다.
– 단일 VPC 와 상위/하위 네트워크 연결 구조 (예> 단일 VPC 가 외부 인터넷 환경과의 연결 시) : 이 구성에서는 방화벽 또는 인라인 기능이 VPC 내부의 리소스와 VPC 외부의 인터넷 사이에 위치하고 있는 형태를 보여줍니다. 이 모델에서는 컨트롤 플레인을 중앙 집중화 또는 분산형으로 관리하고, 별도로 분리된 데이터 플레인을 각각 유지보수 할 수 있는 유연성을 확보할 수 있습니다.
– 단일 VPC 와 상위/하위 네트워크 연결 구조 (예> 단일 VPC 가 외부 인터넷 환경과의 연결 시) : 이 구성에서는 다른 여러 VPC 들이 AWS Direct Connect, VPN 과 같은 서비스들을 거쳐 AWS Transit Gateway 를 통한 후 GWLB 에 연결된 어플라이언스를 거쳐 외부 인터넷 환경과의 연결에 중점을 둡니다.
** Geneve (Generic Network Virtualization Encapsulation) 프로토콜 (RFC 문서 참고 : https://www.rfc-editor.org/rfc/rfc8926.html)
네트워크 가상화는 여러 소프트웨어, 하드웨어 엔드포인트, 전송 구간, 중앙화된 컨트롤 플레인/클러스터 등을 포괄적으로 조합하여 동작하게 됩니다. 따라서 서로 다른 요소들을 결합해야 하므로, 터널링에서는 관계된 모든 구성 요소가 서로 영향을 받게 됩니다. 이에 유연성은 이러한 구성을 가능하게 해주는 가장 중요한 개념입니다.
Geneve 프로토콜이란, 이러한 네트워크 가상화를 가능하도록 지원하는 네트워크 프로토콜입니다. GWLB 는 Geneve 라는 프로토콜을 이용하여 서로 다른 VPC 에 있는 GWLB (예> 어플라이언스들을 연결해주는 로드밸런서) 와 GWLBe (Edge) 들을 연결해 주고 있습니다. Geneve 프로토콜은 기본적으로 UDP 포트번호 6081 번을 사용합니다. 패킷 상세를 보면, VxLAN 에서는 VNI (VxLAN Network Identifier) 외에 특별히 알아야 할 필드 들이 없었다면, Geneve 에서는 VNI 외에도 TLV (Type-Length-Value) 를 추가하여 필요한 기능을 확장할 수 있게 합니다.
2. GWLB 구성 해보기 (https://www.youtube.com/watch?v=MNQyvr9NcrA)
다음과 같은 예제의 아키텍처 그림과 같이 GWLB 와 관련된 어플라이언스, 인스턴스 등을 크게 아래의 순서와 같이 구성해보도록 하겠습니다. (요약 : 자신의 VPC 와 보안 어플라이언스 기능을 제공하는 파트너 VPC 를 바탕으로 GWLB 구성)
1) AWS Marketplace 를 통해 파트너의 가상 어플라이언스 배치
2) 어플라이언스 인스턴스를 자신의 VPC 에서 실행
3) GWLB 및 어플라이언스 인스턴스를 위한 타겟 그룹을 생성
4) 트래픽을 검출하기 위한 GWLBe 생성
5) GWLBe 로 트래픽을 보내기 위한 라우팅 테이블 업데이트
** GWLB 설정을 제외한 나머지 (VPC, EC2 Instance, 라우팅 테이블 등) 는 이미 설정 및 구성이 완료되어 있다고 가정합니다.
(1) AWS Management Console 에서 EC2 의 Load Balancers 로 이동한 후 ‘Create Load Balancer’ 를 클릭합니다.
(2) Gateway Load Balancer 의 ‘Create’ 버튼을 클릭합니다.
(3) Gateway Load Balancer 의 이름을 입력하고 VPC 와 서브넷을 선택한 다음, 가용 영역을 지정합니다. 이 후 ‘Next: Configure Routing’ 을 선택합니다.
(4) 라우팅을 할 대상 그룹을 설정해 줍니다. 기본적으로 GWLB 는 위에서 설명한 것과 같이 Geneve 프로토콜과 6081 포트를 사용하여 설정되는 대상 그룹으로 요청을 라우팅 처리합니다. 설정 완료 후 ‘Next: Register Targets’ 를 클릭합니다.
(5) 다른 계정의 VPC (예> 파트너의 계정) 에 있는 타겟 (예> 인스턴스) 들을 등록합니다. 이 후 ‘Next : Review’ 를 클릭하고 다음 화면에서 ‘Create’ 를 클릭합니다.
(6) 설정이 완료되면, 가상 어플라이언스 소프트웨어가 동작되는 EC2 인스턴스의 보안 그룹을 구성 합니다. 일반적으로 GWLB 에서 트래픽을 가져오는 용도의 Geneve 프로토콜 (포트 번호 UDP 6081) 과 상태 검사 용도의 HTTP 프로토콜 (포트 번호 TCP 80) 을 추가합니다.
(7) 클라이언트에 송/수신되는 트래픽을 GWLB 뒤에 위치한 어플라이언스 들로 보내기 위한 GWLB 엔드포인트 (GWLBe) 를 설정합니다. GWLBe 는 애플리케이션 서브넷에 각각 1개씩 배치하고, 가용 영역 별 라우팅 테이블을 각각 설정 합니다. 또한 VPC 의 IGW 에 연결된 라우팅 테이블 1개도 설정 합니다. (아래에서는 GWLBe 와 라우팅 일부를 설정하는 예시를 보여줍니다.)
– 이를 위해서, VPC 의 ‘Create Endpoint Service’ 를 클릭하여 대상 GWLB 를 선택하고 해당 서비스를 생성합니다. (여기서 ‘Require acceptance for endpoint’ 항목의 ‘Acceptance required’ 는 체크를 해제하였습니다.)
– 생성이 완료되면 ‘Service name’ 을 복사해둡니다.
– ‘Endpoint’ 로 이동 후 ‘Create Endpoint’ 를 클릭합니다.
– ‘Find service by name’ 을 클릭하고 복사해둔 ‘Service name’ 을 붙여넣기 하고 ‘Verify’ 를 클릭합니다.
– ‘VPC’ 에서 어플리케이션이 배치되어 있는 VPC 를 선택합니다. 이 후 ‘Create Endpoint’ 를 클릭합니다.
– Route Tables 로 이동 한 다음, 어플리케이션이 위치한 서브넷의 Route table 을 클릭하고 ‘Routes’ 탭에서 ‘Edit routes’ 를 클릭합니다.
– 대상이 되는 GWLB Endpoint 를 설정하고 ‘Save routes’ 를 클릭합니다.
– 마찬가지로, 별도의 Ingress 라우팅 테이블에서 특정 어플리케이션 서브넷 (예> 10.0.0.32/28) 에 대해 생성한 GWLBe 로 라우팅이 되도록 추가 설정을 해줍니다.
– 설정이 완료되면, 인스턴스에서 다음과 같은 명령어를 통해 Geneve 프로토콜 (포트번호 6081) 이 정상적으로 통신이 되고 있는지 확인 합니다.tcpdump -nvv 'port 6081'
# Steven