Cloud/GCP

[GCP] On-Premise to GCP VPN구성

달빛궁전- 2024. 1. 15. 09:53

 

배경 :
GCP와 On-Premise간 VPN통신을 구축해보기 위한 문서입니다.
많은 On-Premise 사이트에서는 VPN기능이 포함된 UTM들을 사용하고 있습니다.
UTM장비의 엔트리, 미들레인지급은 보통 네트워크 프로토콜인 BGP를 지원하지 않으므로 GCP의 HA VPN으로는 구성이 불가하기에, Classic VPN(기본형)을 사용하도록 하겠습니다.
고객사 장비가 엔터프라이즈급으로 BGP를 지원한다면 HA VPN을 사용하는 것을 권고합니다.
또한, UTM장비마다 설정 하는 방법과 용어는 조금씩 다르지만 필요한 설정 값 들은 동일합니다.

 

목적 :
데이터의 안전한 흐름을 위해 Public망이 아닌 Private망을 사용합니다.
GCP와 고객사간 전용선 (Cloud Interconnect)가 가격을 생각안한다면, 제일 좋은 방안이지만, VPN도 양단 데이터를 암호화하여 통신하기 때문에 Opex(운영비)를 생각한다면 좋은 방안입니다.
본 문서에서는 GCP와 On-Premise간 연결을 직접 해보는 것이 목적입니다.

 

유의사항 :
On-premise에서는 UTM(VPN)장비에 구성하여 연결합니다.
테스트로 구축시 VPN 장비를 구해서 하기에는 어려우므로, 이 문서에서는 IPsec VPN을 지원하는 오픈소스 storangSwan(이하 Swan으로 표기)을 사용하여 VPN을 구성하도록 하겠습니다.

 

사전 필요사항 :
테스트시 앞 단 공유기나 라우팅 장비에서 UDP 500, 4500 포트를 Swan이 설치된 서버로 포워딩 하여야 합니다.
UDP 500 Port는 IKE (Internet Key Exchange)에서 설정하는데 있어 사용되며, UDP 4500 Port는 중간에 NAT장치가 있을 때 VPN협상을 위한 사용포트 입니다.
해당 포트가 포워딩 되지 않을 경우, 연결협상이 되지 않거나 On-Premise에서 먼저 연결협상을 한 경우, 처음 연결은 되나 데이터 통신이 없을 경우 끊긴 이후부터는 다시 연결되지 않습니다.

 

내용 :

본 문서에서 목표로 하는 구성도 입니다.

 

[전체 구성도]

 
  • GCP VPN설정

Console : 하이브리드 연결 -> VPN 연결 만들기 -> 기본 VPN 선택
IPv4트래픽만 지원하며, Tunnul은 1개만 생성됩니다.

 

이어서, Google Compute Engine VPN Gateway를 설정합니다.
입력 값에 대한 설명은 아래와 같습니다.

입력 값
비고
이름 네이밍 룰에 근거하여 설정
네트워크 해당 VPN과 연결할 네트워크(VPC)
리전 VPC가 위치한 리전 선택
IP주소 고정 Public IP를 생성하여 연결
 

터널에 대한 설정이며, 본 문서에서는 라우팅 기반으로 진행합니다.

입력 값
비고
이름 네이밍 룰에 근거하여 설정
원격 피어 IP주소 On-Premise 측 Public IP
IKE 버전 Internet Key Exchange 버전으로
1, 2 모두 선택가능합니다.
해당 문서에서는 버전 2로 진행합니다.
IKE
사전공유키
공유키 설정으로 동일하여야, VPN연결이 진행됩니다.
On-premise와 동일한 키 값으로 설정합니다.
라우팅 옵션
라우팅 기반 IP 라우팅을 기반으로 트래픽을 전달합니다.
라우팅 테이블에서 목적지 IP 주소를 기반으로 VPN 트래픽의 경로를 결정합니다.
라우팅 기반 VPN은 정책 기반 VPN보다 구성이 더 간단하며 대역폭이 더 넓습니다.
단, 라우팅 기반 VPN은 특정 프로토콜이나 포트에 대한 제어가 제한적입니다.
정책 기반 트래픽 전달을 IP 주소, 프로토콜, 포트 및 기타 패킷 특성을 기반으로 제어합니다.
사용자 지정 보안 정책을 설정하여 특정 서브넷에서 나가는 트래픽을 선택적으로 라우팅할 수 있습니다.
정책 기반 VPN은 라우팅 기반 VPN보다 더 유연하며 특정 프로토콜 및 포트에 대한 제어가 가능합니다.
하지만, 정책 기반 VPN은 구성이 복잡하며 대역폭이 더 좁을 수 있습니다.

 

  • On-Premise VPN – storangSwan설정

Swan은 오픈소스로 대부분의 리눅스 배포판에서 사용이 가능합니다.
테스트 시스템은 : X86 기반의 서버이며, Ubuntu 22.04.2 LTS 을 사용하였습니다.
유의사항으로 2023.04 기준으로 ARM CPU계열은 ip forward 기능이 동작되지 않습니다. 

 

1. 패키지 업데이트

sudo apt-get update

 

2. 네트워크의 다른 서버들이 Swan을 통해 통신할 수 있도록 Forward 설정을 진행합니다.

sudo sysctl net.ipv4.ip_forward

 

3. strongSwan 패키지 설치

sudo apt-get install strongswan

 

4. 설치가 되었다면, config설정을 해야 실행이 가능합니다.
기존 conf파일을 백업합니다.

sudo cp /etc/ipsec.conf /etc/ipsec.conf_backup

 

5. Config 파일설정

sudo vi /etc/ipsec.conf

 

config파일의 제일 아래쪽 으로 이동하여, 설정 값을 입력합니다. 아래는 예제 값입니다.


아래 표 안의 설정 값을 참조하여 설정을 진행합니다.

설정 값
설명
keyexchange 키 교환 방식 선택 GCP와의 연결은 ikev2, ikev1모두 지원합니다.
Ikev2가 더 향상된 버전이므로 ikev2로 선택합니다.
authby 인증방식 선택
사전 공유된 키로 설정하는 secret 옵션 값으로 선택
Type Vpn 터널 설정
left On-Premise(storangswan)설치된 서버의 로컬 IP 주소
leftid On-Premise의 로컬 서브넷
right 상대방 (GCP)의 Public IP
rightsubnet VPN터널을 통해 접속할 대상 네트워크 (GCP VPC의 네트워크대역)
auto Storangswan시작시 VPN연결 동작여부
dpdaction Dead Peer Detection로 VPN의 상대방(GCP)이 연결 중인지 주기적으로 확인하는 옵션입니다.
본 문서에서는 보류상태인 hold로 선택합니다.
dpddelay dpd검사의 대기 시간입니다.
dpdtimeout dpd검사시 대상 피어의 응답을 기다리는 시간입니다.

 

6. 공유키 값을 설정하기 위해 아래 파일을 edit합니다.

sudo vi /etc/ipsec.secrets

ipsec.secrets파일은 공유키 값을 설정하는 파일로 아래와 같은 형식으로 설정합니다.

<Local IP> <Remote IP(GCP)> : PSK “공유키 값”

 

 

7. 저장 후 실행한 뒤 상태를 확인합니다. 정상적으로 연결된 경우 UP상태 및 터널 상태를 확인할 수 있습니다.

sudo ipsec start
sudo ipsec status

 

Swan, GCP VPN각 상태 확인

 

8. 실행이 되지 않는 경우 Swan은 아래 경로에 로그를 저장하니 에러메시지를 확인합니다.
Tail과 grep을 이용하면 Swan 관련된 로그만 확인할 수 있습니다.

/var/log/syslog

sudo tail –f /var/log/syslog | grep charon

 

정상적으로 연결이 되면 ”sudo ipsec stop”으로 서비스를 종료합니다.

 

9. 정상적으로 VPN이 연결이 되었으므로, 앞서 설정했던 Forward설정을 서버가 재부팅 되어도 유지될 수 있도록 설정합니다.

sudo vi /etc/sysctl.conf
마지막줄 추가 -> net.ipv4.ip_forward=1

 

10. 터미널을 종료하여도 Swan이 실행될 수 있도록 아래 명령어로 재실행합니다.

sudo nohup ipsec start &

 

최종적으로 Ping, ssh등을 통해 양단 간 통신이 되는지 확인합니다.

 

현재까지 진행 되었다면, GCP <-> Swan 간은 통신이 가능하나, Swan이 있는 On-Premise 네트워크는 라우팅이 되어있지 않기 때문에, 연결이 되지 않습니다.

 

보통은 VPN 장비로 연결을 했다면, 네트워크 라우팅을 설정하면 되기에 아래 내용은 지나가도 되나, 저희는 오픈소스로 진행하기에 아래의 방법으로 라우팅을 직접 해주어야합니다.

 

예시로 GCP대역은 10.10.0.0/16, Swan Server는 192.168.1.190으로 가정하고 진행하겠습니다.

 

  • Windows
    interface의 경우 지정하지 않으면, 시스템에서 연결된 기본 interface로 연결됩니다.
route ADD -p 10.10.0.0 MASK 255.255.0.0 192.168.1.190 METRIC 10
          destination          mask       gateway     metric

라우팅 적용 확인은 route –PRINT를 통해 할 수 있습니다.

  • Mac
Sudo route –n add 10.10.0.0 –netmask 255.255.0.0 192.168.1.190
                destination            mask        gateway 

Mac에서의 라우팅 확인은 netstat –rn을 통해 확인합니다.