[GCP] Google Cloud VPN 구성 및 연결 가이드
Google Cloud VPN configuration guide with AWS
안녕하십니까? 박형준 입니다.
가상사설네트워크(VPN, Virtual Private Network) 연결은 전용선(Physical dedicated network) 연결에 비하여 낮은 가격으로 손쉽게 구축할 수 있는 이기종 네트워크 간의 사설 네트워크 연결(Private Network Connection) 솔루션입니다.
이번 가이드에서는 GCP 환경에서 Site-to-Site VPN 을 통하여 AWS 환경과의 연결을 테스트 해보도록 하겠습니다. GCP 의 경우에는 아래와 같이 총 2가지의 VPN 옵션이 존재합니다.
1) Classic VPN: 1개의 터널을 통하여 IPSec VPN 을 연결합니다. 지원하는 라우팅 방식은 “정적 라우팅(Static Routing)” 방식과 “동적라우팅(Dynamic Routing)” 방식을 지원합니다. 정적 라우팅의 경우 네트워크 정보가 바뀌면 해당 정보를 수동으로 입력해 주어야 하는 불편함이 있으나, 설정 방식이 간단하다는 장점이 있습니다.
2) High-availability(HA) VPN: 터널을 2개로 생성하여 하나의 터널에 장애가 발생하여도 나머지 터널을 통하여 서비스를 지속하실 수가 있습니다. 지원하는 라우팅 방식은 BGP 를 통한 “동적 라우팅” 방식을 지원합니다. 동적 라우팅의 경우에는 터널링 연결시 별도의 라우팅 정보(CIDR)에 대한 교환이 없으며, 터널링 연결후 변동시에도 BGP 를 통하여 자동으로 전파 되는 장점이 있습니다.
본 가이드에서는 고가용성(High-Availability) 이 보장되는 VPN 연결에 대하여 알아보겠으며, VPN 연결의 상대는 AWS(Amazon Web Service)로 해서 진행을 해보겠습니다. “Classic VPN” 에 대한 가이드, 혹은 다른 클라우드(MS, Azure, Alibaba Cloud, IBM Cloud)와의 연결은 “참고자료(4), (1)” 항목에서 확인하시기 바랍니다.
[#1/GCP] Cloud Routers 생성
A. VPN 연결에서 사용할 Google Cloud 환경에서의 Router 를 생성합니다. “Hybrid Connectivity” ⇒ “Cloud Routers” ⇒ “Create a cloud router”
— Name: Cloud Router 에서 사용할 이름을 입력합니다.
— Network: VPN 연결이 필요한 “Network” 를 선택합니다.
— Region: Cloud Router 가 생성될 Region 을 선택합니다. 실제 VPN 통신이 필요한 VM 의 Region 과 동일하게 선택하시면 됩니다.
— Google ASN: 실제 공용망(Public Network)에서 사용하는 AS번호가 아닌 사설AS번호(Private ASN)중에서 선택하시면 됩니다. (라우터 생성 후에도 수정 가능). 사설 ASN대역은 AWS 에서 지원하는 대역인 “64512–65534“ 중에서 선택합니다. , 해당 가이드에서는 “65000”을 사용하겠습니다.
— Advertised routers: 해당 라우터에서 라우팅 정보를 전달할 서브넷 혹은 대역 지정 옵션.
. Advertise all subnets visible to the Cloud Router(Default): 선택한 네트워크에 존재하는 모든 서브넷(리전)에 라우팅 정보를 전파합니다. 이번 가이드에는 Default 값으로 적용합니다.
. Create custom routes: 모든 서브넷에 라우팅 정보를 전파할지 아니면 특정 서브넷만 지정해서 라우팅 정보를 전파할지에 대해서 선택이 가능합니다.
B. Cloud Router 에서 입력한 “Google ASN” 번호는 AWS VPN 설정시 필요한 값이므로 노트해 놓습니다.
[#2/GCP] VPN Connection 설정 시작
A. VPN 커넥션에 대하여 설정을 시작합니다. “Hybrid Connectivity” ⇒ “VPN” ⇒ “Create Create VPN Connection” ⇒ “High-Availability(HA) VPN”
— VPN gateway name: Google 에서 사용 할 VPN gateway 이름을 설정합니다.
— VPC network: 앞서 설정한 “Cloud Router“ 에서 설정한 동일한 “VPC Network” 을 선택합니다.
— Region: VPN Gateway 가 생성될 Region 을 설정합니다. 앞서 설정한 “Cloud Router“ 에서 설정한 동일한 “Region”으로 선택합니다.
B. “A 단계” 에서 필요한 값을 입력하시고 “Create & continue” 버튼을 누르신 후에 화면이 바뀌면 “Cancel”을 누릅니다.
- “Cloud VPN Gateways” 항목에 아래와 같이 2개의 VPN Gateway IP 가 생성된 것을 확인하실 수가 있습니다. 해당 IP 2개(“interface:0, 1”)는 AWS 에서 VPN 설정시에 필요한 값이므로 메모해둡니다.
[#3/AWS] Customer Gateway 생성
GCP 환경에서 생성한 2개의 VPN Gateway IP 에 대하여 AWS 환경에서 설정하는 단계입니다. 2개의 IP를 설정해야 되므로, AWS Customer Gateway 2개를 아래와 같이 순서대로 생성합니다.
A. AWS 와 연결할 상대방(GCP)의 Customer Gateway 를 설정합니다. “Networking & Content Delivery” ⇒ “VPC” ⇒ “Virtual Private Network(VPN)” ⇒ “Customer Gateway” ⇒ “Create Customer Gateway”
— Name: Customer Gateway 이름을 설정합니다.
— Routing: “Dynamic” 을 선택합니다(라우팅 테이블을 자동으로 전파)
— BGP ASN: “#1”단계 에서 설정한 Google Cloud Router ASN 을 입력합니다.
— IP Address: “#2”단계 에서 에서 확인한 GCP VPN Gateway IP 2개 중에서 “interface:0” 입력
— Certificate ARN: 기본값(공란)으로 남겨 놓습니다.
— Device: 기본값(공란)으로 남겨 놓습니다.
B. 2번째 Customer Gateway 를 생성합니다.
— 1번째 Customer Gateway 와 동일하게 추가 생성을 합니다. 다만, IP Address에 대해서는 “#2단계” 에서 에서 확인한 GCP VPN Gateway IP 2개 중에서 “interface:1” 의 IP를 입력합니다.
[#4/AWS] Virtual Private Gateways 생성
A. AWS 와 연결할 상대방(GCP)의 Customer Gateway 를 설정합니다.
“Networking & Content Delivery” ⇒ “VPC” ⇒ “Virtual Private Network(VPN)” ⇒ “Virtual Private Gateways” ⇒ “Create Virtual Private Gateway”
— Name: Virtual Private Gateway 이름을 입력합니다.
- ASN: Custom ASN으로 선택 후, Private ASN 번호를 입력합니다. 본 가이드에서는 “64800”으로 하겠습니다. (AWS:64800, GCP:65000)
B. “A”단계에서 생성한 Virtual Private Gateway 를 연결한 VPC 와 Attach 합니다.
- “B” 단계 까지 진행하셨으면, 아래와 같이 “attached” 된 상태와, 연결한 “VPC ID” 그리고 AWS 측에서 사용할 Private ASN 를 확인하실 수가 있습니다.
[#5/AWS] Site-to-Site VPN Connection 생성
이번 단계에서는 AWS 환경에서 Site-to-Site VPN Connection 생성을 통하여 “#3” 단계에서 생성한 2개의 “Customer Gateways(GCP VPN Gateway IP)” 와 연결을 합니다. 이때, Customer Gateway 2개에 대하여 연결이 필요하므로, Site-to-Site VPN Connection 은 2개를 생성합니다.
A-1. VPN Connection 생성#1
“Networking & Content Delivery” ⇒ “VPC” ⇒ “Virtual Private Network(VPN)” ⇒ “Site-to-Site VPN Connections” ⇒ “Create VPN Connection”
- Name: 사용하실 VPN connection 이름을 입력합니다. 두번째 커넥션과 구별을 위한 이름을 권고 드립니다.
- Target Gateway Type: Virtual Private Gateway 를 선택합니다.
- Virtual Private Gateway: “#4” 단계 에서 생성한 Virtual Private Gateway 를 선택합니다.
- Customer Gateway: “Existing” 을 선택합니다.
- Customer Gateway ID: “#3” 단계에서 생성한 “Custom Gateway” 를 선택합니다. AWS 에서 Connection 을 2개 만들어야 되며, 첫번째 Connection 이므로 “if0”을 선택하겠습니다.
- Routing Options: “Dynamic(requires BGP)”를 선택합니다.
- Tunnel Options: 이번 가이드에서는 디폴트 값으로 사용하겠습니다.
. Inside IP CIDR, Pre-shared key for Tunnel: 공란으로 비워 놓으시면 랜덤으로 자동 생성 됩니다. 필요에 의해서 Inside IP CIDR 은 BGP 세션을 맺기 위해 사용 될 내부 IP, 그리고 Pre-shared key 의 경우 VPN 커넥션 Phase 1 에서 사용할 패스워드를 직접 입력하셔도 됩니다.
A-2. VPN Connect 생성#2
“Networking & Content Delivery” ⇒ “VPC” ⇒ “Virtual Private Network(VPN)” ⇒ “Site-to-Site VPN Connections” ⇒ “Create VPN Connection”
- Name: 사용하실 VPN connection 이름을 입력합니다. 첫번째 커넥션과 구별을 위한 이름을 권고 드립니다.
- Target Gateway Type: “A”단계와 동일
- Virtual Private Gateway: “A”단계와 동일
- Customer Gateway: “A”단계와 동일
- Customer Gateway ID: 두번째 Connection 이므로 “if1”을 선택합니다.
- Routing Options: “Dynamic(requires BGP)”를 선택합니다.
- Tunnel Options: “A”단계와 동일
B. VPN 설정 파일 다운로드
“A” 단계에서 생성한 2개의 VPN Connection 이 AWS 콘솔에 보이며, 각각의 커넥션의 “Tunnel Details” 탭에서 Outside IP Address(AWS VPN Gateway IP)” 와 “Inside IP CiDR(BGP 연결을 위한 내부IP)”을 확인하실 수가 있습니다. 현재는 GCP 쪽의 VPN 설정을 완료하지 않은 관계로, “Status”는 Down 이며, “Details” 항목은 “IPSEC IS DOWN” 입니다. 이제 각각의 VPN Connection 에 대하여 왼쪽 체크 박스를 선택하신 후에 “Download Configuration” 을 선택합니다. 각각, 다운로드(Vendor 에서 반드시 Generic 으로 선택)를 받으셔서 총 2개의 파일이 필요합니다.
- “B” 단계에서 Download 한 2개의 파일을 참조하여서 아래와 같은 항목과 표를 미리 작성하여 놓으시면 다음단계에서 VPN 설정시에 좀더 편하게 설정하실 수가 있습니다.
. GCP ASN: “#1“ 에서 지정한 값(65000)
. AWS ASN: “#2“ 에서 지정한 값(64800)
. Pre-Shared Key(AWS Connection1/tunnel#1): Connection 1 에서 다운로드한 파일에 IPSec Tunnel#1
. Pre-Shared Key(AWS Connection1/tunnel#2): Connection 1 에서 다운로드한 파일에 IPSec Tunnel#2
. Pre-Shared Key(AWS Connection2/tunnel#1): Connection 2 에서 다운로드한 파일에 IPSec Tunnel#1
. Pre-Shared Key(AWS Connection2/tunnel#2): Connection 2 에서 다운로드한 파일에 IPSec Tunnel#2
C. 라우팅 전파 설정
VPN 연결 후 라우팅 정보에 대한 전파(Route propagation)을 설정합니다.
“Networking & Content Delivery” ⇒ “VPC” ⇒ “Route Tables” ⇒ “Edit route propagation”
- “#4”단계에서 생성한 Virtual Private Gateway 에 대하여 “Propagate” 를 체크합니다.
[#6/GCP] Peer VPN Gateways, Cloud VPN Tunnel 생성
이번 단계에서는 AWS 환경에서 설정한 AWS VPN Gateway IP 4개(#4, “C단계” 테이블 참조)에 대하여 GCP 쪽에 설정하고, 총 4개의 VPN Tunnel 에 대한 설정, 그리고 마지막으로 각 Tunnel 에 대한 BGP 설정을 하겠습니다.
A. 4개의 Interface 설정(AWS VPN Gateway 정보 입력)
“Hybrid Connectivity” ⇒ “VPN” ⇒ “Peer VPN Gateways” ⇒ “Create peer VPN gateways”
- Name: Peer VPN Gateway 이름을 설정합니다.
- Interfaces: “four interfaces” 를 선택합니다(AWS 에서 할당 받은 총 4개의 VPN GW IP 입력 예정)
. Interface 0 IP address: 표에서 [A0] IP 를 입력합니다.
. Interface 1 IP address: 표에서 [A1] IP 를 입력합니다.
. Interface 2 IP address: 표에서 [A2] IP 를 입력합니다.
. Interface 3 IP address: 표에서 [A3] IP 를 입력합니다.
B. Cloud VPN Tunneling 생성
“Hybrid Connectivity” ⇒ “VPN” ⇒ “Cloud VPN Tunnels” ⇒ “Create VPN tunnel”
- “#2단계” 에서 생성한 VPN Gateway 이름을 선택합니다.
- “#5단계”에서 작성한 표에서 GCP 쪽의 [G0]Interface:0 IP 와 [G1]Interface:1 IP 가 보입니다.
- Peer VPN gateway name: 이전 단계에서 생성한 “Peer VPN gateway” 이름을 선택합니다.
- High availability: “Create 4 VPN tunnels” 를 선택합니다.
- Cloud Router: “#1단계” 에서 생성한 Cloud Router 를 선택합니다.
- 하기 그림에서 “연필 모양”을 클릭하여 편집 모드로 들어갑니다.
- 첫번째 편집 모드에서는 “Associated Cloud VPN gateway interface” 항목이 “0” 입니다.
. “peer VPN” 항목은 “0” 으로 선택합니다.
. Name 의 경우 아래 그림과 같이 rule 을 설정하여 gcp0, aws0 번째라는 것을 명시하는 것도 방법입니다.
. 키교환방식은 Default 값으로 v2 로 남겨 둡니다. 향후 AWS 측에서 IKEv2 로 변경이 가능합니다.
. IKE pre-shared key 항목은 “#5단계”에서 메모해 놓은 “Connection 1 / IPSec Tunnel#1” 항목의 패스워드를 입력하시면 됩니다.
- 두번째 편집 모드에서는 “Associated Cloud VPN gateway interface” 항목이 “1” 입니다.
. “Associated peer VPN gateway interface” 항목은 “1” 로 선택합니다.
. IKE pre-shared key 항목은 “#5단계”에서 메모해 놓은 “Connection 1 / IPSec Tunnel#2” 항목의 패스워드를 입력하시면 됩니다.
- 아래와 같이 세번째, 네번째 편집 모드에서도 각각 “Name” 및 “Pre-shared key” 를 입력합니다. Pre-shared Key 는 AWS 2번째 Connection 에서 다운로드 받은 파일의 Tunnel#1, Tunnel#2 입니다.
- 아래와 같이 총4개의 터널에 대하여 설정을 하고 “Create & continue” 버튼을 누릅니다.
- 참고로, 현재 까지 설정을 잘 하셨다면, AWS 환경의 “Site-to-Site VPN Connections”에서 IPSEC IS UP 이라고 “Details” 항목이 업데이트 된 것을 확인 하실 수가 있습니다. 만약에, IPSEC IS DOWN 이라고 나온다면, “#5”단계에서 GCP 측과 AWS 측의 VPN Gateway IP 매핑 및 Pre shared key 확인이 필요하며, 참고자료 “(6) VPN 문제 해결 가이드” 를 참고하시기 바랍니다.
C. BGP 세션 설정
- 아래와 같이 총4개의 터널이 생성 되었으며, “BGP Session”에 대하여 설정을 시작합니다.
- 가장 위쪽에 “BGP session” 부터 설정하겠습니다. “#5단계”의 표에서 작성한 순서대로 설정해 주시면 되며, “Cloud Router BGP IP “ 항목에는 AWS 에서 다운로드하신 파일 기준에서 Customer Gateway 항목을, “BGP Peer IP” 항목에는 Virtual Private Gateway 항목을 입력하시면 됩니다.
- 하기 그림과 같이 총 4개의 BGP Session 에 대하여 작성하신 후 “Save BGP configuration” 을 클릭하고, 다음 화면에서 “OK” 버튼을 누릅니다.
- 아래와 같은 화면에서 조금 기다리면 “Bgp session status” 가 “Waiting for peer” 에서 “BGP established” 로 바뀌는 것을 보실 수가 있습니다. 만약에 바뀌지 않는 다면, 해당 Tunnel name 을 클릭하셔서 “Modify BGP session” 을 클릭하신 후에, AWS 환경과 GCP 환경의 BGP IP 설정을 확인하시기 바랍니다. (ASN 포함)
- AWS 쪽에서도 “Tunnel State” 항목의 “Status” 는 “DOWN” 에서 “UP” 으로, “Details” 탭은 “1 BGP ROUTES” 로 바뀐 것을 확인하실 수가 있습니다. 이제 GCP 와 AWS 간에 IPSec VPN 터널링이 맺어 졌습니다.
D. 아키텍쳐 구성(GCP-VPN-AWS)
- GCP 와 AWS 의 네트워크 라우팅 정보 교환은 BGP 를 통하여 진행하고, 각 클라우드 환경에서 Private ASN를 부여(GCP: Cloud Router, AWS:Virtual Private Gateway) 합니다.
- GCP 환경에서 고가용성을 보장하는 IPSec 연결을 위하여 총 2개의 VPN Gateway Public IP(Interface:0, Interface:1)가 생성됩니다.
- AWS 환경에서는 GCP 에서 생성된 2개의 VPN Gateway 를 연결 할 2개의 “Site-to-Site VPN Connection”이 생성 됩니다.
- GCP와 AWS 의 VPN Gateway 간에 IPSec VPN Tunneling 이 생성되며 GCP VM과 AWS EC2 서버 간에 트래픽 흐름은 아래와 같습니다.
. GCP VM(Private IP) ⇒ GCP VPN Gateway(Public IP) ⇒ IPSec VPN Tunneling ⇒ AWS VPN Gateway(Public IP) ⇒ AWS EC2(Private IP)
- 하기 구성도는 이해를 돕기 위한 그림이며, 표기된 Region 명과, ASN, BGP IP 는 본 가이드와 일치하지 않을 수가 있습니다. 해당 구성도는 참고자료(2) 항목에서 세부 내용에서 확인이 가능합니다.
[#7/GCP] Test via IPSec VPN Tunneling(Site-to-Site VPN)
A. Regular Ping Test(ICMP)
- 이제 GCP 와 AWS 간에 IPSec VPN 터널링이 맺어졌습니다. GCP VM 에 접속하여 AWS EC2 의 Private IP 로 ping 명령어를 실행하고, 반대로 AWS EC2 에서도 GCP Private IP 로 ping 을 실행하겠습니다.
- GCP VM Private IP: 10.178.0.2, AWS EC2 Private IP: 172.31.30.1
. GCP VM Private IP ⇒ GCP VPN GW(Public IP) ⇒ AWS VPN GW(Public IP) ⇒ AWS EC2 Private IP, 반대 통신의 경우에는 역순입니다.
- Ping 이 정상적으로 되지 않을 경우 각각 Cloud 업체의 방화벽 설정 및 [#5] 단계에서의 라우팅 Propagation 설정 여부에 대하여 확인이 필요합니다.
. AWS Security 그룹에서는 GCP 네트워크 대역에 대하여 Allow, 반대로 GCP Firewall 에서는 AWS 네트워크 대역에 대한 Allow 가 필요합니다.
. AWS VPC 메뉴의 Route Tables 에서 금번 가이드에서 생성한 “Virtual Private Gateway”에 대하여 “Propagate” 항목 체크가 필요합니다.
B. VPN Tunnel fail-over Test
- 위의 “A단계” 와 같이 Ping 을 걸어 놓은 상태에서, 하기와 같이 Tunnel 을 하나씩 삭제합니다. Tunnel 을 삭제해도 Ping 이 지속 된다면 HA 구성이 정상적으로 잘 동작하는 것입니다.
Disclaimer: 본 글의 작성자는 Google 직원이지만 Google Cloud 를 공부하는 한 개인으로서 작성된 글입니다. 본 글의 내용, 입장은 Google 을 대변하지 않으며 Google 이 해당 콘텐츠를 보장하지 않습니다.
[참고자료]
(1) VPN 상호 운용성 가이드(Alibaba, Azure, Cisco, Palo Alto, Fortinet, Vyatta 등)
https://cloud.google.com/vpn/docs/how-to/interop-guides
(2) Google Cloud HA VPN interoperability guide for AWS
https://cloud.google.com/community/tutorials/using-ha-vpn-with-aws
(3) Creating an HA VPN gateway to a Peer VPN gateway
https://cloud.google.com/vpn/docs/how-to/creating-ha-vpn
(4) Creating a Classic VPN using static routing
https://cloud.google.com/vpn/docs/how-to/creating-static-vpns
(5) AWS Site-to-Site VPN User Guide
https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html
(6) GCP VPN 문제해결 가이드
https://cloud.google.com/vpn/docs/support/troubleshooting