AWS - Network 연결 옵션 (2): VPN
이 포스트는 AWS 에서 제공하는 관리형 VPN 서비스인 AWS Site-to-Site VPN
과 AWS 클라이언트 VPN
에 대해 알아본 후 AWS Site-to-Site VPN
을 통해 AWS 와 온프레미스 간 VPN 통신(Private 대역 간 통신) 을 구성해본다.
- 1.
AWS Site-to-Site VPN (S2S)
- 2.
AWS 클라이언트 VPN
- 3. 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 이중화하는 것을 권장한다.
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 와 함께 작동할 수 있다.
고객 게이트웨이 (CGW
, Customer Gateway)
AWS 에서 생성하는 리소스로 온프레미스 N/W 의 Customer Gateway Device 를 나타낸다. (= 온프레미스 장비의 정보 지정)
VGW 와 VPN 연결 설정을 위해 필요한 IPSec 정보 지정한다.
고객 게이트웨이 디바이스 (Customer Gateway Device)
온프레미스 장비 혹은 SW 애플리케이션으로 AWS Device 장애 or VPN 연결 정기 유지 관리 시 두 번째 터널로 자동으로 장애 조치되므로 연결이 끊기지 않는다.
따라서 CGW Device
구성 시 두 개의 터널을 구성하는 것이 중요하다.
1.2. Site-to-Site VPN 특징
- VPN 연결 협상 시 Responder 로 동작
- VGW 는 통신 요청자(Initiator) 가 아니므로 VPN 협상은 항상 Customer Gateway Device(클라이언트 측) 에서 연결을 시도해야 함
IKE (Internet Key Exchange) 2
를 사용하면 VGW 가 통신 요청자가 될 수 있도록 설정 가능
- 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 Device 장애 등이 발생하면 대응 방안이 없다.
1.5.2. CGW Device
가 2대이고, 해당 Device 2대가 클러스터링 지원
온프레미스에 CGW Device
의 가용성을 위한 시나리오이다.
CGW Device
2대의 장비가 논리적으로 1대의 장비로 동작하는 클러스터링 설정이 필요하다.
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 을 설정한다.
네트워크 대역 추가나 삭제 시 수동으로 Static Routing 설정이 필요하다.
1.5.4. CGW Device
가 2대이고, 해당 Device 2대가 클러스터링 미지원 시 Dynamic Routing (BGP) 사용
AWS VPC 네트워크 대역과 온프레미스 네트워크 대역을 Dynamic Routing (BGP) 를 통해 자동으로 라우팅 경로을 알 수 있다.
높은 HA 를 제공한다.
Tunnel 상태 이상 시 BGP
나 BFD (Bidirectional Forwarding)
로 자동 감지하여 Standby Tunnel 이 Active Tunnel 로 사용된다.
네트워크 정보가 자동으로 갱신되며, 매번 수동 설정할 필요가 없다.
2. AWS 클라이언트 VPN
AWS S2S VPN
은 각 종단 간 고정된 IP 를 통해 VPN Tunnel 을 구성하는 반면
AWS 클라이언트 VPN
은 사용자 측의 IP 가 항상 유동적이다. (= 고정된 장소에서 VPN Tunnel 을 연결하는 것이 아니라 사용자 위치와 관계없이 VPN Tunnel 연결 가능)
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 - Infra 의 3. 사전 준비 를 참고하세요.
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
- aaIDC-VPC1
- IGW
- aaIDC-IGW1
- 연결: aaIDC-VPC1
- aaAWS-IGW2
- 연결: aaAWS-VPC2
- aaIDC-IGW1
- 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
- aaIDC-VPC1-Public
- Private Subnet
- aaIDC-VPC1-Private
- IP CIDR: 10.60.1.0/24
- AZ: ap-northeast-2a
- aaIDC-VPC1-Private
- 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)
- aaIDC-PublicRT1
- Private Routing Table
- aaIDC-PrivateRT1
- 연결: aaIDC-VPC1-Private-Subnet
- 라우팅 정보: 대상 10.50.0.0/16, 타깃: aaIDC-CGW 의 ENI
- aaIDC-PrivateRT1
- 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 대역)
- aaAWS-VPNGW
- AWS VPNConnection
- aaAWS-VPNConnection-IDC
- 연결: aaAWS-VPNGW, aaIDC-VPN-CGW
- aaAWS-VPNConnection-IDC
- CGW (AWS CustomerGateway)
- aaIDC-VPN-CGW
- 유형: ipsec 버전 1
- CGW Device IP: aaIDC-CGW 의 EIP
- aaIDC-VPN-CGW
- 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 연결)
- aaIDC-CGW
- Security Group
- aaVPC1-IDC-CGW-SG
- inbound rule
- SSH/ICMP(Source) - 0.0.0.0/0
- UDP(Source) - 0.0.0.0/0 (VPN 통신용)
- inbound rule
- aaVPC1-IDC-EC2-SG
- inbound rule
- SSH/ICMP(Source) - 0.0.0.0/0
- inbound rule
- aaVPC2-AWS-EC2-SG
- inbound rule
- SSH/ICMP(Source) - 0.0.0.0/0
- inbound rule
- aaVPC1-IDC-CGW-SG
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 탭]
aaAWS-PublicRT
[VPC] - [Virtual private cloud] - [Route tables] - [aaAWS-PublicRT 선택] - [Routes 탭]
aaAWS-VPNGW 의 static 라우팅 정보를 라우팅 전파를 통해 처리가 가능하다.
VGW (Virtual Private Gateway) 연결
[VPC] - [Virtual private network(VPN)] - [Site-to-Site VPN connections] - [aaAWS-VPNConnection-IDC 선택]
Customer gateway address(3.37.xxx.xxx) 는 아래 3.2.1. IDC-CGW 인스턴스에 VPN 설정 시 셋팅할 예정이다.
현재는 Down
상태이며, 외부 IP 주소 (43.200.61.196) 는 아래 3.2.1. IDC-CGW 인스턴스에 VPN 설정 시 셋팅할 예정이다.
10.60.0.0/16 은 aaIDC-VPC1 의 네트워크 대역이다.
3.2. VPN 테스트
- IDC-CGW 인스턴스에 VPN 설정
AWS VGW
확인- 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
으로 변경되어 있는 것을 확인할 수 있다.
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 을 통한 통신 흐름
① 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 네트워크 입문를 기반으로 스터디하며 정리한 내용들입니다.
- 따라하며 배우는 AWS 네트워크 입문
- 따라하며 배우는 AWS 네트워크 입문 - 책가이드
- 따라하며 배우는 AWS 네트워크 입문 - 팀블로그
- Site-to-Site VPN 이란?
- AWS VPN은 어떤 서비스인가요?
- AWS Site-to-Site VPN - AWS 공식문서
- customer gateway device - AWS 공홈
- AWS VPN 요금
- AWS docs
- AWS VPN docs