AWS - Network 연결 옵션 (2): VPN


이 포스트는 AWS 에서 제공하는 관리형 VPN 서비스인 AWS Site-to-Site VPNAWS 클라이언트 VPN 에 대해 알아본 후 AWS Site-to-Site VPN 을 통해 AWS 와 온프레미스 간 VPN 통신(Private 대역 간 통신) 을 구성해본다.

AWS Site-to-Site VPN 기본 구성도 AWS 클라이언트 VPN 기본 구성도

VPN
공공 인터넷을 통해 가상의 사설 네트워크를 구성하여 Private 통신을 제공하는 기술로 데이터 암호화, 전용 연결 등 여러 보안 요구 사항을 충족할 수 있음


아래는 이번 포스트에서 다뤄볼 범위 도식화이다.

이번 포스트 범위 도식화


1. AWS Site-to-Site VPN (S2S)

AWS Site-to-Site VPN 은 두 개의 네트워크 도메인이 가상의 사설 네트워크 연결을 사용하여 Private 통신을 가능하게 하는 서비스로 표준 IPSec VPN 만 지원한다.

AWS S2S VPN 은 기본적으로 고가용성 아키텍처를 제공한다.
VPN Connection 을 생성하게 되면 제공되는 두 개의 Tunnel Endpoint 는 고가용성(HA)을 위해 서로 다른 AZ(Availability Zone) 에 생성되므로 두 개의 Tunnel Endpoint 와 각각 Tunnel 을 구성하여 Tunnel 이중화하는 것을 권장한다.

AWS S2S VPN 구성 요소 - VGW, Tunnel Endpoint 2개

S2S VPN 연결 생성 시 두 개의 VPN Tunnel 이 생성되고 이 두 개의 터널이 각각 다른 AZ 에 Tunnel Endpoint 를 갖음

AWS S2S Tunnel 이중화
AWS S2S VPN 의 SLA(Service Level Agreement) 는 한달에 5분 2초는 유지 관리를 위해 비활성될 수 있음.
AWS 측에서 정기적인 maintenance 시 각 Tunnel 에 대해 순차적으로 사용이 불가능할 수 있으므로 중요 서비스가 AWS VPN 을 통해 구성된다면 반드시 Tunnel 이중화 구성을 권고함


1.1. Site-to-Site VPN 관련 용어

VPN Connection

온프레미스(IDC or 회사망) 의 장비와 AWS VPC 간의 보안 연결이다.

VPN Tunnel

AWS VPC N/W 와 온프레미스 N/W 간 주고받을 수 있는 암호화된 링크이다.

가상 프라이빗 게이트웨이 (VGW, Virtual Private Gateway)

AWS 의 관리형 Site-to-Site VPN 의 Gateway 로 Site-to-Site VPN 연결에서 AWS 측에 있는 Gateway 로 VPC 연결하는데 사용된다.
VPN or Direct connect 와 함께 작동할 수 있다.

AWS Site-to-Site VPN 기본 구성도

고객 게이트웨이 (CGW, Customer Gateway)

AWS 에서 생성하는 리소스로 온프레미스 N/W 의 Customer Gateway Device 를 나타낸다. (= 온프레미스 장비의 정보 지정)
VGW 와 VPN 연결 설정을 위해 필요한 IPSec 정보 지정한다.

고객 게이트웨이 디바이스 (Customer Gateway Device)

온프레미스 장비 혹은 SW 애플리케이션으로 AWS Device 장애 or VPN 연결 정기 유지 관리 시 두 번째 터널로 자동으로 장애 조치되므로 연결이 끊기지 않는다.
따라서 CGW Device 구성 시 두 개의 터널을 구성하는 것이 중요하다. Customer Gateway Device


1.2. Site-to-Site VPN 특징

  • VPN 연결 협상 시 Responder 로 동작
    • VGW 는 통신 요청자(Initiator) 가 아니므로 VPN 협상은 항상 Customer Gateway Device(클라이언트 측) 에서 연결을 시도해야 함
    • IKE (Internet Key Exchange) 2 를 사용하면 VGW 가 통신 요청자가 될 수 있도록 설정 가능
    • VPN 연결 협상
  • VPN Tunnel 의 Idle Timeout
    • VPN Tunnel 연결 후 터널에 트래픽이 10초 이상 흐르지 않으면 터널은 Down 됨
    • 터널 유지를 위해 온프레미스에서 DPD (Dead Peer Detect) 를 설정하거나 일정 간격으로 Ping 을 발생시켜 터널을 유지하는 것을 권장함
    • 2020.08 부터 DPD 시간 초과 발생 시 AWS 가 IKE 세션을 다시 시작하도록 지정할 수 있음 (AWS 가 작업을 수행하지 않도록 지정도 가능)
  • 표준 IPSec 지원
    • 데이터 암호화와 인증에 관여하는 다양한 알고리즘 지원
    • IKE (Internet Key Exchange) version 1, 2 등
  • NAT-T (NAT Traversal) 지원
    • Customer Gateway Device 가 NAT 내부에 배치된 경우에도 NAT Traversal 을 지원하여 VPN 연결 가능
  • VPN 성능
    • VGW 의 1개 Tunnel 당 최대 1.25Gbps 성능
    • Transit Gateway 의 ECMP (Equal Cost Multi-Path) 사용 시 성능 향상 가능

ECMP (Equal Cost Multi-Path)
2개 이상의 연결을 1개의 논리적인 연결로 구성하는 기법 (클러스터링처럼)
이를 통해 대역폭 확장 가능


1.3. Site-to-Site VPN 라우팅 옵션

  • Static Routing
    • 사용자가 직접 온프레미스(원격 네트워크) 의 경로에 대해 설정
  • Dynamic Routing
    • BGP 라우팅 프로토콜을 사용하여 상대방으로부터 전달되는 네트워크 경로를 자동으로 인지하여 통신
    • 네트워크 정보를 수동으로 설정할 필요없이 동적으로 네트워크 정보 관리 가능

VPC Routing Table 의 경로 전파 옵션을 활성화하면 Routing Table 을 수정하지 않고 VGW 에 의해 전파되는 경로가 Routing Table 에 동적으로 업데이트 됨

동적으로 업데이트되는 경로는 Static/Dynamic Routing 모두 지원함


1.4. Site-to-Site VPN 라우팅 모니터링

AWS CloudWatch 를 통해 모니터링 가능하지만 제공되는 Metric 은 다른 리소스와 다르게 일부 제한적이며, 별도의 로그를 제공하지 않는다.
제공되는 Metric 은 아래 3가지가 있다.

  • TunnelDataIn
    • VPN Tunnel 을 통해 수신되는 데이터 (Byte)
  • TunnelDataOut
    • VPN Tunnel 을 통해 송신되는 데이터 (Byte)
  • TunnelState
    • VPN Tunnel 의 상태 (1: Tunnel 연결 상태, 0: Tunnel 연결 해제 상태)

1.5. Site-to-Site VPN 구성 시나리오

  • CGW Device 가 1대인 경우
  • CGW Device 가 2대이고, 해당 Device 2대가 클러스터링 지원
  • CGW Device 가 2대이고, 해당 Device 2대가 클러스터링 미지원 시 Static Routing 사용
  • CGW Device 가 2대이고, 해당 Device 2대가 클러스터링 미지원 시 Dynamic Routing (BGP) 사용

1.5.1. CGW Device 가 1대인 경우

온프레미스의 단일 VPN 구성 시 시나리오이다.
반드시 VPN Tunnel 이중화 구성 설정을 권장한다.

CGW 단일 구성

적은 비용으로 구성이 가능하지만 온프레미스 환경에 CGW Device 장애 등이 발생하면 대응 방안이 없다.


1.5.2. CGW Device 가 2대이고, 해당 Device 2대가 클러스터링 지원

온프레미스에 CGW Device 의 가용성을 위한 시나리오이다.
CGW Device 2대의 장비가 논리적으로 1대의 장비로 동작하는 클러스터링 설정이 필요하다.

CGW 클러스터링 구성

CGW Device 1대에 장애가 발생해도 나머지 1대가 지속적인 통신을 유지하여 HA 을 제공한다.


1.5.3. CGW Device 가 2대이고, 해당 Device 2대가 클러스터링 미지원 시 Static Routing 사용

CGW Device 가 클러스터링 미지원 시 CGW Device 의 이중화로 가용성을 높일 수 있다.
AWS VPN 연결 (연결 당 Tunnel Endpoint 2개) 을 2개 (Tunnel Endpoint 총 4개) 로 설정한다.
그리고 Active Tunnel 상태 감지를 위해 DPD (Dead Peer Detect) 나 ping 들을 사용하고, AWS VPC 네트워크 대역과 온프레미스 네트워크 대역 통신을 위해 Static Routing 을 설정한다.

CGW 2대 구성 - Static Routing 사용

네트워크 대역 추가나 삭제 시 수동으로 Static Routing 설정이 필요하다.


1.5.4. CGW Device 가 2대이고, 해당 Device 2대가 클러스터링 미지원 시 Dynamic Routing (BGP) 사용

AWS VPC 네트워크 대역과 온프레미스 네트워크 대역을 Dynamic Routing (BGP) 를 통해 자동으로 라우팅 경로을 알 수 있다.

CGW 2대 구성 - Dynamic Routing 사용

높은 HA 를 제공한다.
Tunnel 상태 이상 시 BGPBFD (Bidirectional Forwarding) 로 자동 감지하여 Standby Tunnel 이 Active Tunnel 로 사용된다.
네트워크 정보가 자동으로 갱신되며, 매번 수동 설정할 필요가 없다.


2. AWS 클라이언트 VPN

AWS S2S VPN 은 각 종단 간 고정된 IP 를 통해 VPN Tunnel 을 구성하는 반면
AWS 클라이언트 VPN 은 사용자 측의 IP 가 항상 유동적이다. (= 고정된 장소에서 VPN Tunnel 을 연결하는 것이 아니라 사용자 위치와 관계없이 VPN Tunnel 연결 가능)

AWS 클라이언트 VPN 구성 요소 - 클라이언트 VPN Endpoint, 최종 사용자

AWS 클라이언트 VPN 은 두 가지 유형의 사용자를 제공한다.

  • Administrator
    • 클라이언트 VPN Endpoint 를 구성하고 대상 네트워크, 권한 규칙, 라우팅 설정 등 구성 후 클라이언트 VPN Endpoint 구성 파일을 최종 사용자에게 전달
  • 최종 사용자
    • 전달받은 구성 파일을 통해 컴퓨터, 모바일 기기를 통해 클라이언트 VPN Endpoint 에 연결

AWS 클라이언트 VPN 에 접근 시도 시 인가된 사용자의 유무를 확인하는 인증 단계 진행 후 인증된 사용자는 부여된 권한을 이용하여 리소스에 접근이 가능하다.
권한 부여는 Security Group 과 네트워크 기반 권한을 부여할 수 있는 권한 규칙으로 제어 가능하다.


2.1. AWS 클라이언트 VPN 용어

클라이언트 VPN Endpoint

클라이언트 VPN 의 TLS (Transport Layer Security) 연결을 활성화하고 관리하기 위해 AWS 에 생성되는 리소스이다.
해당 Endpoint 에서 암호화된 사용자 트래픽을 복호화하여어 AWS 내의 리소스와 통신이 가능하다.

대상 네트워크

사용자가 AWS 클라이언트 VPN 을 통해 접근할 수 있는 네트워크로써, 클라이언트 VPN Endpoint 와 연결된다.
클라이언트 VPN Endpoint 와 연결되는 Subnet 은 HA 를 위해 서로 다른 AZ 에 배치해야 한다.

라우팅 테이블

클라이언트 VPN Endpoint 에 사용 가능한 대상 네트워크를 설정하는 라우팅 테이블이 있는데, 라우팅 설정을 통해 네트워크에 대한 경로를 설정할 수 있다.

권한 규칙

네트워크에 접근 가능한 사용자를 제한할 수 있다.
지정된 네트워크에 대해 접근을 허용하는 AD (Active Directory) 그룹을 구성하여 해당 그룹에 속한 사용자에 대해서만 접근할 수 있도록 구성 가능하다.
권한 규칙이 없으면 통신이 불가능하므로 반드시 구성해야 한다.

VPN 클라이언트

클라이언트 VPN Endpoint 에 연결되는 최종 사용자이다.
최종 사용자인 VPN 클라이언트는 OpenVPN 을 사용하여 AWS 클라이언트 VPN 에 연결할 수 있다.


2.2. AWS 클라이언트 VPN 특징

AWS 에서 제공하는 관리형 서비스닌 AWS 클라이언트 VPN 은 TLS (Transport Layer Security) 프로토콜을 사용하여 AWS 클라이언트 VPN Endpoint 와 사용자 간의 암호화 연결을 제공한다.
관리형 서비스이기 때문에 별도로 VPN 을 배포 및 관리하는 부담이 없으며, 사용자 수에 따라 자동 확장/축소가 되어 유연한 서비스 제공이 가능하다.

  • 접근 편리성
    • OpenVPN 클라이언트를 사용하여 위치와 상관없이 안전한 TLS 연결을 제공
  • 고가용성 및 유연성
    • 사용량에 따라 리소스를 자동으로 확장 및 축소
  • 보안 및 인증
    • AD (Active Directory) 및 인증서 기반 인증을 제공하여 인가된 사용자에 대한 접근 허용
  • 접근 제어
    • 네크워크 기반 접근 규칙을 정의하여 사용자 지정 보안 제어 가능
    • 클라이언트 연결에 대한 로그 제공

3. AWS 와 온프레미스 간 VPN 통신 테스트

AWS Site-to-Site VPN 을 통해 Private 대역 간 통신을 구성한다.

AWS VGW(AWS VPNGateway) 는 연결 당 1시간에 $0.05 비용 발생!!

  • 기본 환경 구성
    • CloudFormation 적용
    • CloudFormation 을 통해 생성된 자원 확인
    • 기본 통신 환경 검증
      • Instance 에서 기본 환경 검증
      • AWS Web Console 에서 기본 환경 검증
  • VPN 테스트
    • IDC-CGW 인스턴스에 VPN 설정
    • AWS VGW 확인
    • VPN 을 통한 통신 확인
    • VPN 을 통한 통신 흐름
  • Resource 삭제

목표 구성도


3.1. 기본 환경 구성

  • CloudFormation 적용
  • CloudFormation 을 통해 생성된 자원 확인
  • 기본 통신 환경 검증
    • Instance 에서 기본 환경 검증
    • AWS Web Console 에서 기본 환경 검증

기본 환경 구성도


3.1.1. CloudFormation 적용

[CloudFormation] - [Stacks]

CloudFormation Template Download

CloudFormation Template (펼쳐보기)
Parameters:
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances. Linked to AWS Parameter
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  LatestAmiId:
    Description: (DO NOT CHANGE)
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
    AllowedValues:
      - /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2

Resources:
  VPC1:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.60.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: aaIDC-VPC1
  InternetGateway1:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: aaIDC-IGW1
  InternetGatewayAttachment1:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway1
      VpcId: !Ref VPC1

  VPC2:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.50.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: aaAWS-VPC2
  InternetGateway2:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: aaAWS-IGW2
  InternetGatewayAttachment2:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway2
      VpcId: !Ref VPC2

  RouteTable1:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC1
      Tags:
        - Key: Name
          Value: aaIDC-PublicRT1
  DefaultRoute1:
    Type: AWS::EC2::Route
    DependsOn: InternetGatewayAttachment1
    Properties:
      RouteTableId: !Ref RouteTable1
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway1
  Subnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC1
      AvailabilityZone: !Select [0, !GetAZs '']
      CidrBlock: 10.60.0.0/24
      Tags:
        - Key: Name
          Value: aaIDC-VPC1-Public
  Subnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable1
      SubnetId: !Ref Subnet1

  RouteTable2:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC1
      Tags:
        - Key: Name
          Value: aaIDC-PrivateRT1
  Route2:
    Type: AWS::EC2::Route
    DependsOn: Instance1
    Properties:
      RouteTableId: !Ref RouteTable2
      DestinationCidrBlock: 10.50.0.0/16
      InstanceId: !Ref Instance1
  Subnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC1
      AvailabilityZone: !Select [0, !GetAZs '']
      CidrBlock: 10.60.1.0/24
      Tags:
        - Key: Name
          Value: aaIDC-VPC1-Private
  Subnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable2
      SubnetId: !Ref Subnet2

  Instance1ENIEth0:
    Type: AWS::EC2::NetworkInterface
    Properties:
      SubnetId: !Ref Subnet1
      Description: Instance1 eth0
      GroupSet:
        - !Ref SG1
      PrivateIpAddress: 10.60.0.100
      SourceDestCheck: false
      Tags:
        - Key: Name
          Value: aaIDC-CGW eth0
  VPCEIP1:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
  VPCAssociateEIP1:
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId: !GetAtt VPCEIP1.AllocationId
      NetworkInterfaceId: !Ref Instance1ENIEth0

  VPC2VPNGW:
    Type: AWS::EC2::VPNGateway
    Properties:
      Type: ipsec.1
      Tags:
        - Key: Name
          Value: aaAWS-VPNGW
  VPC2AttachVPNGW:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
        Ref: VPC2
      VpnGatewayId:
        Ref: VPC2VPNGW
  VPC2CGW:
    Type: 'AWS::EC2::CustomerGateway'
    DependsOn: VPCEIP1
    Properties:
      Type: ipsec.1
      BgpAsn: 65000
      IpAddress:
        Ref: VPCEIP1
      Tags:
        - Key: Name
          Value: aaIDC-VPN-CGW

  VPCAWSSubnetRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:
        Ref: VPC2
      Tags:
        - Key: Name
          Value: aaAWS-PublicRT

  VPCAWSInternetRoute:
    Type: AWS::EC2::Route
    DependsOn: InternetGateway2
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId:
        Ref: InternetGateway2
      RouteTableId:
        Ref: VPCAWSSubnetRouteTable

  VPCAWSSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC2
      CidrBlock: 10.50.1.0/24
      AvailabilityZone: !Select [0, !GetAZs '']
      Tags:
        - Key: Name
          Value: aaAWS-VPC2-Public

  VPCAWSSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId:
        Ref: VPCAWSSubnetRouteTable
      SubnetId:
        Ref: VPCAWSSubnet

  VPCAWSVpnConnection:
    Type: 'AWS::EC2::VPNConnection'
    Properties:
      Type: ipsec.1
      StaticRoutesOnly: true
      CustomerGatewayId: !Ref VPC2CGW
      VpnGatewayId: !Ref VPC2VPNGW
      VpnTunnelOptionsSpecifications:
        - PreSharedKey: cloudneta
      Tags:
        - Key: Name
          Value: aaAWS-VPNConnection-IDC

  VPCAWSVpnConnectionRoute:
    Type: 'AWS::EC2::VPNConnectionRoute'
    Properties:
      DestinationCidrBlock: 10.60.0.0/16
      VpnConnectionId: !Ref VPCAWSVpnConnection

  VPNAWSGatewayRoutePropagation:
    Type: AWS::EC2::VPNGatewayRoutePropagation
    DependsOn: VPCAWSVpnConnection
    Properties:
      RouteTableIds:
        - !Ref VPCAWSSubnetRouteTable
      VpnGatewayId: !Ref VPC2VPNGW

  Instance1:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: t2.micro
      KeyName: !Ref KeyName
      Tags:
        - Key: Name
          Value: aaIDC-CGW
      NetworkInterfaces:
        - NetworkInterfaceId: !Ref Instance1ENIEth0
          DeviceIndex: 0
      UserData:
        Fn::Base64: |
          #!/bin/bash
          hostnamectl --static set-hostname aaIDC-CGW
          yum -y install tcpdump openswan
          cat <<EOF>> /etc/sysctl.conf
          net.ipv4.ip_forward=1
          net.ipv4.conf.all.accept_redirects = 0
          net.ipv4.conf.all.send_redirects = 0
          net.ipv4.conf.default.send_redirects = 0
          net.ipv4.conf.eth0.send_redirects = 0
          net.ipv4.conf.default.accept_redirects = 0
          net.ipv4.conf.eth0.accept_redirects = 0
          net.ipv4.conf.ip_vti0.rp_filter = 0
          net.ipv4.conf.eth0.rp_filter = 0
          net.ipv4.conf.default.rp_filter = 0
          net.ipv4.conf.all.rp_filter = 0
          EOF
          sysctl -p /etc/sysctl.conf
          curl -o /etc/ipsec.d/vpnconfig.sh https://cloudneta-book.s3.ap-northeast-2.amazonaws.com/chapter6/6_lab_s2s-vpnconfig.sh
          chmod +x /etc/ipsec.d/vpnconfig.sh

  Instance2:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: t2.micro
      KeyName: !Ref KeyName
      Tags:
        - Key: Name
          Value: aaIDC-EC2
      NetworkInterfaces:
        - DeviceIndex: 0
          SubnetId: !Ref Subnet2
          GroupSet:
            - !Ref SG2
          PrivateIpAddress: 10.60.1.100
      UserData:
        Fn::Base64: |
          #!/bin/bash
          (
          echo "qwe123"
          echo "qwe123"
          ) | passwd --stdin root
          sed -i "s/^PasswordAuthentication no/PasswordAuthentication yes/g" /etc/ssh/sshd_config
          sed -i "s/^#PermitRootLogin yes/PermitRootLogin yes/g" /etc/ssh/sshd_config
          service sshd restart
          hostnamectl --static set-hostname aaIDC-EC2

  Instance3:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: t2.micro
      KeyName: !Ref KeyName
      Tags:
        - Key: Name
          Value: aaAWS-EC2
      NetworkInterfaces:
        - DeviceIndex: 0
          SubnetId: !Ref VPCAWSSubnet
          GroupSet:
            - !Ref SG3
          PrivateIpAddress: 10.50.1.100
          AssociatePublicIpAddress: true
      UserData:
        Fn::Base64: |
          #!/bin/bash
          hostnamectl --static set-hostname aaAWS-EC2

  SG1:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref VPC1
      GroupDescription: aaVPC1-IDC-CGW-SG
      Tags:
        - Key: Name
          Value: aaVPC1-IDC-CGW-SG
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '22'
          ToPort: '22'
          CidrIp: 0.0.0.0/0
        - IpProtocol: udp
          FromPort: '4500'
          ToPort: '4500'
          CidrIp: 0.0.0.0/0
        - IpProtocol: icmp
          FromPort: -1
          ToPort: -1
          CidrIp: 0.0.0.0/0

  SG2:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref VPC1
      GroupDescription: aaVPC1-IDC-EC2-SG
      Tags:
        - Key: Name
          Value: aaVPC1-IDC-EC2-SG
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '22'
          ToPort: '22'
          CidrIp: 0.0.0.0/0
        - IpProtocol: icmp
          FromPort: -1
          ToPort: -1
          CidrIp: 0.0.0.0/0

  SG3:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref VPC2
      GroupDescription: aaVPC2-AWS-EC2-SG
      Tags:
        - Key: Name
          Value: aaVPC2-AWS-EC2-SG
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '22'
          ToPort: '22'
          CidrIp: 0.0.0.0/0
        - IpProtocol: icmp
          FromPort: -1
          ToPort: -1
          CidrIp: 0.0.0.0/0

Outputs:
  VPNGWInstanceEIP:
    Description: Elastic IP assigned to VPNGW-Instance eth0 interface
    Value: !GetAtt Instance1.PublicIp
  AWSInstancePublic:
    Description: Public IP assigned to AWS-Instance eth0 interface
    Value: !GetAtt Instance3.PublicIp


vpnconfig.sh Download

vpnconfig.sh (펼쳐보기)
#!/bin/sh
printf "CGW 퍼블릭(혹은 탄력적) IP를 입력하세요: "
read word1
printf "VGW의 Tunnel1의 외부 IP를 입력하세요: "
read word2

cat <<EOF> /etc/ipsec.d/aws.conf
conn Tunnel1
  authby=secret
  auto=start
  left=%defaultroute
  leftid="$word1"
  right="$word2"
  type=tunnel
  ikelifetime=8h
  keylife=1h
  phase2alg=aes128-sha1;modp1024
  ike=aes128-sha1;modp1024
  keyingtries=%forever
  keyexchange=ike
  leftsubnet=10.60.0.0/16
  rightsubnet=10.50.0.0/16
  dpddelay=10
  dpdtimeout=30
  dpdaction=restart_by_peer
EOF

cat <<EOF> /etc/ipsec.d/aws.secrets
$word1 $word2 : PSK "cloudneta"
EOF

printf "VPN 서비스를 시작합니다.\n"
systemctl start ipsec
systemctl enable ipsec

printf "VPN 설정이 완료되었습니다.\n"
printf "cat /etc/ipsec.d/aws.conf 명령어로 확인해 보세요.\n"
printf "cat /etc/ipsec.d/aws.secrets 명령어로 확인해 보세요.\n"

key pair 생성은 AWS - Infra3. 사전 준비 를 참고하세요.

CF Stack 생성

ICMP (Internet Group Management Protocol)
ICMP 는 TCP/IP 에서 IP 패킷 처리 시 발생되는 문제를 알려주는 프로토콜임.
IP 에는 오로지 패킷을 목적지에 도달시키지 위한 내용들로만 구성이 되어 있기 때문에 정상적으로 목적지 도달 시 IP 에서 통신 성공 후 종료되므로 아무런 문제가 없지만, 목적지가 꺼져있거나 비정상인 경우 패킷 전달을 의뢰한 출발지에 이 사실을 알릴 수가 없음. (IP 에는 이러한 에러에 대한 처리 방법이 명시되지 있지 않으므로)

이러한 IP 의 부족한 점을 보완하는 것이 ICMP 프로토콜임.

예를 들어 ping 같은 경우도 ICMP 프로토콜을 이용한 방법임.


3.1.2. CloudFormation 을 통해 생성된 자원 확인

  • VPC
    • aaIDC-VPC1
      • IP CIDR: 10.60.0.0/16
    • aaAWS-VPC2
      • IP CIDR: 10.50.0.0/16
  • IGW
    • aaIDC-IGW1
      • 연결: aaIDC-VPC1
    • aaAWS-IGW2
      • 연결: aaAWS-VPC2
  • Public Subnet
    • aaIDC-VPC1-Public
      • IP CIDR: 10.60.0.0/24
      • AZ: ap-northeast-2a
    • aaAWS-VPC2-Public
      • IP CIDR: 10.50.1.0/24
      • AZ: ap-northeast-2a
  • Private Subnet
    • aaIDC-VPC1-Private
      • IP CIDR: 10.60.1.0/24
      • AZ: ap-northeast-2a
  • Public Routing Table
    • aaIDC-PublicRT1
      • 연결: aaIDC-VPC1-Public-Subnet
      • 라우팅 정보: 대상 0.0.0.0/0, 타깃: aaIDC-IGW1
    • aaAWS-PublicRT
      • 연결: aaAWS-VPC2-Public-Subnet
      • 라우팅 정보: 대상 0.0.0.0/0, 타깃: aaAWS-IGW2
      • 라우팅 전파: aaAWS-VPNGW (10.60.0.0/16)
  • Private Routing Table
    • aaIDC-PrivateRT1
      • 연결: aaIDC-VPC1-Private-Subnet
      • 라우팅 정보: 대상 10.50.0.0/16, 타깃: aaIDC-CGW 의 ENI
  • VGW (AWS VPNGateway)
    • aaAWS-VPNGW
      • 연결: aaAWS-VPC2
      • CGW: aaIDC-VPN-CGW
      • 유형: ipsec 버전 1
      • 라우팅: Static
      • 인증 방법: Pre Shared Key (“cloudneta”)
      • 정적 라우팅: 10.60.0.0/16 (aaIDC-VPC1 대역)
  • AWS VPNConnection
    • aaAWS-VPNConnection-IDC
      • 연결: aaAWS-VPNGW, aaIDC-VPN-CGW
  • CGW (AWS CustomerGateway)
    • aaIDC-VPN-CGW
      • 유형: ipsec 버전 1
      • CGW Device IP: aaIDC-CGW 의 EIP
  • EC2 Instance
    • aaIDC-CGW
      • 연결: aaIDC-VPC1-Public
      • CGW Device(openswan 설치)
      • Private IP: 10.60.0.100 (EIP 연결)
    • aaIDC-EC2
      • 연결: aaIDC-VPC1-Private
      • Private IP: 10.60.1.100
      • SSH: password 로그인 방식 활성화, root 로그인 활성화
    • aaAWS-EC2
      • 연결: aaAWS-VPC2-Public
      • Private IP: 10.50.1.100 (EIP 연결)
  • Security Group
    • aaVPC1-IDC-CGW-SG
      • inbound rule
        • SSH/ICMP(Source) - 0.0.0.0/0
        • UDP(Source) - 0.0.0.0/0 (VPN 통신용)
    • aaVPC1-IDC-EC2-SG
      • inbound rule
        • SSH/ICMP(Source) - 0.0.0.0/0
    • aaVPC2-AWS-EC2-SG
      • inbound rule
        • SSH/ICMP(Source) - 0.0.0.0/0

AWS VGW (Virtual Private Gateway) 와 연결된 CGW (Customer Gateway) Device 가 필요하므로 aaIDC-VPC1 을 생성하고, CGW Device 역할을 하는 aaIDC-CGW Instance 를 배포하여 테스트를 한다. (=openswan OpenSource VPN Solution 을 설치한 EC2 를 CGW 로 사용)

기본 환경 구성도

기업망 정보 (aaIDC-VPC1)

  • CGW Device (aaIDC-CGW Instance)
    • IP: Private IP 10.60.0.100, EIP (VGW 와 VPN 연결 시 사용)
    • VPN S/W 설치: openswan (Libreswan)
    • VPN 설정 스크립트 파일 생성 (/etc/ipsec.d/vpnconfig.sh)
    • 네트워크 라우팅을 위한 권장 옵션 설정
  • 내부 Instance (aaIDC-EC2)
    • IP: Private IP 10.60.1.100
    • SSH 접속 시 password 로그인 및 root 로그인 활성화
  • Private Subnet Routing Table (IDC-PrivateRT1)
    • AWS 망 대역 (10.50.0.0/16) 통신에 대해 aaIDC-CGW Instance 로 전달

AWS 망 정보 (aaAWS-VPC2)

  • VGW (Virtual Private Gateway, aaAWS-VPNGW)
    • 2개의 VPN Tunnel 이 생성되며, 2개의 IP 를 할당하며 해당 포스트에서는 이 중 1개 사용
    • VPN 인증은 Pre Shared Key 방식으로 하며, key 값은 cloudneta 로 설정
    • static routing 을 사용하며, 대역은 10.60.0.0/16
    • CGW Device IP 는 위에서 생성한 aaIDC-CGW Instance 의 EIP 로 설정
  • Public Instance (aaAWS-EC2)
    • Private IP 10.50.1.100 과 Public IP 사용
    • VPN Tunnel 을 통해 IDC 망의 aaIDC-EC2 Instance 와 통신
  • Public Subnet Routing Table (aaAWS-VPC2-Public)
    • 라우팅 전파 (aaAWS-VPNGW) 를 받아 10.60.0.0/16 은 VGW 로 전달

3.1.3. 기본 통신 환경 검증

  • Instance 에서 기본 환경 검증
  • AWS Web Console 에서 기본 환경 검증

3.1.3.1. Instance 에서 기본 환경 검증

aaIDC-CGW Instance

aaIDC-CGW Instance 의 EIP 확인 후 SSH 로 접근한다.

# aaIDC-CGW Instance 의 EIP
$ ssh -i sandbox-jh.pem ec2-user@3.37.xxx.xxx

# aaIDC-CGW Instance 에 생성된 VPN 설정 스크립트 파일 확인
[ec2-user@aaIDC-CGW ~]$ sudo ls /etc/ipsec.d
policies  vpnconfig.sh

[ec2-user@aaIDC-CGW ~]$ sudo cat /etc/ipsec.d/vpnconfig.sh
#!/bin/sh
printf "CGW 퍼블릭(혹은 탄력적) IP를 입력하세요: "
read word1
printf "VGW의 Tunnel1의 외부 IP를 입력하세요: "
read word2

cat <<EOF> /etc/ipsec.d/aws.conf
conn Tunnel1
  authby=secret
  auto=start
  left=%defaultroute
  leftid="$word1"
  right="$word2"
  type=tunnel
  ikelifetime=8h
  keylife=1h
  phase2alg=aes128-sha1;modp1024
  ike=aes128-sha1;modp1024
  keyingtries=%forever
  keyexchange=ike
  leftsubnet=10.60.0.0/16
  rightsubnet=10.50.0.0/16
  dpddelay=10
  dpdtimeout=30
  dpdaction=restart_by_peer
EOF

cat <<EOF> /etc/ipsec.d/aws.secrets
$word1 $word2 : PSK "cloudneta"
EOF

printf "VPN 서비스를 시작합니다.\n"
systemctl start ipsec
systemctl enable ipsec

printf "VPN 설정이 완료되었습니다.\n"
printf "cat /etc/ipsec.d/aws.conf 명령어로 확인해 보세요.\n"
printf "cat /etc/ipsec.d/aws.secrets 명령어로 확인해 보세요.\n"
aaIDC-EC2 Instance

aaIDC-VPC1 의 Private Subnet 에 위치한 aaIDC-EC2 Instance 는 외부에서 직접 SSH 접속이 안되므로 Public Subnet 에 있는 aaIDC-CGW Instance 에 SSH 접속한 후 Private Subnet 에 있는 aaIDC-EC2 Instance 로 접속한다.

aaIDC-EC2 인스턴스로 SSH 접속 후 외부 통신 및 AWS 망의 Instance 와 통신 확인 (통신 불가)

# aaIDC-CGW Instance 의 EIP
$ ssh -i sandbox-jh.pem ec2-user@3.37.xxx.xxx

# aaIDC-EC2 의 Private IP
[ec2-user@aaIDC-CGW ~]$ ssh root@10.60.1.100
root@10.60.1.100's password:  # qwe123

# IDC Private Subnet 에 위치한 aaIDC-EC2 인스턴스의 외부 통신 확인 (통신 불가)
[root@aaIDC-EC2 ~]# curl http://checkip.amazonaws.com --connect-timeout 3
curl: (28) Failed to connect to checkip.amazonaws.com port 80 after 2990 ms: Connection timed out

# IDC Private Subnet 에 위치한 aaIDC-EC2 인스턴스와 aaAWS-EC2 의 Private IP 통신 확인 (통신 불가)
[root@aaIDC-EC2 ~]# ping 10.50.1.100 -c 1 -W 1
PING 10.50.1.100 (10.50.1.100) 56(84) bytes of data.

--- 10.50.1.100 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

ping 옵션
-c: Count
-W: timeout
ping 에 관한 자세한 내용은 ping 옵션 을 참고하세요.

aaAWS-EC2 Instance

aaAWS-EC2 Instance EIP 로 SSH 접속한다.

IDC Private Subnet 에 위치한 aaIDC-EC2 Instance 와 통신 확인 (통신 불가, VPN 미설정)

# aaAWS-EC2 Instance EIP
$ ssh -i sandbox-jh.pem ec2-user@3.36.xxx.xxx

# IDC Private Subnet 에 위치한 aaIDC-EC2 Instance 와 통신 확인 (통신 불가,VPN 미설정)
[ec2-user@aaAWS-EC2 ~]$ ping 10.60.1.100 -c 1 -W 1
PING 10.60.1.100 (10.60.1.100) 56(84) bytes of data.

--- 10.60.1.100 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

3.1.3.2. AWS Web Console 에서 기본 환경 검증

aaIDC-PrivateRT1

[VPC] - [Virtual private cloud] - [Route tables] - [aaIDC-PrivateRT1 선택] - [Routes 탭]

aaIDC-VPC Private Subnet Routing Table 확인

aaAWS-PublicRT

[VPC] - [Virtual private cloud] - [Route tables] - [aaAWS-PublicRT 선택] - [Routes 탭]

aaAWS-VPC Public Subnet Routing Table 확인 aaAWS-VPC Public Subnet Routing Table 확인 - 라우팅 전파

aaAWS-VPNGW 의 static 라우팅 정보를 라우팅 전파를 통해 처리가 가능하다.

VGW (Virtual Private Gateway) 연결

[VPC] - [Virtual private network(VPN)] - [Site-to-Site VPN connections] - [aaAWS-VPNConnection-IDC 선택]

AWS VPN 연결 정보 Customer gateway address(3.37.xxx.xxx) 는 아래 3.2.1. IDC-CGW 인스턴스에 VPN 설정 시 셋팅할 예정이다.

AWS VPN Tunnel 정보 현재는 Down 상태이며, 외부 IP 주소 (43.200.61.196) 는 아래 3.2.1. IDC-CGW 인스턴스에 VPN 설정 시 셋팅할 예정이다.

AWS VPN static 라우팅 정보 10.60.0.0/16 은 aaIDC-VPC1 의 네트워크 대역이다.


3.2. VPN 테스트

  • IDC-CGW 인스턴스에 VPN 설정
  • AWS VGW 확인
  • VPN 을 통한 통신 확인
  • VPN 을 통한 통신 흐름

VPN 환경 구성도


3.2.1. IDC-CGW 인스턴스에 VPN 설정

aaIDC-CGW Instance 에 AWS VPN 정보를 입력하기 위해 AWS VPN Tunnel1 의 외부 IP 정보와 CGW address 를 확인한다.
/etc/ipsec.d/vpnconfig.sh 스크립트를 실행하여 VPN 설정을 자동으로 입력한다.

vpnconfig.sh (펼쳐보기)
#!/bin/sh
printf "CGW 퍼블릭(혹은 탄력적) IP를 입력하세요: "
read word1
printf "VGW의 Tunnel1의 외부 IP를 입력하세요: "
read word2

cat <<EOF> /etc/ipsec.d/aws.conf
conn Tunnel1
  authby=secret
  auto=start
  left=%defaultroute
  leftid="$word1"
  right="$word2"
  type=tunnel
  ikelifetime=8h
  keylife=1h
  phase2alg=aes128-sha1;modp1024
  ike=aes128-sha1;modp1024
  keyingtries=%forever
  keyexchange=ike
  leftsubnet=10.60.0.0/16
  rightsubnet=10.50.0.0/16
  dpddelay=10
  dpdtimeout=30
  dpdaction=restart_by_peer
EOF

cat <<EOF> /etc/ipsec.d/aws.secrets
$word1 $word2 : PSK "cloudneta"
EOF

printf "VPN 서비스를 시작합니다.\n"
systemctl start ipsec
systemctl enable ipsec

printf "VPN 설정이 완료되었습니다.\n"
printf "cat /etc/ipsec.d/aws.conf 명령어로 확인해 보세요.\n"
printf "cat /etc/ipsec.d/aws.secrets 명령어로 확인해 보세요.\n"

aaIDC-CGW Instance 로 SSH 접속하여 VPN 정보 입력

# aaIDC-CGW Instance 
$ ssh -i sandbox-jh.pem ec2-user@3.37.xxx.xxx

# root 권한으로 변경
[ec2-user@aaIDC-CGW ~]$ sudo su -
[root@aaIDC-CGW ~]#

# vpnconfig.sh 파일 실행 후 aaIDC-CGW 의 EIP(CGW address) 와 VGW Tunnel1 의 외부 IP 입력
[root@aaIDC-CGW ~]# cd /etc/ipsec.d
[root@aaIDC-CGW ipsec.d]# ll
total 4
drwx------ 2 root root 120 Jan 23 03:08 policies
-rwxr-xr-x 1 root root 905 Jan 23 03:08 vpnconfig.sh

[root@aaIDC-CGW ipsec.d]# ./vpnconfig.sh
CGW 퍼블릭(혹은 탄력적) IP를 입력하세요: 3.37.222.142
VGW의 Tunnel1의 외부 IP를 입력하세요: 43.200.61.196
VPN 서비스를 시작합니다.
Created symlink from /etc/systemd/system/multi-user.target.wants/ipsec.service to /usr/lib/systemd/system/ipsec.service.
VPN 설정이 완료되었습니다.
cat /etc/ipsec.d/aws.conf 명령어로 확인해 보세요.
cat /etc/ipsec.d/aws.secrets 명령어로 확인해 보세요.

생성된 aws.conf 파일 확인

[root@aaIDC-CGW ipsec.d]# cat /etc/ipsec.d/aws.conf
conn Tunnel1
  authby=secret
  auto=start
  left=%defaultroute
  leftid="3.37.222.142" # aaIDC-CGW 의 EIP
  right="43.200.61.196" # AWS VPN Tunnel1 의 외부 IP
  type=tunnel
  ikelifetime=8h
  keylife=1h
  phase2alg=aes128-sha1;modp1024
  ike=aes128-sha1;modp1024
  keyingtries=%forever
  keyexchange=ike
  leftsubnet=10.60.0.0/16 # aaIDC-VPC1
  rightsubnet=10.50.0.0/16  # aaAWS-VPC2
  dpddelay=10
  dpdtimeout=30
  dpdaction=restart_by_peer

생성된 aws.secrets 파일 확인

[root@aaIDC-CGW ipsec.d]# cat /etc/ipsec.d/aws.secrets
3.37.222.142 43.200.61.196 : PSK "cloudneta"  # 3.37~ 은 aaIDC-CGW 의 EIP, 43.200~ 은 AWS VPN Tunnel1 의 외부 IP, PSK 값은 'cloudneta'

ipsec 서비스 상태 확인

[root@aaIDC-CGW ipsec.d]# systemctl status ipsec
● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec
   Loaded: loaded (/usr/lib/systemd/system/ipsec.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-01-23 05:37:38 UTC; 5min ago
     Docs: man:ipsec(8)
           man:pluto(8)
           man:ipsec.conf(5)
 Main PID: 3102 (pluto)
   Status: "Startup completed."
   CGroup: /system.slice/ipsec.service
           └─3102 /usr/libexec/ipsec/pluto --leak-detective --config /etc/ipsec.conf --nofork

Jan 23 05:37:38 aaIDC-CGW pluto[3102]: loading secrets from "/etc/ipsec.secrets"
Jan 23 05:37:38 aaIDC-CGW pluto[3102]: loading secrets from "/etc/ipsec.d/aws.secrets"
Jan 23 05:37:38 aaIDC-CGW pluto[3102]: "Tunnel1" #1: initiating Main Mode
Jan 23 05:37:38 aaIDC-CGW pluto[3102]: "Tunnel1" #1: WARNING: connection Tunnel1 PSK length o...red)
Jan 23 05:37:38 aaIDC-CGW pluto[3102]: "Tunnel1" #1: STATE_MAIN_I2: sent MI2, expecting MR2
Jan 23 05:37:38 aaIDC-CGW pluto[3102]: "Tunnel1" #1: STATE_MAIN_I3: sent MI3, expecting MR3
Jan 23 05:37:38 aaIDC-CGW pluto[3102]: "Tunnel1" #1: Peer ID is ID_IPV4_ADDR: '43.200.61.196'
Jan 23 05:37:38 aaIDC-CGW pluto[3102]: "Tunnel1" #1: STATE_MAIN_I4: ISAKMP SA established {au...024}
Jan 23 05:37:38 aaIDC-CGW pluto[3102]: "Tunnel1" #2: initiating Quick Mode PSK+ENCRYPT+TUNNEL...024}
Jan 23 05:37:38 aaIDC-CGW pluto[3102]: "Tunnel1" #2: STATE_QUICK_I2: sent QI2, IPsec SA estab...ive}
Hint: Some lines were ellipsized, use -l to show in full.

3.2.2. AWS VGW 확인

이제 다시 AWS VPN 의 Tunnel1 의 상태를 보면 Up 으로 변경되어 있는 것을 확인할 수 있다. AWS VPN Tunnel 작동 확인


3.2.3. VPN 을 통한 통신 확인

이제 aaAWS-EC2 instance 에서 aaIDC-EC2 instance 로 Private 통신을 확인해보자.

<기본 환경> IDC Private Subnet 에 위치한 aaIDC-EC2 Instance 와 통신 확인 (통신 불가, VPN 미설정)

# aaAWS-EC2 Instance EIP
$ ssh -i sandbox-jh.pem ec2-user@3.36.xxx.xxx

# IDC Private Subnet 에 위치한 aaIDC-EC2 Instance 와 통신 확인 (통신 불가,VPN 미설정)
[ec2-user@aaAWS-EC2 ~]$ ping 10.60.1.100 -c 1 -W 1
PING 10.60.1.100 (10.60.1.100) 56(84) bytes of data.

--- 10.60.1.100 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

<VPN 설정 환경> IDC Private Subnet 에 위치한 aaIDC-EC2 Instance 와 통신 확인 (통신 가능, VPN 설정)

# aaAWS-EC2 Instance EIP
$ ssh -i sandbox-jh.pem ec2-user@3.36.58.89

# IDC Private Subnet 에 위치한 aaIDC-EC2 Instance 와 통신 확인 (통신 가능,VPN 설정)
[ec2-user@aaAWS-EC2 ~]$ ping 10.60.1.100 -c 1 -W 1
PING 10.60.1.100 (10.60.1.100) 56(84) bytes of data.
64 bytes from 10.60.1.100: icmp_seq=1 ttl=254 time=1.91 ms

--- 10.60.1.100 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.910/1.910/1.910/0.000 ms

이제 aaIDC-EC2 instance 에서 aaAWS-EC2 instance 로 Private 통신을 확인해보자.

<기본 환경> aaIDC-EC2 인스턴스로 SSH 접속 후 외부 통신 및 AWS 망의 Instance 와 통신 확인 (통신 불가)

# aaIDC-CGW Instance 의 EIP
$ ssh -i sandbox-jh.pem ec2-user@3.37.xxx.xxx

# aaIDC-EC2 의 Private IP
[ec2-user@aaIDC-CGW ~]$ ssh root@10.60.1.100
root@10.60.1.100's password:  # qwe123

# IDC Private Subnet 에 위치한 aaIDC-EC2 인스턴스의 외부 통신 확인 (통신 불가)
[root@aaIDC-EC2 ~]# curl http://checkip.amazonaws.com --connect-timeout 3
curl: (28) Failed to connect to checkip.amazonaws.com port 80 after 2990 ms: Connection timed out

# IDC Private Subnet 에 위치한 aaIDC-EC2 인스턴스와 aaAWS-EC2 의 Private IP 통신 확인 (통신 불가)
[root@aaIDC-EC2 ~]# ping 10.50.1.100 -c 1 -W 1
PING 10.50.1.100 (10.50.1.100) 56(84) bytes of data.

--- 10.50.1.100 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

<VPN 설정 환경> aaIDC-EC2 인스턴스로 SSH 접속 후 외부 통신 및 AWS 망의 Instance 와 통신 확인 (통신 가능)

# aaIDC-CGW Instance 의 EIP
$ ssh -i sandbox-jh.pem ec2-user@3.37.xxx.xxx

# aaIDC-EC2 의 Private IP
[ec2-user@aaIDC-CGW ~]$ ssh root@10.60.1.100
root@10.60.1.100's password:  # qwe123

# IDC Private Subnet 에 위치한 aaIDC-EC2 인스턴스의 외부 통신 확인 (통신 불가)
[root@aaIDC-EC2 ~]# curl http://checkip.amazonaws.com --connect-timeout 3
curl: (28) Failed to connect to checkip.amazonaws.com port 80 after 2988 ms: Connection timed out

# IDC Private Subnet 에 위치한 aaIDC-EC2 인스턴스와 aaAWS-EC2 의 Private IP 통신 확인 (통신 가능)
[root@aaIDC-EC2 ~]# ping 10.50.1.100 -c 1 -W 1
PING 10.50.1.100 (10.50.1.100) 56(84) bytes of data.
64 bytes from 10.50.1.100: icmp_seq=1 ttl=253 time=1.89 ms

--- 10.50.1.100 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.898/1.898/1.898/0.000 ms

3.2.4. VPN Tunnel 을 통한 통신 흐름

VPN 환경 통신 확인

① aaIDC-EC2 Instance (10.60.1.100) 에서 aaAWS-EC2 Instance (10.50.10.100) 으로 ping 패킷 전송
② IDC Private Subnet Table 에 의해 10.50.0.0/16 대상(Destination) 은 aaIDC-CGW Instance ENI 로 보냄
③ aaIDC-CGW (CGW Device) 는 VPN 통신 트래픽 대역에 매칭되어 해당 트래픽을 ESP (Encapsulating Security Payload) 로 감싸고 암호화하여 L3 (IP header) 와 L4 (UDP header) 를 추가 후 aaAWS-VPNGW (VGW) 로 보냄

VPN Tunnel 을 향하는 패킷의 상세 정보
L3 (IP header) 는 aaIDC-CGW 의 EIP 와 AWS VGW 의 Tunnel1 의 Public IP
aaIDC-CGW 가 NAT 환경 (IGW) 내부에 있으므로 L4 (UDP header) 의 포트는 4500 사용
ESP 헤더 안쪽의 정보는 암호화되어 전달됨

④ aaAWS-VPNGW 로 유입된 패킷은 VPN 통신용 헤더(L3, L4, ESP) 정보 확인 후 제거하여 내부 aaAWS-VPC2 로 보냄
⑤ 최종적으로 aaAWS-EC2 는 일반적인 ping 패킷을 받음


3.3. Resource 삭제

  • CloudFormation Stack 삭제 ([CloudFormation] - [Stacks] - [Delete])

CloudFormation Stack 이 삭제되면 위의 3.1.2. CloudFormation 을 통해 생성된 자원 확인 의 자원이 모두 삭제되었는지 확인한다.


참고 사이트 & 함께 보면 좋은 사이트

본 포스트는 김원일, 서종호 저자의 따라하며 배우는 AWS 네트워크 입문를 기반으로 스터디하며 정리한 내용들입니다.






© 2020.08. by assu10

Powered by assu10