top of page
작성자 사진LoxiLB

LoxiLB로 AWS IPSec VPN 연동하기

이 포스트는 LoxiLB와 AWS Site to Site IPSec VPN 연동에 대한 가이드입니다. Strongswan 설치, LoxiLB Standalone 준비, AWS 내 Site-to-Site VPN 설정, LoxiLB 설정 및 결과 확인 등의 내용이 포함되어 있습니다. 또한, 기본 설정 파일들도 제공됩니다. 전체 토폴로지는 다음과 같습니다.


토폴로지

이 포스트의 목차는 IPsec tunnel을 위한 Strongswan의 설치, LoxiLB 설치, AWS설정 및 LoxiLB설정 순서로 진행됩니다.

StrongSwan의 IPSec VPN과 LoxiLB의 BGP등의 기본적인 설정 파일은 다음과 같습니다. 이 파일들을 기반으로 시나리오를 진행합니다.

gobgp.conf

ipsec.conf

ipsec.secrets

ipsec-vti.sh

Strongswan 설치


Strongswan 개요

StrongSwan은 오픈 소스 VPN 솔루션 중 하나입니다. 이 솔루션은 IPSec 기술을 사용하여 가상 사설망(VPN)을 만들 수 있습니다. StrongSwan은 Linux, FreeBSD, macOS, iOS 및 Android와 같은 다양한 운영 체제에서 사용할 수 있습니다.

StrongSwan은 IKEv1 및 IKEv2 프로토콜을 지원합니다. IKE는 IPSec에서 사용하는 키 교환 및 보안 연결을 설정하는 데 사용되는 프로토콜입니다. IKEv2는 더욱 안전한 프로토콜로 알려져 있으며 모바일 장치와 같은 제한된 환경에서도 작동합니다.

StrongSwan은 강력한 보안 기능을 제공합니다. 이를 통해 VPN 연결이 안전하게 유지될 수 있습니다. 또한 StrongSwan은 기업 VPN 및 클라우드 환경과 같이 복잡한 네트워크 구성에도 적합합니다.

StrongSwan은 사용이 어렵지 않으며, 많은 리눅스 배포판에서 패키지로 제공됩니다. StrongSwan을 사용하면 안전한 VPN을 쉽게 설정할 수 있으므로, 기업 및 개인 사용자 모두에게 유용한 솔루션입니다.


Strongswan 설치방법

IPsec터널을 위한 strongswan을 설치합니다. 이 설치에서는 5.9.9버전을 사용해서 설치를 진행합니다.

wget https://download.strongswan.org/strongswan-5.9.9.tar.bz2
tar xjf strongswan-5.9.9.tar.bz2
cd strongswan-5.9.9/
./configure --prefix=/usr --sysconfdir=/etc
make
sudo make install

Strongswan 설치 트러블 슈팅

  • configure실행 시 C언어 라이브러리가 없다는 에러메세지가 뜨는 경우 "sudo apt install gcc" 를 사용해서 설치하면 진행이 됩니다.

  • configure실행 시 gmp 라이브러리가 없다는 에러메세지가 뜨는 경우 "sudo apt install libgmp3-dev" 를 사용해서 설치하면 진행이 됩니다.


Strongswan 설치 확인

설치가 완료 되었으면 아래 명령어와 같이 버전이 보입니다.

$ ipsec version
Linux strongSwan U5.9.9/K5.15.0-46-generic
University of Applied Sciences Rapperswil, Switzerland


Strongswan 설치 영상

전체 설치과정은 다음 영상을 참조하시면 됩니다.

이것으로 VPN연결을 위한 Strongswan을 사용할 준비가 모두 되었습니다!


LoxiLB standalone 모드 준비하기


LoxiLB standalone 모드 개요

LoxiLB는 하드웨어 서버에 직접 설치하는 방식인 Standalone 모드를 지원합니다. 참고한 설치 메뉴얼은 https://github.com/loxilb-io/loxilbdocs/blob/main/docs/standalone.md 입니다.

준비단계 및 설치에서는 관리자권한(sudo)가 필요하니 미리 준비 하시길 바랍니다.

준비 단계 1 ) Golang 설치

준비 단계 2) Gobgp 설치

준비 단계 3 option) IPv6 활성화


LoxiLB standalone 설치

LoxiLB Github에서 deb파일을 다운받아서 dpkg하는 방식으로 LoxiLB를 하드웨어에 설치합니다.

wget https://github.com/loxilb-io/loxilb/releases/download/v0.8.2/loxilb_0.8.2-amd64.deb
sudo dpkg -i loxilb_0.8.2-amd64.deb

LoxiLB standalone 설치 확인

LoxiLB가 설치가 완료되면 Loxicmd의 help 명령어를 쳐서 기본적인 설치가 완료 되었는지 확인합니다.

$ loxicmd help
A longer description that spans multiple lines and likely contains
        examples and usage of using your application. For example:

        Cobra is a CLI library for Go that empowers applications.
        This application is a tool to generate the needed files
        to quickly create a Cobra application.

Usage:
  loxicmd [command]

Available Commands:
  apply       Apply configuration
  completion  Generate the autocompletion script for the specified shell
  create      Create a Load balance features in the LoxiLB.
  delete      Delete a Load balance features in the LoxiLB.
  get         A brief description of your command
  help        Help about any command
  save        saves current configuration

Flags:
  -s, --apiserver string   Set API server IP address (default "127.0.0.1")
  -h, --help               help for loxicmd
  -o, --output string      Set output layer (ex.) wide, json)
  -p, --port int16         Set API server port number (default 11111)
      --protocol string    Set API server http/https (default "http")
  -t, --timeout int16      Set timeout (default 5)

Use "loxicmd [command] --help" for more information about a command.

LoxiLB standalone 설치 영상


이것으로 Standalone모드의 LoxiLB 설치가 완료 되었습니다!


AWS내 Site-to-Site VPN 설정하기


AWS 연동 개요

이 포스트에서는 AWS에서 Site-to-Site VPN 설정 방법에 대해 설명합니다. 먼저, AWS내 Transit Gateway, Customer Gateway, Site-to-Site VPN을 생성 후 VPN설정 파일을 다운로드 합니다. 이 설정파일은 IPSec부터 BGP까지 설정하는데 필요한 정보가 들어있습니다.

이후 Strongswan을 사용하여 IPsec을 설정하는 방법에 대해 다룹니다. LoxiLB는 Strongswan IPsec 기능을 지원하며, 이를 통해 안전한 통신이 가능합니다. 설정을 위해 ipsec.conf, ipsec.secrets, ipsec-vti.sh 파일이 있으며 이 파일을 환경에 맞게 수정하고 실행합니다. 각 파일에서는 IPSec 터널을 생성하는 설정과 PSK 키를 작성하며, 이를 통해 터널을 뚫고 연결을 설정합니다.

이어서 BGP를 연결하고 Transit Gateway Attachment를 생성하여 VPC 간의 통신을 안전하고 간편하게 할 수 있습니다. BGP를 연결하려면 gobgp.conf 파일을 수정해야 합니다. 이 파일에서는 ASN과 Neighbor IP Address를 설정합니다.

마지막으로, Transit Gateway Attachment를 생성하여 VPC 간의 통신을 설정합니다. Attachment를 생성하면, VPC에서 Transit Gateway로의 트래픽 전송을 자동으로 처리하고, 트래픽이 다른 VPC, VPN 또는 Direct Connect 연결로 전달될 수 있도록 라우팅 구성을 관리합니다.

이 문서를 통해 AWS에서 Site-to-Site VPN을 설정하는 방법을 알아보겠습니다.



AWS Transit Gateway 생성

AWS Management Console에서 Transit Gateway를 생성합니다. 다른 네트워크 설정을 생성하는 것에 비해서 시간이 조금 걸리는 편이라 가장 먼저 생성을 하면 후에 시간 절약에 좋습니다. 만드는 방법은 어렵지 않고 옵션만 확인 후 생성하면 됩니다.


AWS Customer Gateway 생성

Customer gateway는 OnPrem에 위치한 Gateway의 정보를 입력하여 생성합니다. 현재 구성에서는 LoxiLB가 Gateway로 BGP를 사용하여 외부와 통신합니다.

본 포스트에서는 ASN으로 65012와 Peer IP 로 1.237.173.74를 사용하여 네트워크를 구성했습니다. AWS는 Default ASN으로 64512를 갖고있기 때문에 64512의 ASN은 제외하고 설정을 하는 것이 좋습니다.


AWS Site-to-Site VPN 생성

AWS Site-to-Site VPN은 AWS VPC(Virtual Private Cloud)와 고객 데이터 센터, 본사 또는 다른 클라우드 제공 업체의 네트워크를 안전하게 연결하기 위한 서비스입니다. 이를 통해 AWS VPC와 온프레미스 네트워크 간에 안전한 암호화된 연결을 설정할 수 있습니다.

Site to Site VPN 설정하기 위해서는 AWS와 LoxiLB 양측에서 모두 설정해야합니다. AWS측 설정부터 보면 다음과 같습니다.


Transit Gateway attachment에 VPC연결하기

Transit Gateway Attachment은 AWS Transit Gateway와 VPC를 연결하는 방법 중 하나입니다. Attachment를 생성하면, VPC에서 Transit Gateway로의 트래픽 전송을 자동으로 처리하고, 트래픽이 다른 VPC, VPN 또는 Direct Connect 연결로 전달될 수 있도록 라우팅 구성을 관리합니다. 이를 통해 VPC 간의 통신이 안전하고 간편하게 가능해집니다.

연결하는 방법은 다음과 같습니다.


옵션) 인스턴스 내 라우팅 테이블 설정

이 과정은 테스트를 위한 과정으로 남아있습니다. 현재 모든 VPC가 따로 디폴트 게이트웨이를 갖고있기 때문에 이 과정이 따로 필요합니다. 만약 VPC의 디폴트 게이트웨이가 Transit gateway로 설정이 되어있다면 이 과정은 생략해도 됩니다.


AWS Site-to-Site VPN 생성 영상



LoxiLB IPsec 설정하기

LoxiLB는 Strongswan을 사용하여 IPsec기능을 지원 및 가속화합니다. 이 설정과정에서는 ipsec.conf, ipsec.secrets, ipsec-vti.sh 등 총 3개의 파일을 수정하여 설정합니다. ipsec.conf파일부터 순서대로 설정 방법을 확인해보겠습니다.

  • ipsec.conf

conn %default
			......
conn AWS-VPC-GW1
         # Customer Gateway: :
         leftid=192.168.14.1
         left=1.237.173.74
         # Virtual Private Gateway :
         right=OUTSIDE_CUSTOMER_GATEWAY_SEOUL_IP_1
         rightid=OUTSIDE_CUSTOMER_GATEWAY_SEOUL_IP_1
         auto=start
         mark=100
conn AWS-VPC-GW2
         # Customer Gateway: :
         leftid=192.168.13.1
         left=1.237.173.74
         # Virtual Private Gateway :
         right=OUTSIDE_CUSTOMER_GATEWAY_SEOUL_IP_2
         rightid=OUTSIDE_CUSTOMER_GATEWAY_SEOUL_IP_2
         auto=start
         mark=200
conn AWS-VPC-GW3
         # Customer Gateway: :
         leftid=192.168.15.1
         left=1.237.173.74
         # Virtual Private Gateway :
         right=OUTSIDE_CUSTOMER_GATEWAY_OSAKA_IP_1
         rightid=OUTSIDE_CUSTOMER_GATEWAY_OSAKA_IP_1
         auto=start
         mark=300
conn AWS-VPC-GW4
         # Customer Gateway: :
         leftid=192.168.16.1
         left=1.237.173.74
         # Virtual Private Gateway :
         right=OUTSIDE_CUSTOMER_GATEWAY_OSAKA_IP_2
         rightid=OUTSIDE_CUSTOMER_GATEWAY_OSAKA_IP_2
         auto=start
         mark=400

conn %default는 IPSec 터널을 생성하기 위한 설정에서 공통적으로 사용하는 부분이며, **conn AWS-VPC-GW${숫자}**부분이 각자의 터널을 뚫기 위한 내용부분입니다. left에 쓰는 아이피주소는 on prem에 있는 아이피 주소를 적고 right부분에 AWS에서 제공하는 터널 아이피를 넣으면 됩니다. 이 포스트에서는 서울에 2개 오사카에 2개 총 4개의 터널 아이피를 받아 터널에 대한 기본 설정을 작성합니다.

정보) 이 정보는 AWS의 Site to Site VPN 탭에서 바로 확인하거나 다운로드 하여 확인할 수 있습니다. PSK 값을 확인하기 위해서 다운로드가 필수불가결하니 바로 설정파일을 다운로드 하셔서 확인하시면 됩니다.

다운받은 VPN configuration 파일에서 Outside IP Addresses내 Virtual Private Gateway에 명시된 IP주소입니다.


  • ipsec.secrets

# ipsec.secrets - strongSwan IPsec secrets file
1.237.173.74 OUTSIDE_CUSTOMER_GATEWAY_SEOUL_IP_1 : PSK "PRE-SHARD-KEY"
1.237.173.74 OUTSIDE_CUSTOMER_GATEWAY_SEOUL_IP_2 : PSK "PRE-SHARD-KEY"
1.237.173.74 OUTSIDE_CUSTOMER_GATEWAY_OSAKA_IP_1 : PSK "PRE-SHARD-KEY"
1.237.173.74 OUTSIDE_CUSTOMER_GATEWAY_OSAKA_IP_2 : PSK "PRE-SHARD-KEY"

ipsec.secrets은 IPSec을 사용하기 위한 터널의 PSK Key를 작성하는 파일입니다. ipsec.conf파일에서 작성한 터널 아이피와 매핑이 되는 PSK 키를 적습니다. 위에서도 4개의 터널에 대한 설정이 있으므로 여기도 4개의 터널에 대한 설정을 작성합니다. IP주소는 다운받은 VPN configuration 파일에서 Outside IP Addresses내 Virtual Private Gateway에 명시된 아이이고, PSK는 Pre-Shared Key 부분을 참조 하시면 됩니다.


  • ipsec-vti.sh

#!/bin/bash

#
# /etc/ipsec-vti.sh
#

IP=$(which ip)
IPTABLES=$(which iptables)

PLUTO_MARK_OUT_ARR=(${PLUTO_MARK_OUT//// })
PLUTO_MARK_IN_ARR=(${PLUTO_MARK_IN//// })
case "$PLUTO_CONNECTION" in
AWS-VPC-GW1)
VTI_INTERFACE=vti0
VTI_LOCALADDR=INSIDE_CUSTOMER_GATEWAY_SEOUL_IP_1
VTI_REMOTEADDR=VIRTUSL_PRIVATE_GATEWAY_SEOUL_IP_1
;;
AWS-VPC-GW2)
VTI_INTERFACE=vti1
VTI_LOCALADDR=INSIDE_CUSTOMER_GATEWAY_SEOUL_IP_2
VTI_REMOTEADDR=VIRTUSL_PRIVATE_GATEWAY_SEOUL_IP_1
;;
AWS-VPC-GW3)
VTI_INTERFACE=vti2
VTI_LOCALADDR=INSIDE_CUSTOMER_GATEWAY_OSAKA_IP_1
VTI_REMOTEADDR=VIRTUSL_PRIVATE_GATEWAY_OSKAK_IP_1
;;
AWS-VPC-GW4)
VTI_INTERFACE=vti3
VTI_LOCALADDR=INSIDE_CUSTOMER_GATEWAY_OSKAK_IP_2
VTI_REMOTEADDR=VIRTUSL_PRIVATE_GATEWAY_OSKAK_IP_2
;;
esac
......

다운받은 VPN configuration 파일에서 Inside IP Addresses의 Customer Gateway를 INSIDE_CUSTOMER_GATEWAY_…에 넣고 Virtual Private Gateway를 VIRTUSL_PRIVATE_GATEWAY_…에 넣으시면 설정이 완료됩니다.


LoxiLB IPsec 실행 및 확인

우선 설정파일인 ipsec.conf, ipsec.secrets, ipsec-vti.sh를 모두 /etc디렉토리에 이동시켜야 합니다. 간단하게 cp ipsec.* /etc/. 를 통해서 카피한 뒤 chown 775 /etc/ipsec-vti.sh 를 통해 스크립트의 실행 권한을 바꿔주면 IPsec을 위한 설정이 모두 완료 되었습니다.

이제 ipsec start명령어를 통해 ipsec을 실행하고 ipsec status명령어를 통해 현재 터널이 connection인지 establish인지 확인 할 수 있습니다. 여기서 모두 Establish가 나오면 연결이 성립이 된 것입니다. 만약 Establish가 나오지 않는다면 IP주소 입력, PSK, 인터넷 연결 등을 확인 해서 문제를 모두 해결 한 뒤에 다음 단계로 넘어가면 되겠습니다.

ipsec start
ipsec status


LoxiLB IPsec 설정 동영상


LoxiLB GoBGP 설정하기

앞선 단계서 수행한 Strongswan을 통해 생성된 IPsec Tunnel에 BGP를 연결하는 과정입니다. 다운받은 VPN configuration 파일에서 BGP Configuration Options을 보면 Virtual Private Gateway ASN 과 Neighbor IP Address가 있는데 순서는 상관없이 4개의 Neighbors를 모두 쓰면 됩니다 neighbors.config에 peer-as가 Virtual Private Gateway ASN과 동일한 번호인데, 64512로 값이 세팅이 되어있기에, 위의 값을 그대로 사용하면 됩니다. 그외 neighbor-address에 Neighbor IP Address의 값을 입력하면 모두 완료됩니다.

주의) 라우팅 프로토콜을 돌리기 때문에, 같은 Network대역대가 다른 Zone에 있으면 문제가 생길 위험이 큽니다. 주의해서 설정해주세요.

[global.config]
  as = 65012
  router-id = "1.237.173.74"

[[neighbors]]
  [neighbors.config]
    neighbor-address = PEER_IP_IN_SEOUL_1
    peer-as = 64512

[[neighbors]]
  [neighbors.config]
    neighbor-address = PEER_IP_IN_SEOUL_2
    peer-as = 64512

[[neighbors]]
  [neighbors.config]
    neighbor-address = PEER_IP_IN_OSAKA_1
    peer-as = 64512

[[neighbors]]
  [neighbors.config]
    neighbor-address = PEER_IP_IN_OSAKA_2
    peer-as = 64512

LoxiLB GoBGP 설정 동영상


LoxiLB 설정 및 결과 확인


LoxiLB Load Balancer Rule 설정

로드밸런싱을 위해 Endpoint로 AWS 서울 Zone과 오사카Zone의 VPN을 통한 사설 아이피와 Fullnat모드로 Rule넣습니다. BGP로 라우팅 테이블을 넘기기 위해 bgp옵션을 넣어 rule을 생성합니다.

loxicmd create lb 10.1.1.1 --tcp 3000:80 --endpoints 192.168.3.145:1,172.31.47.8:1 --mode fullnat --bgp

LoxiLB Endpoint 설정

Endpoint는 LB rule을 추가하면 자동으로 추가가 됩니다. Default값으로 Health check를 Ping을 사용해서 하는데 이 때 서비스가 제대로 작동하지 않아도 Endpoint가 Ping 작동하니 잘 살아있다고 판단하여 서비스에 문제가 생길 수 있습니다.

이런 문제를 미리 대처하기 위해 prototype 옵션을 http로, l4port를 80으로 변경해서 추가합니다. 이것으로 Endpoint의 Health check를 주기적으로 합니다.

주의) endpoint의 상태값은 ok | nok 둘 중 하나의 값을 가집니다. 만약 nok의 값을 가지고 있으면 해당 endpoint로는 로드밸런싱을 하지 않습니다.

loxicmd create endpoint 172.31.47.8 --desc=zone1host --probetype=http --l4port=80 --period=10 --retries=2
loxicmd create endpoint 192.168.3.145 --desc=zone1host --probetype=http --l4port=80 --period=10 --retries=2

로드밸런싱 결과 확인


TCPdump를 통해 각각 인스턴스에 번갈아 가면서 로드밸런싱이 작동되는것을 확인 할 수 있습니다.


Endpoint 서비스 확인

하나의 Zone(이 포스트에서는 오사카)의 서비스가 중단 되었을 때, Endpoint에서 감지하여 현재 살아있는 Zone으로만 서비스를 제공하는 것을 확인 할 수 있습니다.


레퍼런스 및 참조


긴 글 읽어주셔서 감사합니다. 더 많은 정보를 원하시면 Github 페이지 방문 부탁드립니다!


조회수 177회댓글 0개

최근 게시물

전체 보기

Comments


GIThub

Learn, Contribute & Share

GETTING STARTED

Get started with deploying LoxiLB in your cluster

Documentation

Check LoxiLB Documentation for more information.

Join the LoxiLB slack channel to chat with the developers community.

bottom of page