설치형 개인 VPN 서버 알고(Algo)
아마존 라이트세일에 설치하고 운영하기

들어가며: VPN의 이해

VPN은 Virtual Private Network의 줄임말로 가상 사설망 기능을 의미합니다. VPN 서버는 가상 사설망을 제공해줍니다. VPN 서버에 접속하는 클라이언트들은 가상 사설망의 내부 IP를 부여받고 VPN 서버의 네트워크 환경을 경유해 이 네트워크의 서버들에 접속할 수 있습니다. 회사나 집에서 VPN 서버를 운영하면 외부에서 회사 네트워크나 홈 네트워크의 장비에 손쉽게 접근할 수 있습니다. 또한 클라이언트들은 VPN 서버의 네트워크 환경에서 인터넷에 접근할 수도 있기 때문에 상용 VPN 서비스들은 이런 기능을 유료로 제공합니다. 예를 들어 특정 국가에서만 이용 가능한 서비스를 다른 나라에서 사용하고자 하는 경우 해당 국가의 VPN 서버에 접속해서 서비스를 사용하는 것도 가능합니다.

이러한 역할을 하는 다양한 유료 VNP 서비스가 있습니다만, 직접 VPN 서버를 구축하는 것도 가능합니다. 홈 네트워크의 경우 공유기에서 VPN 기능을 부가기능으로 제공되기도 하며, 원격 서버에 VPN 서버를 직접 설치하고 운영하는 것도 가능합니다. Algo VPN 프로젝트는 클라우드(원격 서버)에 개인용 VPN을 손쉽게 설치하고 운영할 수 있도록 도와줍니다.

이 글에서는 알고Algo VPN 서버를 아마존 라이트세일Amazon Lightsail에 설치하는 방법과 와이어가드WireGuard 클라이언트를 사용해 VPN을 사용하는 방법에 대해서 소개하고자 합니다.

알고(Algo) VPN 서버 설치의 이해 및 준비

Algo VPN 프로젝트에서는 앤서블Ansible 기반의 설치 스크립트를 제공합니다. 앤서블에 대해서 잘 모르더라도 설치할 수는 있습니다만, 처음 사용해보면 쉽지는 않습니다. 또한 Algo에서도 다양한 설치 방법을 지원하기 때문에 기본적인 설치 과정을 미리 알고 있으면 좋습니다.

먼저 앤서블은 원격 서버에 Algo VPN 서버를 프로비저닝을 하기 위해 사용되는 도구입니다. 프로비저닝은 서버를 특정한 용도로 사용할 수 있도록 준비하는 과정을 의미합니다. 이 내용을 앤서블에서는 플레이북이라는 형태로 정의합니다. 앤서블에서는 이 플레이북의 내용이 프로비저닝되는 원격 서버들을 인벤토리라고 부릅니다. 따라서 앤서블을 사용하기 위해서는 다음 3가지가 필요합니다.

  1. 앤서블을 실행하는 서버
  2. 앤서블 플레이북(서버 설정을 담은 코드)
  3. 앤서블 플레이북이 적용되는 서버(인벤토리)

우선 2번은 Algo VPN 프로젝트 안에 포함되어있습니다.

1번을 수행하기 위한 컴퓨터가 한 대 필요합니다. 공식 문서에서는 직접 Python3를 사용하는 환경을 구축해서 설치를 합니다만, 이 글에서는 도커를 사용하는 방법을 소개할 예정이므로 도커가 설치되어있는 머신을 한 대 준비해주시면 됩니다.

마지막으로 3번은 Algo가 설치되는 서버입니다. VPN 서버를 실행하기 위한 서버 인스턴스 생성도 앤서블 플레이북에 정의되어있습니다. 따라서 미리 서버를 만들 필요는 없습니다. 단, 이 경우 서버를 만들고 설정하기 위한 권한이 필요합니다. 다음 글을 참고에서 사용하고자 하는 아마존 웹 서비스의 액세스 토큰을 발급 받으시기 바랍니다.*

위 글에서는 사용자의 권한으로 AdministratorAccess을 부여하고 있습니다. 이는 편리하지만 위험한 방식입니다. Algo 공식 문서에서는 아마존 라이트세일을 사용해 VPN 서버를 생성하기 위해 필요한 최소한의 권한을 다음과 같이 정의하고 있습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "LightsailDeployment",
            "Effect": "Allow",
            "Action": [
                "lightsail:GetRegions",
                "lightsail:GetInstance",
                "lightsail:CreateInstances",
                "lightsail:OpenInstancePublicPorts"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

여기까지 마쳤으면 VPN 서버 배포를 위한 준비는 모두 마쳤습니다. 그럼 바로 VPN 서버를 배포해보겠습니다.

* AWS와 같은 클라우드 서비스를 사용하는 경우 사용량만큼 요금이 발생합니다. 단순히 테스트로 실행해보는 경우 끝난 후 반드시 서버를 종료하시기 바랍니다. 또한 액세스 토큰은 클라우드 서비스에서 리소스를 생성하는 등의 권한을 가지고 있으므로 안전하게 관리해야합니다.

라이트세일 가격 정책 대해서는 공식 라이트세일 가격 정책 페이지를 참고해주세요.

노트
알고(Algo) 설치하기

Algo 서버를 반드시 라이트세일에 설치해야하는 것은 아닙니다. 이 글에서는 아마존 라이트세일에 Algo 서버를 설치하는 방법을 소개합니다만, Algo는 디지털 오션Digital Ocean, 아마존 EC2Amazon EC2, 벌처Vultr, 마이크로소프트 애저Microsoft Azure, 구글 컴퓨트 엔진Google Compute Engine과 같은 클라우드 서비스를 비롯해 리눅스 서버에 직접 설치하는 것도 지원하고 있습니다. 이에 대한 자세한 내용은 프로젝트의 Readme 문서, docs 디렉터리, 앤서블로 배포하기 등을 참고해주시기 바랍니다.

아마존 라이트세일(Amazon Lightsail)에 Algo 서버 배포하기

먼저 아마존 라이트세일을 사용하는 방법을 소개합니다. 앞서 이야기했듯이 로컬 머신에는 도커가 설치되어 있다고 가정합니다. trailofbits/algo:latest 이미지에서 bash 셸을 실행합니다.

$ docker run \
  -v $(pwd)/configs:/algo/configs \
  -e AWS_ACCESS_KEY_ID=<AWS_ACCESS_KEY_ID> \
  -e AWS_SECRET_ACCESS_KEY=<AWS_SECRET_ACCESS_KEY> \
  --entrypoint '' \
  -it \
  trailofbits/algo:latest bash

이 때 -v 옵션으로 configs 디렉터리를 연결해주어야합니다. 여기서는 도커를 실행한 디렉터리의 ./configs 디렉터리에 연결했습니다. 이 디렉터리에는 Algo 서버 배포 이후에 VPN 서버 접속을 위한 파일들이 생성됩니다. 또한 추후에 재설정을 할 때도 필요하므로 컨테이너 외부에 저장해둡니다. 다음으로 -e 옵션으로 AWS 액세스 토큰을 설정해줍니다. AWS 액세스 토큰은 액세스 키 ID와 시크릿 액세스키로 구성됩니다. <AWS_ACCESS_KEY_ID><AWS_SECRET_ACCESS_KEY>를 본인의 키 값으로 치환해줍니다.

여기서부터는 도커 컨테이너 안에서 진행합니다.

container$ source .env/bin/activate
container$ wget https://raw.githubusercontent.com/trailofbits/algo/master/config.cfg

먼저 첫 번째 명령어는 Algo 프로젝트의 파이썬 가상환경을 활성화하기 위한 명령어입니다. 다음으로 Algo 도커 이미지에는 설정 파일이 포함되어있지 않으므로 공식 저장소에서 기본 config.cfg 파일을 다운로드 받습니다. config.cfg 파일에는 VPN 사용자 목록, 라이트세일의 이미지와 인스턴스 크기 등의 설정이 있습니다만, 여기서는 기본 설정을 그대로 사용하겠습니다. VPN 사용자는 phone, laptop, desktop로 정의되어있으며, 라이트세일의 인스턴스 크기는 nano_1_0, 이미지는 ubuntu_18_04가 사용됩니다.

바로 앤서블을 사용해서 VPN 서버를 생성하고 설정해보겠습니다.

container$ ansible-playbook main.yml -e "provider=lightsail
                                         server_name=algo
                                         ondemand_cellular=false
                                         ondemand_wifi=false
                                         dns_adblocking=true
                                         ssh_tunneling=true
                                         store_pki=true
                                         region=ap-northeast-2
                                         aws_access_key=$AWS_ACCESS_KEY_ID
                                         aws_secret_key=$AWS_SECRET_ACCESS_KEY"

앤서블을 실행할 때도 여러가지 옵션을 지정합니다. 각 설정에 대한 자세한 내용은 Algo 공식 앤서블 배포 문서를 참고해주시기바랍니다.

이제 배포가 끝나기를 기다리기만 하면 됩니다. 이 과정은 시간이 꽤 걸립니다.

RUNNING HANDLER [ssh_tunneling : restart ssh] ************************************************************************************************************************************************************************************************
changed: [13.124.81.77]

PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
13.124.81.77               : ok=119  changed=78   unreachable=0    failed=0    skipped=17   rescued=0    ignored=0
localhost                  : ok=27   changed=9    unreachable=0    failed=0    skipped=19   rescued=0    ignored=0

비슷한출력과 함께 명령어가 종료된다면 Algo VPN 서버 배포가 정상적으로 완료된 것입니다.

컨테이너를 종료하고, 현재 디렉터리 아래의 ./algo 디렉터리에 들어가봅니다.

$ tree .
.
├── 13.124.81.77
│   ├── ipsec
│   │   ├── apple
│   │   │   └── ...
│   │   └── manual
│   │       └── ...
│   ├── ssh-tunnel
│   │   └── ...
│   └── wireguard
│       └── ...
├── algo.pem
└── algo.pem.pub

tree 명령어로 구조를 확인해보면 다양한 파일들이 추가된 것을 확인할 수 있습니다. Algo는 IPsec, SSH 터널, 와이어가드 등 다양한 접속 방법을 지원하고 있으며, 이 디렉터리 아래에 있는 파일을 사용해 설정할 수 있습니다. 이 글에서는 와이어가드를 사용해 VPN 클라이언트를 셋업하는 방법을 소개할 예정입니다. 상단의 IP 주소가 하나보이는데, 이 주소가 Algo VPN 서버가 셋업된 서버의 IP 주소입니다. 이는 라이트세일 웹 콘솔에서도 확인 가능합니다.

중요
trailofbits/algo:latest 이미지

도커 이미지 태그를 이해하시는 분이라면 latest 태그를 사용하는 게 이상하게 느껴지실 수도 있습니다. Algo의 경우 버전 정책이 명확하지 않은 상태이고 프로젝트가 엑티브하게 진행되고 있어, 안정 버전 이미지가 별도로 존재하지 않습니다.

latest 이미지 역시 변경 될 수 있기 때문에 이후에는 실행이되지 않을 수 있습니다. 이 경우 latest 대신 이 글을 쓰면서 사용했던 이미지를 풀 받아서 사용해보시기 바립니다. 테스트 때 사용한 config.cfg의 경로도 남겨두었습니다.

$ docker pull trailofbits/algo@sha256:53227c701fd1b91ad5f3b13652deeed1af7441afcc4dc0bc006df95109afa6ca
$ wget https://github.com/trailofbits/algo/blob/45aa0065cdf0063edc5ad3d0ded1351050da1c16/config.cfg

단, 도커 허브에서 명시적으로 태그에 연결되어있지 않아서, 이 이미지에 계속해서 접근 가능할지는 확실하지 않습니다. 이럴 경우에는 최신 공식 문서를 참고해 설정 방법을 변경해보거나, 45aa0065 커밋에서 다시 도커 이미지를 빌드하고 시도해볼 수 있습니다만, 여기서는 다루지 않습니다.

와이어가드Wireguard로 Algo VPN 접속

이제 Algo VPN 서버 설치는 끝났습니다. 이제 클라이언트를 셋업해보겠습니다. Algo VPN 서버는 와이어가드Wireguard를 사용해 데스크탑과 모바일에서 접근할 수 있습니다. 와이어가드는 오픈소스 VPN 클라이언트 애플리케이션으로 레이어 3에서 보안 연결을 구현하며, 차기 버전의 리눅스 커널에 포함될 예정입니다.

여기서는 맥북(macOS)과 아이폰(iOS)에서 VPN 클라이언트 셋업을 진행해보도록하겠습니다. 와이어가드는 맥북과 아이폰 이외에도 윈도우, 리눅스, 안드로이드 등 다양한 환경에서 사용할 수 있습니다. 자세한 내용은 와이어가드의 설치 안내 페이지를 참고해주세요.

데스크탑 셋업: 맥OS 용 와이어 가드 설치하고 셋업하기

맥OS 용 와이어가드는 앱스토어에서 다운로드 받을 수 있습니다.

와이어가드(WireGuard)는 맥OS 용 앱스토어에 등록되어있습니다

설치하고 실행하면, 서버 등록 화면이 나타납니다.

와이어가드를 실행한 화면

앞서 VPN 서버 셋업 이후에 설정 파일들이 있는 디렉터리의 내용을 확인했습니다. Import tunnel from file을 클릭해 13.124.81.77/wireguard/desktop.conf 파일을 지정해줍니다. 여기서 디렉터리의 IP 주소는 VPN 서버마다 다르니 적절히 변경해주시면 됩니다.

설정 파일을 임포트하면 앞서 설정한 VPN 서버에 접속할 수 있습니다

와이어가드에 VPN 서버의 설정이 추가되었습니다. Activiate 버튼을 클릭하면 VPN 서버가 활성화됩니다. 구글 등을 사용해 현재 인터넷에 접속된 퍼블릭 IP를 확인해봅니다.

로컬 머신의 퍼블릭 IP가 VPN 서버의 IP로 변경되었습니다

퍼블릭 IP가 13.124.81.77로 위에서 설정한 VPN 서버의 IP로 나옵니다.

맥OS의 네트워크 설정에서도 VPN에 연결된 내용을 확인할 수 있습니다.

VPN이 설정된 것을 맥OS의 네트워크 설정에서도 확인할 수 있습니다

와이어가드를 통해서 VPN이 활성화되어있습니다.

모바일: iOS 용 와이어가드 설치하고 셋업하기

아이폰이나 아이패드에서도 앱스토어를 통해 와이어가드를 설치할 수 있습니다.

iOS 앱스토어에서도 와이어가드를 찾을 수 있습니다

앱을 실행하고, Add a tunnel 버튼을 클릭합니다.

와이어가드 앱을 실행한 화면. 가운데 버튼을 눌러 설정을 진행합니다

몇 가지 선택할 수 있는 옵션이 있느네 QR Code 스캔을 선택합니다.

여러가지 설정 방법을 지원합니다. 여기서는 QR 코드를 사용합니다.

QR 코드도 아까 확인한 VPN 설정 디렉터리에 포함되어있습니다. 13.124.81.77/wireguard/png.png 파일이 바로 QR 코드입니다. 파일 경로에서 IP는 자신의 VPN 서버 IP로 적절히 변경해줍니다. 이 이미지 파일을 열고 QR 코드를 스캔해서 VPN 서버 등록을 마칩니다. 설정 과정에서 VPN 등록 및 사용에 대한 권한 관련 추가 설정이 필요할 수 있습니다.

그 다음은 데스크톱과 마찬가지로 등록한 VPN 서버를 활성화해주기만 하면 됩니다.

phone이라는 이름으로 VPN 서버를 등록하고 활성화했습니다.

VPN에 접속하면 상단 왼쪽 편에 VPN 접속 상태를 알리는 아이콘이 나타납니다. whatismyip.com에서 IP를 확인해보았습니다.

VPN에 접속한 이후 퍼블릭 IP가 VPN 서버로 바뀌었는지 확인해봅니다.

이번에도 VPN 서버 주소가 나타나는 것을 확인할 수 있습니다. 여기까지 와이어가드를 사용해 Algo VPN 서버에 접속하는 법을 알아보았습니다.

Algo VPN 서버 종료

테스트로 셋업해보았다면 서버는 반드시 종료합니다. AWSCLI가 설정되어있다면 아래 명령어로 바로 서버를 종료할 수 있습니다.

$ aws lightsail delete-instance --instance-name algo --region ap-northeast-2
...

AWSCLI가 셋업되어있지 않다면, 라이트세일 웹 콘솔에 직접 접속해서 종료하면 됩니다. 아마존 라이트세일은 유료 서비스이므로 인스턴스가 정상적으로 종료되었는지 꼭 확인하시기 바랍니다. 또한 VPN 서버가 종료되더라도 와이어가드 활성화가 자동으로 풀리지 않으므로 인터넷에 접속이 원활하지 않을 수 있습니다. 인터넷에 접속할 수 없는 경우 와이어가드가 활성화되어있지는 않은지 확인해보시기 바랍니다.

트러블 슈팅: 2개 이상의 클라이언트에서 동시 접속 하는 경우

VPN 서버를 사용하는 동안 특별한 문제를 겪지는 않았습니다만, 같은 사용자 프로필을 여러 기기에서 접속하는 경우 접속이 원활하지 않은 증상을 겪었습니다. 위의 예제에서는 맥OS는 desktop 사용자, iOS에서는 phone 사용자를 사용했는데, 이런 식으로 서로 다른 기기에서 다른 프로필을 사용하는 경우 이러한 문제는 발생하지 않았습니다.

알고의 공식 트러블 슈팅 문서에서도 다양한 케이스를 다루고 있으니, 문제가 있는 경우 참고해보시기 바랍니다.

자바스크립트 정적 분석 도구 턴(Tern)과 이맥스(Emacs) 연동

기사, 2014-03-12 - 턴(Tern)은 자바스크립트의 정적 분석을 수행하는 서버입니다. 이맥스와 같은 텍스트 에디터에서는 턴 서버와 연동 가능한 패키지를 통해 문법 체크와 자동 완성과 같은 자바스크립트 지원 기능을 확장하는 것이 가능합니다. 이 글에서는 턴을 설치하고 사용하는 방법과 이맥스와 연동하는 방법에 대해서 소개합니다.

깃허브 패키지 레지스트리(Github Package Registry) 베타 발표

새소식, 2019-05-13 - 5월 10일 깃허브에서는 깃허브 패키지 레지스트리 베타를 발표했습니다. 패키지 레지스트리는 언어 별로 생성된 패키지를 저장 및 배포할 수 있는 서비스입니다. NPM, 메이븐, 누겟, 루비젬, 도커를 지원할 예정입니다. 현재 베타 버전으로 사용하려면 별도의 신청이 필요합니다.

설치형 개인 VPN 서버 알고(Algo): 아마존 라이트세일(Amazon Lightsail)에 설치하고 운영하기

기사, 2020-01-07 - Algo는 클라우드에 쉽게 설치해서 사용가능한 VPN 서버입니다. 이 글에서는 설치형 개인 VPN Algo의 설치 원리를 소개하고 아마존 라이트세일(Amazon Lightsail)에 배포하는 방법을 소개합니다. 그리고 iOS와 맥OS에서 와이어가드(WireGuard) 클라이언트로 VPN 서버를 사용하는 방법을 알려드립니다.