클라우드에 가상 온프레미스 환경을 구축하고 Site-to-Site VPN으로 연결하기

Site to Site VPN 이란?

IPSec 암호화 프로토콜을 사용해 AWS Cloud 환경과 On-Premise 환경을 연결해주는 서비스입니다.

AWS에는 VGW(Virtual Private Gateway), On-Premise에는 CGW(Customer Gateway)가 붙어있으며 이 둘 사이에 IPSec 프로토콜을 이용해 터널링을 만들어 줘 인터넷을 통해서 상호 간 통신이 가능하게 해주는 원리입니다.

하단의 이미지는 Site-to-Site VPN의 기본 구성입니다.

VGW(Virtual Private Gateway)란?

✔️ VGW는 가상 사설 네트워크인 VPC와 온프레미스 네트워크를 연결하는 방식 중 가장 오래된 방식입니다.

✔️ VGW는 VPC와 온프레미스 네트워크를 연결하는 VPC 쪽의 라우터 역할을 합니다.

✔️ VGW를 이용해 온프레스 네트워크와 연결하기 위해서는 온프레미스 네트워크 쪽에 CGW(Customer Gateway)를 구성해 줘야 합니다.

VGW는 다음과 같은 특징들을 가지고 있습니다.

  • VGW는 여러 개의 온프레미스 라우터와 연결이 가능합니다.
  • 다만 VGW는 하나의 VPC에만 연결할 수 있습니다.
  • VGW는 Site-to-Site VPN, Direct Connect 연결을 통해 온프레미스 네트워크와 연결이 가능합니다.
  • VGW 생성시 동적 라우팅을 사용할 경우 ASN(Autonomous System Number)를 지정해 줘야합니다.

※ Autonomous System Number(ASN)은 인터넷 상에서 독립적으로 라우팅 정책을 운영하는 네트워크나 네트워크 그룹을 식별하는 고유한 번호입니다. ASN을 통해 네트워크는 다른 네트워크와 데이터를 효과적으로 주고받을 수 있습니다.

CGW(Customer Gateway)란?

✔️ CGW는 온프레미스 네트워크의 CGD(Customer Gateway Device)의 설정 값을 VGW에 제공하기 위한 가상 게이트웨이입니다. CGW는 AWS에서 설정할 수 있습니다.

CGW는 다음과 같은 특징들을 가지고 있습니다.

  • CGD에 있는 IP 정보 등 CGD와 연결할 수 있는 설정 값들을 CGW에 지정함으로써 VGW는 CGW에 있는 해당 값들을 참조해 CGD에 연결할 수 있게 됩니다.
  • CGW 역시 동적 라우팅을 사용할 경우 ASN을 지정해 줘야합니다.

CGD(Customer Gateway Device)란?

✔️ CGD는 Site-to-Site VPN 연결을 위해 온프레미스에 설치된 라우터 등의 물리적 디바이스 또는 소프트웨어를 의미합니다.

CGD는 다음과 같은 특징들을 가지고 있습니다.

  • CGD가 BGP를 지원하지 않을 경우 VPN 연결시 동적 라우팅을 사용할 수 없습니다. 따라서 이 경우 정적 라우팅을 사용해야 합니다.
  • VGW와 CGW의 설정을 모두 구성한 뒤 구성 파일을 다운로드 받아 CGD에 설치하게 되면 VPC와 온프레미스 네트워크 간의 VPN Tunnel이 구성됩니다.

VPN Tunnel

✔️ VPN 터널은 VPC와 온프레미스 네트워크 간의 서로 데이터를 주고받을 수 있는 암호화된 링크입니다.

VPN 터널은 다음과 같은 특징들을 가지고 있습니다.

  • VPN 터널은 IPSec 프로토콜 스위트를 사용해 데이터를 암호화하여 처리합니다.
  • 각 VPN 터널은 인터넷 연결을 위한 Public IP와 내부 연결을 위한 내부 CIDR로 구성됩니다.
  • 또한 VPN 터널이 생성될 때 AWS에서 기본값을 지정하게 되는데, 암호화, Dead Peer Detection(DPD) 시간 초과, IP 주소 등의 터널옵션을 직접 지정할 수 있습니다.
  • Site-to-Site VPN을 구성할 때 두 개의 VPN 터널을 생성하게 되는데, 그 이유는 VPN 터널이 사용 불가능 해질 경우 다른 VPN 터널로 자동으로 라우팅되어 고가용성을 겸비할 수 있습니다.
  • VPN 터널당 최대 대역폭은 1.25Gpbs 입니다.

Site-to-Site VPN 라우팅 옵션

고객 게이트웨이 디바이스의 제조업체와 모델에 따라 라우팅 유형을 선택할 수 있습니다.

고객 게이트웨이 디바이스에서 **Border Gateway Protocol(BGP)**을 지원할 경우 Site-to-Site VPN 연결을 구성할 때 동적 라우팅을 지정합니다. 고객 게이트웨이 디바이스가 BGP를 지원하지 않는 경우 정적 라우팅을 지정합니다.

※ 자세한 내용은 아래의 링크를 참고 부탁 드리겠습니다.

🔗 https://docs.aws.amazon.com/ko_kr/vpn/latest/s2svpn/VPNRoutingTypes.html

구성해볼 Site to Site VPN 아키텍처

Site to Site VPN 실습

VPC 생성

1. OnPrem용 VPC 생성

아래와 같이 OnPrem용 VPC 생성을 진행합니다.

  • IPv4 CIDR 블록 : 172.32.0.0/16
  • 가용영역 : 1개
  • 퍼블릭 서브넷 수 : 1개
  • Nat GW 없음, VPC Endpoint 없음
  • DNS 호스트 이름 및 확인 활성화

위의 내용대로 생성한 OnPrem VPC 의 리소스 맵

2. Cloud VPC 생성

아래와 같이 Cloud용 VPC 생성을 진행합니다.

  • IPv4 CIDR 블록 : 52.0.0.0/16
  • 가용영역 : 1개
  • 퍼블릭 서브넷 수 : 1개
  • Nat GW 없음, VPC Endpoint 없음
  • DNS 호스트 이름 및 확인 활성화

위의 내용대로 생성한 Cloud VPC 의 리소스 맵

보안 그룹 생성

1. OnPrem VPC 보안 그룹 생성

※ 보안 상 인바운드 규칙을 0.0.0.0/0으로 설정 것은 좋지 않은 방법이나 테스트 용도를 위해 아래와 같이 생성하도록 하겠습니다.

SSH 접속을 위하여 22번 포트 오픈 해줍니다.

PingTest를 위하여 ICMP – IPv4 대역을 오픈 해줍니다.

우리는 OnPrem VPC 내 인스턴스에 openswan을 설치 해줄 예정이고 openswan이 UDP 4500 포트를 사용하기 때문에 UDP 4500포트 또한 오픈 해줍니다.

2. Cloud VPC 보안 그룹 생성

위와 동일하게 SSH 접속 및 PingTest를 위해 보안 그룹을 별도로 생성하여 줍니다.

Key Pair 생성

실습에서는 OpenSSH와 함께 사용해볼 예정이라 .pem 형식의 프라이빗 키 파일을 사용할 것입니다.

아래와 같이 키 페어를 생성해줍니다.

키 페어 유형 : RSA

프라이빗 키 파일 형식 : .pem

인스턴스 생성 및 내부 설치 작업

1. OnPrem VPC 내 인스턴스 생성

EC2 이름 : OnPrem-Server

AMI : Amazon Linux 2 AMI (HVM) – Kernel 5.10, SSD Volume Type

인스턴스 유형 : t3.nano

Key Pair : 앞서 생성했던 Peter_VPNTest_Key

  • 네트워크 설정
    • VPC : OnPrem-vpc
    • 서브넷 : Onprem-subnet-Public1
    • 퍼블릭 IP : 활성화
    • 보안 그룹 : 앞서 생성하였던 OnPrem-SSH-SG, OnPrem-openswan-SG, OnPrem-PingTest-SG

2. 생성한 OnPrem EC2 인스턴스에 SSH 접속 및 openswan 설치

  • ssh로 OnPrem EC2에 접속해 openswan을 아래와 같이 설치 합니다.
[ec2-user@ip-10-0-0-195 ~\]$ sudo su -
[root@ip-10-0-0-195 ~\]# yum install -y openswan
  • /etc/ipsec.conf 파일을 열어서 include /etc/ipsec.d/*.conf 라인의 주석을 해제합니다. 만일 이미 해제되어 있다면 그대로 두시면 됩니다.
[root@ip-10-0-0-195 ~\]# vim /etc/ipsec.conf
...
# It is best to add your IPsec connections as separate files in /etc/ipsec.d/
include /etc/ipsec.d/\*.conf

※ vi 편집기에서 Ins를 누르면 편집가능하고 나갈때는 ESC 누른 뒤 :wq! 를 하시면 저장 후 종료가 됩니다.

  • 이번에는 /etc/sysctl.conf 파일을 열어서 아래의 내용을 추가해줍니다.
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.accept_source_route = 0
  • 그런 다음 아래의 명령으로 내트워크 서비스를 재시작 해줍니다.
[root@ip-10-0-0-195 ~\]# systemctl restart network

3. Cloud VPC 내 인스턴스 생성

EC2 이름 : Cloud-Server

AMI : Amazon Linux 2 AMI (HVM) – Kernel 5.10, SSD Volume Type

인스턴스 유형 : t3.nano

Key Pair : 앞서 생성했던 Peter_VPNTest_Key

  • 네트워크 설정
    • VPC : Cloud-vpc
    • 서브넷 : Cloud-subnet-Public1
    • 퍼블릭 IP : 활성화
    • 보안 그룹 : 앞서 생성하였던 Cloud-SSH-SG, Cloud-PingTest-SG

VPN Connection 연결 과정

1. Customer Gateway(CGW) 생성

이름 : OnPrem-CGW

BGP ASN : 65000

IP주소 : 13.228.78.255 (OnPrem-Server EC2의 퍼블릭 IP)

2. Virtual Private Gateway(VGW) 생성

이름 : AWS-OnPrem-VGW

Autonomous System Number(ASN) : Amazon 기본 ASN

아래와 같이 생성한 VGW를 Cloud-VPC에 Attach 시켜줍니다.

3. VPN Connection

아래와 같이 VPN Connection을 생성하여 줍니다.

이름 : AWS-OnPrem-Connection

대상 게이트웨이 유형 : 가상 프라이빗 게이트웨이(VGW) → AWS-OnPrem-VGW

고객 게이트웨이 : 기존 → OnPrem-CGW

정적 접두사 : 172.32.0.0/16 → OnPrem VPC의 IPv4 CIDR 대역을 기입

※ 선택 사항

  • 로컬 IPv4 네트워크 CIDR : 고객 게이트웨이와 VPN상에서 통신할 대역을 제한
  • 원격 IPv4 네트워크 CIDR : AWS측과 VPN상에서 통시할 대역을 제한

※ 터널 옵션 항목은 기입하지 않아도 AWS에서 자동으로 생성해줍니다.

따라서 이번 실습에서는 따로 옵션 지정 없이 그대로 사용할 예정입니다.

만일 사전에 준비된 키가 있다면 입력하여 사용 하실 수 있습니다.

VPN Connection을 생성하고 State가 available이 될 때 까지 잠시 기다린 후 하단의 Tunnel Details 항목에서 2개의 VPN Tunnel을 확인할 수 있습니다. 아직은 두 터널 모두 Down 상태인 것이 정상입니다.

4. Configuration 다운로드

다시 Site-to-Site VPN Connection 메뉴로 돌아와서 AWS-OnPrem-Connection을 선택하고 상단의 Download Configuration 클릭합니다.

아래와 같이 구성을 맞추고 다운로드 합니다.

공급 업체 : openswan

플랫폼 : openswan

소프트웨어 : openswan 2.6.38+

IKE버전 : ikev1

  • 다운로드 화면

5. openswan 설정

  • OnPrem-Server EC2에 SSH로 접속한 상태에서 root 권한으로 전환합니다.
[ec2-user@ip-10-0-0-195 ~]$ sudo su -
  • 이 단계에서부터 필요한 내용은 앞서 다운로드한 Configuration 파일에서 그대로 복사합니다.
  • /etc/ipsec.d/aws.conf 설정을 아래와 형식에 맞게 내용을 수정 후 저장해줍니다.
[root@ip-172-32-10-234 ipsec.d]# vim /etc/ipsec.d/aws.conf

conn Tunnel1
authby=secret
auto=start
left=%defaultroute
leftid=13.228.78.255
right=18.143.239.236
type=tunnel
ikelifetime=8h
keylife=1h
phase2alg=aes_gcm
ike=aes128-sha1
keyingtries=%forever
keyexchange=ike
leftsubnet=172.32.0.0/16
rightsubnet=52.0.0.0/16
dpddelay=10
dpdtimeout=30
dpdaction=restart_by_peer
  • /etc/ipsec.d/aws.secrets 설정을 아래와 같이 다운로드한 Configuration 파일에서 Pre-Shared Key 값을 붙여 넣습니다.
13.228.78.255 18.143.239.236: PSK "u94wi4E9Ybba1tmS4GrQyXL8MMYdXKwl"
<위 값은 사람마다 다름>
  • 아래 명령을 실행하여 openswan(ipsec) 서비스 시작 해줍니다.
systemctl start ipsec.service
systemctl enable ipsec.service
systemctl status ipsec.service
  • 아래와 같이 정상적으로 Active 되었는지 확인합니다.

라우팅 테이블 전파 활성화 및 PingTest

전파를 활성화 하기 전 Cloud VPC내의 EC2(Cloud-Server)에서 OnPrem VPC 내의 EC2(Cloud-Server) 프라이빗 ip로 ping 테스트를 실시하면 아래와 같이 ping이 가지 않는 것을 확인 할 수 있습니다.

VGW를 통해 CGW와 연결되어 VPN이 구성되게 되는데, 이 과정에서 둘 사이의 라우팅 테이블을 주고받기 위해서는 AWS즉, Cloud VPC의 라우팅 테이블에서 라우팅 전파 옵션을 활성화 시켜야 합니다.

왼쪽 메뉴에 Route Tables을 선택한 후 Cloud-rtb-public를 선택해 줍니다.

그 다음 Edit route propagation 버튼을 눌러 라우팅 전파 옵션을 편집해줍니다.

그렇다면 아래와 같이 자동으로 라우팅 테이블 라우팅 대상에 자동으로 입력되는 것을 확인하실 수 있습니다.

그런 다음 각 인스턴스의 Private IP로 Ping 테스트를 해보면 정상적으로 Ping이 수신 되는 것을 확인하실 수 있습니다.

이번 구성을 진행하면서 Site-to-Site VPN은 단순히 VPN 연결 리소스를 생성하는 것만으로 완성되는 것이 아니라는 점을 알 수 있었습니다. 양쪽 네트워크의 게이트웨이와 라우팅 설정, 터널 상태, 실제 트래픽이 이동하는 경로까지 함께 이해해야 정상적인 통신을 구성할 수 있었습니다.

처음에는 각각의 설정 항목이 독립적으로 보였지만, 직접 연결 과정을 따라가면서 모든 구성 요소가 하나의 네트워크 경로를 만들기 위해 서로 연결되어 있다는 점을 이해할 수 있었습니다. 이번 경험을 통해 하이브리드 네트워크의 기본적인 연결 구조를 보다 명확하게 익힐 수 있었으며, 앞으로 비슷한 VPN 연결 문제를 마주했을 때도 구성 요소별로 원인을 나누어 확인할 수 있을 것 같습니다.

글 | 메가존클라우드 Commercial Managed Unit 최영훈 매니저

게시물 주소가 복사되었습니다.

이런 콘텐츠도 있어요!