안녕하세요 서후아빠입니다. ^_^
이번 세션은 AWS(ap-northeast-2)와 Openswan(AWS, us-east-2, On-premise 역할) 사이에 Site-to-Site VPN 연결에 대해서 실습을 해보겠습니다.
실무적으로 쓸일이 없어서 안하려다가 TGW에서 VPN 연결 테스트 상황에서 필요하여 구성해 보았습니다. 만약 On-premise의 VPN장비가 있으시면 굳이 Openswan을 사용하지 않아도 될 것 같습니다.
구성도
Openswan은 일반 EC2에 Openswan을 설치하여 VPN 장비로 구현이 가능한 애플리케이션입니다. 구성하는 과정이 어렵지 않기 때문에 쉽게 따라하실 수 있으리라 생각됩니다. |
사전 작업
인프라 생성 : vpc, subnet, igw, routing table, ec2 등은 설명 생략합니다.
2022.07.02 - [Networking] - [실습] Amazon VPC 구성요소 생성하기
1단계 (us-east-2) : OpenSwan용 EC2 준비
EC2 > Instances > Launch instances : Name(pubB-ec2), AMI(Amazon Linux)
AMI 선택 시 ubuntu는 제외하는 것이 좋겠습니다. Openswan 관련 자료를 찾을 수 없더라고요. |
EC2 > Instances > pubB-ec2 선택 > Actions > Networking > Change source/destination check > Stop > save
EC2 인스턴스는 기본적으로 source/destination check를 수행합니다. 이는 인스턴스가 전송하거나 수신하는 트래픽의 소스 또는 대상이어야 함을 의미합니다. 그러나 NAT 인스턴스(=NAT 구조로 동작하는 인스턴스)는 source or destination이 자신이 아닐 때 트래픽을 보내고 받을 수 있어야 합니다. 따라서 NAT 인스턴스에서 source/destination check를 Stop해야 합니다. |
EC2 > Elastic IPs > Allocate Elastic IP address > 기본값 > Allocate
EC2 > Elastic IPs > 생성된 EIP(eipB) 선택 > Actions > Associate Elastic IP address > Resource type(Instance), Instance(pubB-ec2)
테스트용으로 구성할 경우, 굳이 고정 Elastic IP address(EIP)가 불필요하기 때문에 이 행위 SKIP해도 됩니다. 왜냐하면 public subnet에 배포되는 pubB-ec2가 기본적으로 유동적인 public IP를 할당받기 때문입니다. |
EC2 > Instances > pubB-ec2 선택 > Details (tab) > Public IPv4 address가 EIP로 변경됨을 확인
EC2 > Instances > pubB-ec2 선택 > Security (tab) > Security groups 링크 클릭 > SG Inbound rules (tab) > Edit inbound rules > Add rule
Type | Port range | Source | ||
Custom UDP | 4500 | 0.0.0.0/0 | ||
Custom ICMP - IPv4 | - | 0.0.0.0/0 |
pubB-ec2 SSH로 접속하여 OpenSwan 설치만 진행
sudo yum install openswan
2단계 (ap-northeast-2) : VGW 및 CGW 생성, VPN 연결
VPC > Virtual private gateways > Create virtual private gateway
Name tag | Autonomous System Number (ASN) | |||
vgwA | Amazon default ASN (AWS 기본값은 64512) |
Openswan과 BGP(동적)으로 VPN 구성을 하는 경우는 ASN값이 Openswan에 설정된 값과 다르게 해야합니다. 하지만 이번 세션에는 BGP(동적)으로 VPN 구성을 하지 않기 때문에 Default값으로 진행해도 무방합니다. |
VPC > Virtual private gateways > vgwA 선택 > Attach to VPC > vpcA 선택 > Attach to VPC
VPC > Customer gateways > Create customer gateway
Name tag | BGP ASN | IP Address | ||
cgwA | 65000 | eipB (pubB-ec2의 public IP) |
ASN값은 BGP(동적)으로 구성할 때만 사용되며, Openswan을 BGP(동적)으로 구성하지 않기 때문에 기본값(65000)으로 진행하시면 됩니다. |
VPC > Site-to-Site VPN Connections > Create VPN connection
구분 | Details | Tunnel Options | ||
1 | Name tag : vpnA Target gateway type : Virtual private gateway Virtual private gateway : vgwA Customer fateway : Existing Customer gateway ID : cgwA Routing options : static Static IP prefixes : 20.0.0.0/16 (vpcB 대역정보) |
설정하지 않음 |
VPC > Route tables > pubA-rt 선택 > Route propagation (tab) > Edit route progagation > Enable > Save
Enable 설정하면 아래 VPN 연결이 되면서 On-premise(20.0.0.0/16) 대역이 Route tables에 자동 등록됩니다. |
VPC > Site-to-site VPN Connections > vpnA 선택 > Download configuration : 3단계(us-east-2) VPN 연결에서 사용하는 파일
VPC > Site-to-site VPN Connections > vpnA 선택 > Tunnel details (tab) > Status “Down” 확인
3단계 (us-east-2) : VPN 연결
다운로드 받은 구성 파일을 이용하여 pubB-ec2 SSH 접속하여 아래처럼 설정 진행
# 패킷 포워딩 활성화 : 다운로드 받은 구성 파일 내용 사용
sudo vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.accept_source_route = 0
# 패킷 포워딩 활성화 적용 : 다운로드 받은 구성 파일 내용 사용
sudo sysctl -p
# include /etc/ipsec.d/*.conf 주석처리만 제거, 나머지 그대로 유지 : 다운로드 받은 구성 파일 내용 사용
sudo vi /etc/ipsec.conf
include /etc/ipsec.d/*.conf
# VPN 연결 구성 : 다운로드 받은 구성 파일 내용 사용
sudo vi /etc/ipsec.d/aws.conf
conn Tunnel1
authby=secret
auto=start
left=%defaultroute
leftid=pubB-ec2_공인IP_입력(자동 등록되어 있음)
leftsubnet=vpcB_대역_입력
right=AWS터널1번_공인IP_입력(자동 등록되어 있음)
rightsubnet=vpcA_대역_입력
type=tunnel
ikelifetime=8h
keylife=1h
phase2alg=aes_gcm
ike=aes256-sha2_256;dh14
#phase2alg=aes128-sha1;modp1024
#ike=aes128-sha1;modp1024
#auth=esp
keyingtries=%forever
keyexchange=ike
dpddelay=10
dpdtimeout=30
dpdaction=restart_by_peer
conn Tunnel2
authby=secret
auto=start
left=%defaultroute
leftid=pubB-ec2_공인IP_입력(자동 등록되어 있음)
leftsubnet=vpcB_대역_입력
right=AWS터널2번_공인IP_입력(자동 등록되어 있음)
rightsubnet=vpcA_대역_입력
type=tunnel
ikelifetime=8h
keylife=1h
phase2alg=aes_gcm
ike=aes256-sha2_256;dh14
#phase2alg=aes128-sha1;modp1024
#ike=aes128-sha1;modp1024
#auth=esp
keyingtries=%forever
keyexchange=ike
dpddelay=10
dpdtimeout=30
dpdaction=restart_by_peer
# VPN 연결키 설정 : 다운로드 받은 구성 파일 내용 사용
sudo vi /etc/ipsec.d/aws.secrets
pubB-ec2_공인IP AWS터널1번_공인IP : PSK "비밀번호"(자동 등록되어 있음)
pubB-ec2_공인IP AWS터널2번_공인IP : PSK "비밀번호"(자동 등록되어 있음)
# ipsec 구동하여 Active 상태 확인
sudo systemctl start ipsec.service
sudo systemctl enable ipsec.service
sudo systemctl status ipsec.service
# ipsec 상태 확인 : 터널 개수만큼 표시
sudo ipsec status | grep Total
000 Total IPsec connections: loaded 2, active 2
# ipsec 서비스 포트 리슨 확인
sudo netstat -nptul | grep 500
udp 0 0 127.0.0.1:500 0.0.0.0:* 4835/pluto
udp 0 0 20.0.1.9:500 0.0.0.0:* 4835/pluto
udp 0 0 127.0.0.1:4500 0.0.0.0:* 4835/pluto
udp 0 0 20.0.1.9:4500 0.0.0.0:* 4835/pluto
# ipsec 통신 상태 확인
sudo yum install tcpdump -y
sudo tcpdump -nni eth0 port 4500
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
08:49:36.858237 IP 20.0.1.9.4500 > 3.34.237.21.4500: isakmp-nat-keep-alive
08:49:37.015659 IP 20.0.1.9.4500 > 3.34.237.21.4500: NONESP-encap: isakmp: phase 2/others ? inf[E]
AWS에서 다운로드 받은 구성 파일 중 아래 3가지 항목으로 인하여 많은 고생을 했습니다. AWS에서 제공되는 구성파일이 문제가 될줄은 생각도 못했습니다. 아무튼 3개의 항목은 주석처리(or 삭제)하시고, 아래 2줄로 대체해야 정상적으로 Tunnel이 연결됩니다. #phase2alg=aes128-sha1;modp1024 #ike=aes128-sha1;modp1024 #auth=esp phase2alg=aes_gcm ike=aes256-sha2_256;dh14 |
4단계 (ap-northeast-2) : VPN 연결 확인
VPC > Site-to-site VPN Connections > vpnA 선택 > Tunnel details (tab) > Status “Up” 확인
VPC > Route tables > pubA-rt 선택 > Routes (tab) > 자동으로 On-premise 대역에 대해서 라우팅 등록 확인
5단계 (ap-northeast-2, us-east-2) : VPN 통신 확인
vpcA의 pubA-ec2에서 vpcB의 priB-ec2의 사설 IP로 Ping or SSH 접속 시도 : Success 확인
vpcA, vpcB 모두 NACL, SG 등 보안 설정에 대해서 Inbound, Outbound 정책을 꼭 확인해서 허용하도록 합니다. |
'Networking' 카테고리의 다른 글
[이론] Amazon CloudFront (CDN 서비스) 기본 개념 (0) | 2022.07.19 |
---|---|
[Tip] NAT 구조, L2 동작하는 3rd party 인스턴스에서 이상 동작하는 경우 해결하기 (0) | 2022.07.19 |
[실습] AWS Endpoint (Interface, Gateway) 이용하여 S3 접근하기 (0) | 2022.07.19 |
[이론] AWS Endpoint(Interface, Gateway) 기본 개념 (0) | 2022.07.19 |
[실습] AWS Site-to-Site VPN 구성하기 (Azure, BGP, Active-Active)-1편 (0) | 2022.07.15 |