Skip to main content

Client VPN 구현하기

AWS Client VPN은 AWS 리소스 및 온프레미스 네트워크의 리소스에 안전하게 액세스할 수 있는 클라이언트 기반 관리형 VPN 서비스입니다. 클라이언트 VPN을 사용하면 OpenVPN 기반 VPN 클라이언트를 사용하여 어디서나 리소스에 액세스할 수 있습니다.

  • 사용자는 VPN 연결 응용 프로그램이 설치된 장치를 사용하여 집이나 사내에서 클라이언트 VPN 엔드포인트에 연결합니다.
  • 엔드포인트에 연결할 때 SAML, Directory Service를 사용하여 상호 인증 절차를 진행할 수 있습니다.
  • 엔드포인트의 연결된 서브넷의 ENI를 통해 VPC에 액세스할 수 있습니다. 이 때 ENI의 IP 주소로 Source NAT됩니다.
  • 보안그룹과 인증 규칙을 이용하여 액세스 제어도 가능합니다.
  • 온프레미스 환경과의 연결이 필요한 경우 VPC와 온프레미스 환경을 Direct Connect 또는 Site-to-Site VPN을 사용하여 연결할 수 있습니다.
  • 액세스 로그는 CloudWatch Logs로 출력할 수 있습니다.

VPC 생성

VPN을 통해 연결한 후 VPC의 리소스에 액세스하기 위해 4개의 사설 서브넷이 있는 VPC를 준비합니다. 두 개는 EC2 인스턴스가 위치하고 나머지 두 개는 VPN 엔드포인트에 연결된 ENI가 위치할 서브넷입니다.

198.19.0.0/16을 CIDR 대역으로 가지는 cvpn-hands-on VPC를 생성합니다.

clientvpn1

서브넷 생성

ap-northeast-2a

  • Name: Subnet1
  • IPv4: 198.19.1.0/24
  • Name: Subnet255
  • IPv4: 198.19.255.0/24

ap-northeast-2c

  • Name: Subnet2
  • IPv4: 198.19.2.0/24
  • Name: Subnet254
  • IPv4: 198.19.254.0/24

EC2 생성

  • Name: Server#1
  • AMI ID: ami-01d87646ef267ccd7
  • Architecture: 64bit(x86)
  • 키 페어 없이 계속 진행
  • VPC: cvpn-hands-on
  • Subnet: subnet1
  • 퍼블릭 IP 자동 할당: 비활성화
  • 보안그룹: cvpn-hands-on-sg (ICMP - IPv4 / 198.0.0.0/16)
  • 스토리지: 8GiB gp2

CloudWatch 생성

Client VPN 엔드포인트 생성시 아래 로그 스트림을 지정합니다.

  • 로그 그룹: /aws/clientvpn
  • 로그 스트림: connection-log

OpenVPN easy-rsa 클라이언트 및 서버의 인증서, 키 생성

OpenVPN easy-rsa를 사용하여 서버와 클라이언트의 인증서와 키를 생성하고 인증서와 키를 ACM에 업로드합니다. 상호 인증(인증서 기반)은 서버와 클라이언트의 인증서와 키를 모두 사용합니다. Active Directory 인증(사용자 기반)은 서버 인증서와 키를 사용합니다.

  • OpenVPN easy-rsa 리포지토리의 복제본을 로컬 컴퓨터에 만들어 easy-rsa/easyrsa3 폴더로 이동합니다.
mkdir client-vpn-workshop && cd client-vpn-workshop
git clone https://github.com/OpenVPN/easy-rsa.git && cd easy-rsa/easyrsa3
  • 새 PKI 환경을 초기화합니다.
./easyrsa init-pki
  • 새 인증 기관(CA)를 빌드하려면 이 명령을 실행하고 프롬프트를 따릅니다.
echo yes | ./easyrsa build-ca nopass
  • 서버 인증서와 키를 생성합니다.
./easyrsa build-server-full server nopass
  • 클라이언트 인증서와 키를 생성합니다. 클라이언트 인증서와 클라이언트 개인 키는 클라이언트를 설정할 때 필요하므로 반드시 저장해야 합니다.
./easyrsa build-client-full client1.domain.tld nopass
  • 서버 인증서와 서버 키, 클라이언트 인증서와 클라이언트 키를 사용자 지정 폴더에 복사합니다.
mkdir -p ~/custom_folder/ | cp pki/ca.crt ~/custom_folder/ | cp pki/issued/server.crt ~/custom_folder/ | cp pki/private/server.key ~/custom_folder/ | cp pki/issued/client1.domain.tld.crt ~/custom_folder | cp pki/private/client1.domain.tld.key ~/custom_folder/
server.crt서버 인증서
server.key서버 인증서 키
client1.domain.tld.crt클라이언트 인증서
client1.domain.tld.key클라이언트 인증서의 키
ca.crtCA 인증서

ACM 생성

ACM 이동 - 인증서 가져오기 클릭

서버 인증서(ACM) 생성하기

  1. 아래 명령어 실행 후 인증서 본문에 붙여넣기
cd ~/custom_folder && sed -n -e '/BEGIN/,$p' server.crt | pbcopy
  1. 아래 명령어 실행 후 인증서 프라이빗 키에 붙여넣기
sed -n -e '/BEGIN/,$p' server.key | pbcopy
  1. 아래 명령어 실행 후 인증서 체인에 붙여넣기
sed -n -e '/BEGIN/,$p' ca.crt | pbcopy
  1. 인증서 업로드

클라이언트 인증서(ACM) 생성하기

  1. 아래 명령어 실행 후 인증서 본문에 붙여넣기
sed -n -e '/BEGIN/,$p' client1.domain.tld.crt | pbcopy
  1. 아래 명령어 실행 후 인증서 프라이빗 키에 붙여넣기
sed -n -e '/BEGIN/,$p' client1.domain.tld.key | pbcopy
  1. 아래 명령어 실행 후 인증서 체인에 붙여넣기
sed -n -e '/BEGIN/,$p' ca.crt | pbcopy
  1. 인증서 업로드

여기까지 OpenVPN easy-rsa를 사용하여 서버 및 클라이언트 인증서 및 키를 생성하여 ACM에 업로드를 완료합니다.

clientvpn2

AWS Clinet VPN 엔드포인트 구성

이 항목에서는 AWS Client VPN 엔드포인트를 구성합니다. 인증에는 인증서를 사용한 상호 인증을 사용하여 VPC (198.19.0.0/16)에 대한 액세스만 클라이언트 VPN 연결을 경유하도록 합니다.

VPC - Client VPN 엔드포인트 - 클라이언트 VPN 엔드포인트 생성

note

설정에서 분할 터널을 활성화하세요. 비활성화된 경우 모든 네트워크 연결이 클라이언트 VPN 연결을 통해 이루어지므로 인터넷 액세스 등에 영향을 줄 수 있습니다. 활성화하면 특정 네트워크(VPC)에 대한 액세스만 클라이언트 VPN 연결을 통해 이루어집니다.

Client VPN 엔드포인트 생성

  • 이름: cvpn-hands-on
  • 클라이언트 IPv4 CIDR: 100.64.0.0/22 (RFC 6598)

인증 정보

  • 서버 인증서 ARN: 서버 인증서 선택
  • 인증 옵션: 상호 인증 사용
  • 클라이언트 인증서 ARN: 클라이언트 인증서 선택

연결 로깅

  • CloudWatch Logs 로그 그룹 이름: /aws/clientvpn
  • CloudWatch Logs 로그 스트림 이름: connection-log

기타 파라미터

  • 전송 프로토콜 - UDP
  • VPC ID - cvpn-hands-on
  • VPN 포트 443
  • 세션 제한 시간 24

이제 생성된 Client VPN 엔드포인트에 연결할 각 서브넷을 선택하여 해당 서브넷에 네트워크 인터페이스를 생성합니다.

대상 네트워크 연결

  • VPC: cvpn-hands-on

  • 연결할 서브넷 선택: subnet255

  • VPC: cvpn-hands-on

  • 연결할 서브넷 선택: subnet254

VPC의 CIDR를 타겟으로 하여 권한 부여 규칙을 추가합니다.

권한 부여 규칙 추가

  • 액세스를 활성화할 대상 네트워크 198.19.0.0/16
  • 다음에 대한 액세스 권한 부여: 모든 사용자에게 액세스 허용

여기까지 완료한 후 Client VPN 엔드포인트가 활성화된 후 클라이언트 구성 다운로드를 클릭합니다.

클라이언트 구성 다운로드

이 항목에서는 AWS Client VPN 엔드포인트를 구성했습니다. 인증에는 인증서를 사용한 상호 인증을 사용하여 VPC(198.19.0.0/16)에 대한 액세스만 클라이언트 VPN 연결을 경유하도록 설정했습니다.

Client VPN 다운로드 및 연결

AWS Client VPN download

clientvpn3

클라이언트 구성 파일 편집

vim ~/downloads/downloaded-client-config.ovpn
  • 새 터미널을 열고 아래 명령어로 복사한 클라이언트 인증서 본문을 <cert></cert>사이에 붙여넣기 합니다.
sed -n -e '/BEGIN/,$p' ~/custom_folder/client1.domain.tld.crt | pbcopy
  • 아래 명령어로 복사한 클라이언트 인증서 키를 <key></key> 사이 붙여넣기 합니다.
sed -n -e '/BEGIN/,$p' ~/custom_folder/client1.domain.tld.key | pbcopy
  • AWS Client VPN 클라이언트 프로필 선택 -> 클라이언트 구성 다운로드 파일 선택 -> 연결

clientvpn4

연결 테스트

ping -c 5 [ec2-private-ip]
netstat -rn

198.19.0.0/16이 포함되었는지 확인합니다. 클라이언트 CIDR에서 지정한 100.64.0.0/22에서 세분화된 주소가 할당되었음을 알 수 있습니다.

Clean UP

  • 클라이언트 VPN 엔드퐁니트 삭제
  • 대상 네트워크 연결 해제
  • EC2 인스턴스 종료
  • CloudWatch 로그 스트림, 로그 그룹 삭제
  • ACM 삭제
Simple AD

서울 리전은 Simple AD가 활성화되지 않습니다. Simple AD를 상호 기반 인증으로 사용하기 위해서는 다른 리전을 선택하세요.