Openswan으로 AWS Site-to-Site VPN 구축하기

Young Woo Jung
Saltware
Published in
9 min readMar 15, 2020
Photo by Daniel Jerez on Unsplash

VPN(Virtual Private Network)은 인터넷으로 연결된 두개의 다른 네트워크에 있는 호스트들 간의 통신을 암호화된 연결방식으로 전송해서 마치 동일한 네크워크에 있는것처럼 안전한 통신을 할수있게 해줍니다.

일반적으로 AWS 환경에 있는 VPC와 On-premise 데이터센터간의 통신이 필요할때 AWS Site-to-Site VPN을 이용해서 쉽고 안전하게 연결할수 있습니다. AWS Direct Connect를 이용해서 AWS Network와 On-premise 데이터센터를 물리적으로 연결하는 방법도 있지만 비용이..

이번 포스팅에서는 아래와 같은 환경을 구축해서 AWS Site-to-Site VPN 구축을 실습해 보겠습니다.

  1. AWS에 172.16.0.0/16 IP 대역의 VPC를 생성합니다
  2. AWS에 10.0.0.0/16 IP 대역의 VPC를 생성하고 On-Premise 네트워크라고 가정합니다
  3. AWS VPC에 VGW(Virtual Private Gateway)를 생성합니다
  4. On-Premise VPC에 EC2를 생성하고 Openswan을 설치해서 Customer Gateway로 가정합니다
  5. AWS VPC의 VGW와 On-Premise VPC의 Customer Gateway간의 Site-to-Site VPN 연결을 생성합니다
  6. AWS Instance와 On-Premise Instance간의 Private 통신을 테스트합니다

실습에 필요한 기본적인 VPC 구성과 EC2 인스턴스들은 해당 링크를 클릭하면 CloudFormation 스택으로 통해서 구축됩니다

우선 AWS VPC에서 VPN 구성을 해보겠습니다.

  1. AWS Management Console 에서 좌측 상단에 있는 [Services] 를 선택하고 검색창에서 VPC를 검색하거나 [Networking & Content Delivery] 밑에 있는 [VPC] 를 선택
  2. 좌측 패널 Virtual Private Network (VPN) 탭 아래 Virtual Private Gateways 클릭 → [Create Virtual Private Gateway] → Name tag = aws-vpc-vgw → ASN = Amazon default ASN → [Create Virtual Private Gateway]
  3. 생성된 Virtual Private Gateway를 선택 → ActionsAttach to VPCVPC = aws-vpc → [Yes, Attach]
  4. 좌측 패널에서 Customer Gateways 클릭 → [Create Customer Gateway] → Name = onprem-cgw, Routing = Static, IP address = OnpremVPN 인스턴스의 Public IP 주소 입력 → [Create Customer Gateway]
  5. 좌측 패널에서 Site-to-Site VPN Connections 클릭 → [Create VPN Connection] → Name = onprem-vpn, Target Gateway Type = Virtual Private Gateway, Virtual Private Gateway = Step 2에서 생성한 VGW, Customer Gateway = Existing, Customer Gateway ID = Step 4에서 생성한 CGW, Routing Options = Static, IP Prefixes = 10.0.0.0/16 → [Create VPN Connection]
  6. 생성된 VPN Connection를 선택 → Download ConfigurationVendor = Generic, Platform = Generic, Software = Vendor Agnostic → [Download]

On-Premise 환경의 Customer Gateway에 VPN 설정을 하겠습니다

  1. EC2 Dashboard에서 OnpremVPN 인스턴스를 선택 → ConnectConnection Method = Session Manager → [Connect]
  2. Openswan 설치: sudo yum install openswan -y
  3. Openswan 설정파일을 생성하고 sudo vi /etc/ipsec.d/aws.conf 아래의 내용을 넣어줍니다. <CUSTOMER_GATEWAY_IP_ADDRESS>는 OnpremVPN 인스턴스의 IP주소를 넣어줍니다. <TUNNEL1_IP_ADDRESS><TUNNEL2_IP_ADDRESS>에는 위에서 다운받은 VPN Configuration 파일을 열어보면 각각의 IPSec Tunnel #1, IPSec Tunnel #2 아래 #3: Tunner Interface Configuration에 있는 Virtual Private Gateway 주소 넣어줍니다

4. Pre-Shared Key 설정파일을 생성하고 sudo vi /etc/ipsec.d/aws.secrets 아래의 내용을 넣어줍니다. 각각 Tunnel에 대한 Pre-Shared Key 정보는 위에서 다운받은 VPN Configuration 파일안에 #1: Internet Key Exchange Configuration 에서 확인할수 있습니다.

<CUSTOMER_GATEWAY_IP> <TUNNEL1_IP>: PSK "<TUNNEL1 PSK>"
<CUSTOMER_GATEWAY_IP> <TUNNEL2_IP>: PSK "<TUNNEL2 PSK>"

예를 들어서, OnpremVPN 인스턴스의 Public IP 주소가 123.123.123.123, Tunnel 1 IP 주소가 124.124.124.124, Tunnel 1 PSK가 asdf124, Tunnel 2 IP 주소가 125.125.125.125, Tunnel 2PSK가 asdf125 라고 한다면

123.123.123.123 124.124.124.124: PSK "asdf123"
123.123.123.123 125.125.125.125: PSK "asdf125"

5. 다음과 같은 내용을 /etc/sysctl.conf에 추가해서 OnpremVPN 인스턴스의 IP Forwarding option을 활성화합니다.

net.ipv4.ip_forward = 1

6. EC2 Dashboard에서 OnpremVPN 인스턴스를 선택 → ActionsNetworkingChange Source/Dest. Check → [Yes, Disable]

7. 변경된 사항을 적용하기 위해서 Network 서비스와 Openswan을 재시작합니다

sudo service network restart
sudo service ipsec restart

8. VPC Dashboard에서 위에서 생성한 VPN Connection을 선택하고 Tunnel Details 에서 두개의 Tunnel에 대한 Status가 UP이 되었는지 확인합니다.

이제 VPN 연결은 완료되었습니다. 하지만 Routing 설정을 해줘야 정상적인 통신이 가능합니다.

우선 On-Premise VPC에서 AWS VPC로 가는 Route를 설정합니다. 10.0.0.0/16에서 172.16.0.0/16으로 가는 트래픽을 Customer Gateway (OnpremVPN)으로 보냅니다.

  1. VPC Dashoard에서 Route Tables 클릭 → onprem-public-rt 선택 → RouteEdit routes Add routesDestination = 172.16.0.0/16, Target = OnpremVPN 인스턴스 ID → [Save routes]

AWS VPC에서 On-Premise VPC로 가는 트래픽을 Site-to-Site VPN이 연결된 VGW로 보냅니다

  1. VPC Dashoard에서 Route Tables 클릭 → aws-public-rt 선택 → Route PropagationEdit route propagation aws-vpc-vgw에 대한 Propagate 체크→ [Save]
  2. Routes에서 Destination = 10.0.0.0/16, Target = aws-vpc-vgw ID 된 Route가 자동으로 추가된걸 확인할수 있습니다.

마지막으로 방화벽 설정만 해주면 되는데요.

OnpremVPN 인스턴스 Security Group에 10.0.0.0/16 (내부 네트워크) 와 172.16.0.0/16 (AWS VPC) 에서 오는 트래픽에 대한 Inbound 룰을 추가합니다.

OnpremInstance 인스턴스 Security Group에 172.16.0.0/16 (AWS VPC) 에서 오는 트래픽에 대한 Inbound 룰을 추가합니다.

AWSInstance 인스턴스 Security Group에 10.0.0.0/16(AWS VPC) 에서 오는 트래픽에 대한 Inbound 룰을 추가합니다.

이제 AWSInstance에 접속해서 OnpremInstance의 Private IP 주소 Ping을 날려봅니다. 다시 OnpremInstance에 접속해서 AWSInstance의 Private IP 주소 Ping을 날려봅니다

정상적으로 작동되는 것이 확인되면 VPN Connection, VGW, CGW를 삭제하고 실습 초기에 생성한 CloudFormation 스택을 삭제합니다.

--

--