본문 바로가기
AWS

[Project] Openswan을 이용한 VPN site-to-site

by Nirah 2023. 3. 6.

https://medium.com/greendatakr/aws-s2s-vpn-part-3-fc7c76911c9a

 

AWS Site-to-Site VPN 구성하기 (feat. Openswan) (3) - VPN 연결

지난 글 에서는 IDC와 AWS의 기본 환경을 구축 했습니다. 이번 글에서는 본격적으로 VPN 설정을 해보겠습니다. IDC의 Custom Gateway EC2에 Openswan을 설치한 후, AWS의 VPC에 Site-to-Site VPN을…

medium.com

 

오픈스완 명령어

https://www.xinux.net/index.php/Openswan_ipsec_tool

 

Openswan ipsec tool – xinux.net

 

www.xinux.net

 

 

요약

IDC의 Custom Gateway EC2에 Openswan을 설치한 후, AWS의 VPC에 Site-to-Site VPN을 추가한다.

그 후 해당 설정을 바탕으로 Openswan에 설정 값을 추가한다.

 

 

 

 

 

가상 프라이빗 게이트웨이

가상 프라이빗 게이트웨이는 Site-to-Site VPN 연결의 Amazon 측에 있는 VPN 집선기

 

고객 게이트웨이

고객 게이트웨이는 온프레미스 네트워크의 고객 게이트웨이 디바이스를 나타내는 AWS에서 생성하는 리소스입니다. 고객 게이트웨이를 생성할 때 디바이스에 대한 정보를 에 제공

 

Transit Gateway

전송 게이트웨이는 가상 프라이빗 클라우드(VPC)와 온프레미스 네트워크를 상호 연결하는 데 사용할 수 있는 전송 허브

 

Openswan

 Linux  FreeBSD  위한 완전한 IPsec 구현 도구

원래 사설간 VPN통신은 VPN장비가 따로 있어야하나 오픈스완을 이용해 VPN서버를 구축할수 있다.

근데 일단 오픈스완은 Datasync나 Storagegateway 에이전트같은게 아니라서

온프레 -> 클라우드로 먼저 핑 선빵을 치는 프로그램이 아니기 때문에 (먼저 보내야지 사설안으로 돌아오는게 가능)

온프레랑 클라우드가 공인 ip없이는 통신하는게 이것만으론 불가능하다.

 

 

 

 

 

 

 

-1. 전제

이미 이전에 이렇게 제작한 vpc를 그대로 쓴다.

 

온프레미스쪽은 공인 IP가 붙어있는 IDC 서버고,

편의상 방화벽, SELINUX 끄고 인터넷이 되도록 네트워크 세팅 마친 상태다. 

 

이것과 같지 않더라도 디폴트 vpc를 쓴다던지 하면 퍼블릭 서브넷에 EIP 할당해줘서 쓰면 된다. (EC2 넣고)

아래와 같은 간소화면 된다. (온프레미스쪽도 AWS에 구성할수 있다)

 

 

 

 

1. 보안그룹

오픈스완을 이용하기 위한 보안그룹 생성

나처럼 한쪽이 진짜 온프레인 경우 이런 보안그룹 작업 대신

IDC쪽 VPN 오픈스완 서버쪽에 firewall을 4500 열어주면 된다.

 firewall-cmd --permanent --add-port=4500/tcp

# firewall-cmd --reload

# firewall-cmd --list-all

ssh 접속과 핑을 위한 인바운드도 허용해준다.

 

즉 이 작업은 클라우드 - to - 클라우드인 사람을 위해 넣은 장면.

 

 

 

2. EC2 생성

아까 만든 보안그룹 넣고 파블릭 서브넷(EIP있는) 에 만들어준다.

 

 

 

 

3. Custom Gateway 생성

 

 

IP 주소에는 Openswan 설치 예정인 머신 주소를 넣는다.

내경우에는 IDC에 있는 파블릭 IP가 달린 서버다.

 

4. 가상 프라이빗 게이트웨이 생성

vpc에 연결해준다.

 

 

 

 

5. Site-to-Site VPN 연결

 

 

 

정적 IP 접두사는 온프레미스의 VPC CIDR를 넣어주면 된다.

터널 옵션도 있다. 지금은 입력 안할거지만 나중에 써보겠다. GRE 터널같은건가?

 

참고로 커스텀 게이트웨이에 사설IP를 넣으면 생성이 안된다. (통신 한번 해보고 안되는거 확인해본듯 하다)

 

만들어진 결과물을 보면 pending상태로 뜨고 터널 세부 정보에 2개의 터널 상태가 모두 작동 중지다.

아직 온프레미스 쪽에 오픈스완 설정을 안 했기 때문에 통신 수립이 안되는 것이다.

그래서 일단 이건 냅두고 온프레미스에 오픈스완 먼저 설치해보겠다.

 

 

 

 

6. 라우팅 테이블 설정

오픈스완 설정 전에 우선 라우팅 테이블을 전파해야 한다.

다음과 같이 public subnet쪽의 라우팅 테이블은 전파가 '아니오'로 돼있는데 이것을 '예'로 변경해 줘야 한다.

 

 

라우팅 전파 편집 -> 활성화

 

만약 EC2가 public쪽이 아니라 private 쪽 서브넷에 있다면 private쪽도 마찬가지로 전파 활성화 해줘야한다.

 

 

 

 

 

7. VPN 구성 다운로드

 

오픈스완 선택

 

다운받은 구성은 다음과 같다.

터널 설정이 2개가 들어가 있지만 줄여서 1개만 설정해보겠다.

이 구성중에 터널설정 부분이 필요하다.

Amazon Web Services
Virtual Private Cloud

AWS utilizes unique identifiers to manipulate the configuration of
a VPN Connection. Each VPN Connection is assigned an identifier and is
associated with two other identifiers, namely the
Customer Gateway Identifier and Virtual Private Gateway Identifier.

Your VPN Connection ID                  : vpn-0cecb75fc83f0af3d
Your Virtual Private Gateway ID         : vgw-0a565d2b98cd27d40
Your Customer Gateway ID                : cgw-0720bf0f6baa94a42


This configuration consists of two tunnels. Both tunnels must be
configured on your Customer Gateway, but only one of those tunnels should be up at any given time.

At this time this configuration has only been tested for Openswan 2.6.38 or later, but may work with earlier versions.


--------------------------------------------------------------------------------------------------------------------
IPSEC Tunnel #1
--------------------------------------------------------------------------------------------------------------------

This configuration assumes that you already have a default openswan installation in place on the Amazon Linux operating system (but may also work with other distros as well)

1) Open /etc/sysctl.conf and ensure that its values match the following:
   net.ipv4.ip_forward = 1
   net.ipv4.conf.default.rp_filter = 0
   net.ipv4.conf.default.accept_source_route = 0

2) Apply the changes in step 1 by executing the command 'sysctl -p'

3) Open /etc/ipsec.conf and look for the line below. Ensure that the # in front of the line has been removed, then save and exit the file.
    #include /etc/ipsec.d/*.conf

4) Create a new file at /etc/ipsec.d/aws.conf if doesn't already exist, and then open it. Append the following configuration to the end in the file:
 #leftsubnet= is the local network behind your openswan server, and you will need to replace the <LOCAL NETWORK> below with this value (don't include the brackets). If you have multiple subnets, you can use 0.0.0.0/0 instead.
 #rightsubnet= is the remote network on the other side of your VPN tunnel that you wish to have connectivity with, and you will need to replace <REMOTE NETWORK> with this value (don't include brackets).

conn Tunnel1
	authby=secret
	auto=start
	left=%defaultroute
	leftid=111.67.218.42
	right=34.204.184.254
	type=tunnel
	ikelifetime=8h
	keylife=1h
	phase2alg=aes128-sha1;modp1024
	ike=aes128-sha1;modp1024
	auth=esp
	keyingtries=%forever
	keyexchange=ike
	leftsubnet=<LOCAL NETWORK>
	rightsubnet=<REMOTE NETWORK>
	dpddelay=10
	dpdtimeout=30
	dpdaction=restart_by_peer

5) Create a new file at /etc/ipsec.d/aws.secrets if it doesn't already exist, and append this line to the file (be mindful of the spacing!):
111.67.218.42 34.204.184.254: PSK "5o3pqdsgsgsfsdggClC00j2QQYjl45kB"


--------------------------------------------------------------------------------------------------------------------
IPSEC Tunnel #2
--------------------------------------------------------------------------------------------------------------------

This configuration assumes that you already have a default openswan installation in place on the Amazon Linux operating system (but may also work with other distros as well)

1) Open /etc/sysctl.conf and ensure that its values match the following:
   net.ipv4.ip_forward = 1
   net.ipv4.conf.default.rp_filter = 0
   net.ipv4.conf.default.accept_source_route = 0

2) Apply the changes in step 1 by executing the command 'sysctl -p'

3) Open /etc/ipsec.conf and look for the line below. Ensure that the # in front of the line has been removed, then save and exit the file.
    #include /etc/ipsec.d/*.conf

4) Create a new file at /etc/ipsec.d/aws.conf if doesn't already exist, and then open it. Append the following configuration to the end in the file:
 #leftsubnet= is the local network behind your openswan server, and you will need to replace the <LOCAL NETWORK> below with this value (don't include the brackets). If you have multiple subnets, you can use 0.0.0.0/0 instead.
 #rightsubnet= is the remote network on the other side of your VPN tunnel that you wish to have connectivity with, and you will need to replace <REMOTE NETWORK> with this value (don't include brackets).

conn Tunnel2
	authby=secret
	auto=start
	left=%defaultroute
	leftid=111.67.218.42
	right=52.2.187.68
	type=tunnel
	ikelifetime=8h
	keylife=1h
	phase2alg=aes128-sha1;modp1024
	ike=aes128-sha1;modp1024
	auth=esp
	keyingtries=%forever
	keyexchange=ike
	leftsubnet=<LOCAL NETWORK>
	rightsubnet=<REMOTE NETWORK>
	dpddelay=10
	dpdtimeout=30
	dpdaction=restart_by_peer

5) Create a new file at /etc/ipsec.d/aws.secrets if it doesn't already exist, and append this line to the file (be mindful of the spacing!):
111.67.218.42 52.2.187.68: PSK "9qI92aui7sdgsgsdgsgdsgsg62IcAS"


--------------------------------------------------------------------------------------------------------------------
(OPTIONAL CONFIG) Tunnel Healthcheck and Failover
--------------------------------------------------------------------------------------------------------------------

Openswan does not provide a built-in tunnel failover functionality. However, there are some third-party workarounds to this.

=== DISCLAIMER ===
Please be aware that AWS is in no way responsible for any of the use, management, maintenance, or potential issues you may encounter with the third-party workarounds. It is strongly recommended that you thoroughly test any failover solution prior to implementing it into your production environment



  Additional Notes and Questions
  - Amazon Virtual Private Cloud Getting Started Guide:
        http://docs.amazonwebservices.com/AmazonVPC/latest/GettingStartedGuide
  - Amazon Virtual Private Cloud Network Administrator Guide:
        http://docs.amazonwebservices.com/AmazonVPC/latest/NetworkAdminGuide

 

 

 

 

8. 온프레미스에 Openswan 설치 및 통신 설정

 

Openswan 설치

yum install -y openswan

 

Network 설정 추가

/etc/sysctl.conf 파일을 열어 아래 내용을 추가.

net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.accept_source_route = 0

 

변경된 사항을 반영

sysctl -p

 

IPSec 설정 추가

/etc/ipsec.conf 파일을 열어 아래 부분이 주석 처리되어 있지 않는지 확인한다.

주석 처리되어있다면 #을 제거

#include /etc/ipsec.d/*.conf

 

 

/etc/ipsec.d/aws.conf 파일을 생성하고 아래 내용을 추가한다.

AWS에서 내려 받은 파일을 사용한다면, 그대로 사용은 불가능하고, 추가수정/삭제가 필요하다.

  • leftid= Openswan 설치 예정인 머신 공인 IP 주소. (다운받은 구성에 이미 입력돼있다)
  • right= AWS에서 이 VPN통신을 받는 공인 주소 (다운받은 구성에 이미 입력돼있다)
  • auth=esp 라인은 삭제 (또는 주석 처리) 한다.
  • leftsubnet=(온프레의 머신이 있는 Private CIDR)
  • rightsubnet=(AWS의 EC2가 있는 Private CIDR)
conn Tunnel1
        authby=secret
        auto=start
        left=%defaultroute
        leftid=111.67.218.42
        right=34.204.184.254
        type=tunnel
        ikelifetime=8h
        keylife=1h
        phase2alg=aes128-sha1;modp1024
        ike=aes128-sha1;modp1024
        #auth=esp
        keyingtries=%forever
        keyexchange=ike
        leftsubnet=192.168.0.0/24
        rightsubnet=10.0.0.0/16
        dpddelay=10
        dpdtimeout=30
        dpdaction=restart_by_peer

 

 

/etc/ipsec.d/aws.secrets 파일을 생성하여 VPN 통신 시 필요한 비밀 키를 저장한다.

구성 파일의 터널1 아래에있다. 터널마다 정보가 다르니 주의.

(conf 파일과 파일 이름이 동일해야 한다.)

111.67.218.42 34.204.184.254: PSK "5o3psdsggsgsdoClC00j2QQYjl45kB"

 

IPSec 서비스 재시작

 

설정 적용을 위해 vpn 서비스를 재시작 한다.

systemctl start ipsec.service
systemctl enable ipsec.service
systemctl status ipsec.service

 

정상적으로 active 

 

 

 

 

9. IDC vpntest-idc-cgw EC2 네트워크 설정 수정

 

(1) aws경우=========================================================

만약 aws-to-aws 로 이 문서를 진행하고 있다면,

설정한 라우팅테이블만으로 통신하기 위해 네트워크 설정을 추가로 수정해준다.

 

온프레미스 IDC 쪽으로 설정된 클라우드 EC2로 가서 오픈스완을 설치한 VPN서버쪽 인스턴스를 선택하고

 작업 > 네트워킹 > 소스/대상 확인 변경을 누른다.

소스/대상 확인 중지에 체크한 후 저장

 

 

IDC Private subnet 라우팅 테이블에 규칙 추가

 

aws에선 온프레로 설정된 서브넷의 라우팅테이블을 만진다

vpc-라우팅 테이블 - 라우팅 편집으로 이동해서 클라우드상으로 설정된 vpc의 파블릭 서브넷을 추가해주고

vpn서버 뒷단에 있는 서비스해주는 프라이빗 서브넷들도 추가해준다.(EC2가위치한곳)

======================================================================

 

 

(2) 진짜 온프레 서버 파블릭ip 쓰는경우========================================

 

원래 라우팅 테이블

 

 

 

 

 

 

 

 

10. 결과 확인

 

오픈스완 서버에서 가상 사설 게이트웨이쪽 공인 터널 IP로 핑 보내짐

 

터널 잘 뚫림

 

리눅스 사설 서브넷에 들어있는 EC2 접속후 온프레미스 IDC VPN 머신 공인 IP에 ping 성공.

 

 

이런식으로 상대방의 사설 ip를 치면 사설 to 사설 통신이 성립돼야 하는데

이상하게 AWS EC2에서 IDC온프레 VPN서버쪽으로 핑은 오는데 그 반대는 안된다.

 

 

 

 

11. 트러블슈팅

 

VPN 서버로 만들어진  (openswan) 서버는 네트워크 카드가 두개였는데,

하나는 공인 ip 들어있는 카드, 다른 하나는 뒷단 사설(서비스쪽)용 네트워크 카드였다.

근데 그냥 아무 옵션 없이 VPN 서버쪽에서 AWS 사설ip로 ping을 날리면

공인 ip카드 메트릭이 더 낮아서 공인 ip가 출발지 소스가 되어서 우리가 지금까지 한 OPENSWAN VPN 설정 대상을 벗어난다. (우리는 사설 to 사설 통신을 할때 VPN 통신을 수립하게 한 것이다)

 

해결책 : 

애초 VPN 서버는 자체적으로 핑을 날리거나 다른곳과 통신할 일이 없으므로

그 뒷단에 통신이 필요한 사설 서버에 라우팅 소스 설정을 해주면 된다.

AWS쪽 사설 ip가 목적지면 출발지 네트워크카드를 공인ip카드가 아닌 사설ip카드로 라우팅.

 

사설단의 또 다른 서버이다. 여기서 net-tools 설치한다음

route 명령어로 AWS 사설대 IP로 보내는 모든 트레픽은 VPN(openswan)서버의 사설 IP로 보내도록 라우팅 했다.

 

완전 사설단 (공인ip도 없는) 서비스 서버에서 AWS VPC 내부 사설단 EC2와 핑 교환 된다.

성공

 

 

 

 

 

 

터널 하나만 뚫었더니 둘다 뚫으라고 알람온다.