들어가기 전에..

앞서 AWS Client VPN 게시글에서 AWS OpenVPN 관리형서비스 구축방법을 설명드렸습니다. 
이번에는 세부 제어가 가능한 OpenVPN Access Server에 대해서 설명드리겠습니다.
우선 대략적인 비용을 살펴보면 아래와 같습니다.

AWS Client VPN(관리형)월비용OpenVPN Access Server월비용
엔드포인트 시간($0.1) :1개$73.00EC2 요금(t3.small)$18.98
연결 시간($0.05) : 900시간$45.00라이선스 5명$51.10
연결 시간($0.05) : 1800시간$90.00라이선스 10명$73.00

결론. OpenVPN Access Server 승

AWS Client VPN(관리형)월비용Openvpn Access Server월비용비용 차이
기본 비용 + 연결시간 만큼 비용 지불
( 20일 9시간 사용기준 )
5명$118.00사용여부와 상관없이 지불
( t3.small 서버 기준 )
5명$70.08$47.92
10명$163.0010명$91.98$71.02

[ OpenVPN Access Server 특징]

1. WEB UI 제공

– UI를 통한 손쉬운 사용자 추가/삭제

– 사용자별 암호관리(사용자가 직접 암호변경 가능)

– 사용자별 서버 접근제어 가능

– 그룹을 지정하여 서버 접근제어 가능

– 로그 조회 및 내역 다운로드(CSV)

– 사용자 페이지에서 Client 프로그램 및 접속key 다운로드 가능

2. 비용절감

– 기존  ClientVPN 대비 최소 월 $48 절감 효과

3. 단점

– 라이선스 체계가 동시접속 기준으로 발급

– 서버관리 필요

– 이중화(Cluster) 구성하려면 추가 비용 발생

1. 목표 구성도

1.1 기본 VPC 삭제

 

 

1.2 키페어 생성

1.4 자원 생성

가. VPC : 
– DEV-VPC: 10.10.0.0/16
나. 서브넷 : 
– DEV-Public-Subnet-AZ1 : 10.10.1.0/24
– 
DEV-Public-Subnet-AZ3 : 10.10.3.0/24
– DEV-Private-Subnet-AZ1 : 10.10.11.0/24
– DEV-Private-Subnet-AZ3 10.10.13.0/24
– DEV-DB-Subnet-AZ1 10.10.21.0/24
– DEV-DB-Subnet-AZ3 10.10.23.0/24
다. 인터넷 GW
– DEV-IGW
라. 라우팅테이블 : 
– 
DEV-Public-Routes
– DEV-Private-Routes
– DEV-DB-Routes
마. 보안그룹 :
– DEV-Public-Security-Group : Port 22, 80, 443, 943, 1194(udp)
– DEV-Private-Security-Group : Port 22, 1194(udp)
– DEV-DB-Security-Group : Port 3306

## =================== VERSION ===================
AWSTemplateFormatVersion“2010-09-09”
## =================== DESCRIPTION ===================
Description>
  AWS CloudFormation sample template 
  Create an IAM User and optionally attach it to IAM group(s)
  AWS doc: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html
## =================== PARAMETERS ===================
Parameters:
  1Stage:
    DescriptionDEV, STG, PRD
    TypeString
    Default“DEV”
    AllowedPattern“[a-zA-Z0-9]*”
    ConstraintDescription“DEV, STG, PRD”
  2VpcCIDR:
    DescriptionPlease enter the IP range (CIDR notation) for this VPC
    TypeString
    Default10.10.0.0/16
  3PublicSubnet1CIDR:
    DescriptionPlease enter the IP range (CIDR notation) for the public subnet in the first Availability Zone
    TypeString
    Default10.10.1.0/24
  3PublicSubnet3CIDR:
    DescriptionPlease enter the IP range (CIDR notation) for the public subnet in the second Availability Zone
    TypeString
    Default10.10.3.0/24
  4PrivateSubnet1CIDR:
    DescriptionPlease enter the IP range (CIDR notation) for the public subnet in the first Availability Zone
    TypeString
    Default10.10.11.0/24
  4PrivateSubnet3CIDR:
    DescriptionPlease enter the IP range (CIDR notation) for the private subnet in the second Availability Zone
    TypeString
    Default10.10.13.0/24
  5DBSubnet1CIDR:
    DescriptionPlease enter the IP range (CIDR notation) for the public subnet in the first Availability Zone
    TypeString
    Default10.10.21.0/24
  5DBSubnet3CIDR:
    DescriptionPlease enter the IP range (CIDR notation) for the private subnet in the second Availability Zone
    TypeString
    Default10.10.23.0/24
  KeyName:
    DescriptionName of an existing EC2 KeyPair to enable SSH access to the instances. Linked to AWS Parameter
    TypeAWS::EC2::KeyPair::KeyName
    DefaultDEV-KeyPair # PRD
    ConstraintDescriptionmust be the name of an existing EC2 KeyPair.
 
## =================== RESOURCES ===================
Resources:
  VPC:
    TypeAWS::EC2::VPC
    Properties:
      CidrBlock!Ref 2VpcCIDR
      EnableDnsSupporttrue
      EnableDnsHostnamestrue
      Tags:
        – KeyName
          Value!Sub “${1Stage}-VPC”
        – Key1Stage
          Value!Ref 1Stage
  InternetGateway:
    TypeAWS::EC2::InternetGateway
    Properties:
      Tags:
        – KeyName
          Value!Sub “${1Stage}-IGW”
        – Key1Stage
          Value!Ref 1Stage
  InternetGatewayAttachment:
    TypeAWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId!Ref InternetGateway
      VpcId!Ref VPC
  PublicSubnet1:
    TypeAWS::EC2::Subnet
    Properties:
      VpcId!Ref VPC
      AvailabilityZoneap-northeast-2a
      CidrBlock!Ref 3PublicSubnet1CIDR
      MapPublicIpOnLaunchtrue
      Tags:
        – KeyName
          Value!Sub “${1Stage}-Public-Subnet-AZ1”
        – Key1Stage
          Value!Ref 1Stage
  PublicSubnet3:
    TypeAWS::EC2::Subnet
    Properties:
      VpcId!Ref VPC
      AvailabilityZoneap-northeast-2c
      CidrBlock!Ref 3PublicSubnet3CIDR
      MapPublicIpOnLaunchtrue
      Tags:
        – KeyName
          Value!Sub “${1Stage}-Public-Subnet-AZ3”
        – Key1Stage
          Value!Ref 1Stage
  PrivateSubnet1:
    TypeAWS::EC2::Subnet
    Properties:
      VpcId!Ref VPC
      AvailabilityZoneap-northeast-2a
      CidrBlock!Ref 4PrivateSubnet1CIDR
      MapPublicIpOnLaunchfalse
      Tags:
        – KeyName
          Value!Sub “${1Stage}-Private-Subnet-AZ1”
        – Key1Stage
          Value!Ref 1Stage
  PrivateSubnet3:
    TypeAWS::EC2::Subnet
    Properties:
      VpcId!Ref VPC
      AvailabilityZoneap-northeast-2c
      CidrBlock!Ref 4PrivateSubnet3CIDR
      MapPublicIpOnLaunchfalse
      Tags:
        – KeyName
          Value!Sub “${1Stage}-Private-Subnet-AZ3”
        – Key1Stage
          Value!Ref 1Stage
  DBSubnet1:
    TypeAWS::EC2::Subnet
    Properties:
      VpcId!Ref VPC
      AvailabilityZoneap-northeast-2a
      CidrBlock!Ref 5DBSubnet1CIDR
      MapPublicIpOnLaunchtrue
      Tags:
        – KeyName
          Value!Sub “${1Stage}-DB-Subnet-AZ1”
        – Key1Stage
          Value!Ref 1Stage
  DBSubnet3:
    TypeAWS::EC2::Subnet
    Properties:
      VpcId!Ref VPC
      AvailabilityZoneap-northeast-2c
      CidrBlock!Ref 5DBSubnet3CIDR
      MapPublicIpOnLaunchtrue
      Tags:
        – KeyName
          Value!Sub “${1Stage}-DB-Subnet-AZ3”
        – Key1Stage
          Value!Ref 1Stage
  PublicRouteTable:
    TypeAWS::EC2::RouteTable
    Properties:
      VpcId!Ref VPC
      Tags:
        – KeyName
          Value!Sub “${1Stage}-Public-Routes”
        – Key1Stage
          Value!Ref 1Stage
  PrivateRouteTable:
    TypeAWS::EC2::RouteTable
    Properties:
      VpcId!Ref VPC
      Tags:
        – KeyName
          Value!Sub “${1Stage}-Private-Routes”
        – Key1Stage
          Value!Ref 1Stage
  DBRouteTable:
    TypeAWS::EC2::RouteTable
    Properties:
      VpcId!Ref VPC
      Tags:
        – KeyName
          Value!Sub “${1Stage}-DB-Routes”
        – Key1Stage
          Value!Ref 1Stage
  DefaultPublicRoute:
    TypeAWS::EC2::Route
    DependsOnInternetGatewayAttachment
    Properties:
      RouteTableId!Ref PublicRouteTable
      DestinationCidrBlock0.0.0.0/0
      GatewayId!Ref InternetGateway
  DefaultDBRoute:
    TypeAWS::EC2::Route
    DependsOnInternetGatewayAttachment
    Properties:
      RouteTableId!Ref DBRouteTable
      DestinationCidrBlock0.0.0.0/0
      GatewayId!Ref InternetGateway
  PublicSubnet1RouteTableAssociation:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId!Ref PublicRouteTable
      SubnetId!Ref PublicSubnet1
  PublicSubnet3RouteTableAssociation:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId!Ref PublicRouteTable
      SubnetId!Ref PublicSubnet3
  PrivateSubnet1RouteTableAssociation:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId!Ref PrivateRouteTable
      SubnetId!Ref PrivateSubnet1
  PrivateSubnet3RouteTableAssociation:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId!Ref PrivateRouteTable
      SubnetId!Ref PrivateSubnet3
  DBSubnet1RouteTableAssociation:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId!Ref DBRouteTable
      SubnetId!Ref DBSubnet1
  DBSubnet3RouteTableAssociation:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId!Ref DBRouteTable
      SubnetId!Ref DBSubnet3
  PublicSecurityGroup:
    Type‘AWS::EC2::SecurityGroup’
    Properties:
      GroupName!Sub “${1Stage}-Public-Security-Group”
      GroupDescriptionEnable SSH
      VpcId!Ref VPC
      SecurityGroupIngress:
        – IpProtocoltcp
          FromPort22
          ToPort22
          CidrIp0.0.0.0/0
          DescriptionSSH Service
        – IpProtocoltcp
          FromPort80
          ToPort80
          CidrIp0.0.0.0/0
          DescriptionHTTP Service
        – IpProtocoltcp
          FromPort443
          ToPort443
          CidrIp0.0.0.0/0
          DescriptionHTTPS Service
        – IpProtocoltcp
          FromPort943
          ToPort943
          CidrIp0.0.0.0/0
          DescriptionOpenVPN-Admin Web UI
        – IpProtocoludp
          FromPort1194
          ToPort1194
          CidrIp0.0.0.0/0
          DescriptionOpenVPN-Client Connect
      Tags:
        – KeyName
          Value!Sub “${1Stage}-Public-Security-Group”
        – Key1Stage
          Value!Ref 1Stage
  PrivateSecurityGroup:
    Type‘AWS::EC2::SecurityGroup’
    Properties:
      GroupName!Sub “${1Stage}-Private-Security-Group”
      GroupDescriptionEnable SSH
      VpcId!Ref VPC
      SecurityGroupIngress:
        – IpProtocoltcp
          FromPort’22’
          ToPort’22’
          CidrIp0.0.0.0/0
          DescriptionSSH Service
      Tags:
        – KeyName
          Value!Sub “${1Stage}-Private-Security-Group”
        – Key1Stage
          Value!Ref 1Stage
  DBSecurityGroup:
    Type‘AWS::EC2::SecurityGroup’
    Properties:
      GroupName!Sub “${1Stage}-DB-Security-Group”
      GroupDescriptionEnable Mysql
      VpcId!Ref VPC
      SecurityGroupIngress:
        – IpProtocoltcp
          FromPort‘3306’
          ToPort‘3306’
          CidrIp0.0.0.0/0
      Tags:
        – KeyName
          Value!Sub “${1Stage}-DB-Security-Group”
        – Key1Stage
          Value!Ref 1Stage
## =================== Outputs ===================
Outputs:
  VPC:
    DescriptionA reference to the created VPC
    Value!Ref VPC
  PublicSubnets:
    DescriptionA list of the public subnets
    Value!Join [ “,”, [ !Ref PublicSubnet1!Ref PublicSubnet3 ]]
  PrivateSubnets:
    DescriptionA list of the private subnets
    Value!Join [ “,”, [ !Ref PrivateSubnet1!Ref PrivateSubnet3 ]]
  DBSubnets:
    DescriptionA list of the DB subnets
    Value!Join [ “,”, [ !Ref DBSubnet1!Ref DBSubnet3 ]]
  PublicSubnet1:
    DescriptionA reference to the public subnet in the 1st Availability Zone
    Value!Ref PublicSubnet1
  PublicSubnet3:
    DescriptionA reference to the public subnet in the 3st Availability Zone
    Value!Ref PublicSubnet3
  PrivateSubnet1:
    DescriptionA reference to the public subnet in the 1st Availability Zone
    Value!Ref PrivateSubnet1
  PrivateSubnet3:
    DescriptionA reference to the public subnet in the 3st Availability Zone
    Value!Ref PrivateSubnet3
  PublicSecurityGroup:
    DescriptionSecurity group with no ingress rule
    Value!Ref PublicSecurityGroup
  PrivateSecurityGroup:
    DescriptionSecurity group with no ingress rule
    Value!Ref PrivateSecurityGroup

위에 자원생성 코드를 텍스트 파일 형태로 저장하고, 이파일을 업로드 합니다.

나머지는 기본값으로 둔채로 “다음” 최종 내역 확인 후 스택을 생성합니다.

아래와 같이 정상 생성 되어야 합니다.

 

2. OpenVPN 구성

2.1 제품 구독