Algo로 개인 VPN 서버 구축하기(요약판)

들어가며: Algo 셋업 요약판

이 글은 클라우드에 설치하는 개인용 VPN 서버 알고(Algo)에서 VPN 서버 배포 명령어를 요약한 버전입니다. Algo VPN 셋업에 대한 보다 자세한 정보와 와이어가드Wireguard 클라이언트 설정에 관해서는 원글을 참고해주세요.

Algo VPN 서버 셋업에 필요한 준비물

Algo VPN 서버 셋업을 하려면 다음과 같은 준비물들이 필요합니다.

Algo는 다양한 배포환경을 지원합니다만, 여기서는 아마존 라이트세일에 배포를 할 예정이므로 아마존 웹 서비스Amazon Web Services 계정과 액세스키가 필요합니다. 아직 AWS 계정이 없다면 아마존 웹 서비스 계정 생성하기를 참고해서 계정을 생성하고, 아마존 웹 서비스 IAM 사용자의 액세스 키 발급 및 관리를 참고해서 액세스키를 발급해주세요.

여기서 소개한 글에서는 편의상 사용자의 권한을 AdministratorAccess으로 부여합니다. 하지만 VPN 서버를 배포하는 데 필요한 권한은 훨씬 더 적습니다. Algo 공식 문서에서는 아마존 라이트세일을 사용해 VPN 서버를 생성하기 위해 필요한 최소한의 IAM 권한을 다음과 같이 정의하고 있습니다. 관리자 권한을 사용해도 무방하지만 가능하다면 필요한 최소한의 권한을 부여하는 것이 좋습니다.

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

마지막으로 로컬 컴퓨터에 도커Docker가 설치되어있어야합니다. 윈도우Windows나 맥OSmacOS를 사용한다면 도커 데스크탑Docker Desktorp을 추천합니다. 리눅스에서는 다음 명령어로 도커를 설치할 수 있습니다.

$ curl -s https://get.docker.com | sudo sh

아마존 라이트세일에 Algo VPN 서버 셋업하기

trailofbits/algo:latest 이미지로 bash 셸을 실행합니다. 여기서 <AWS_ACCESS_KEY_ID><AWS_SECRET_ACCESS_KEY>는 미리 준비한 값으로 치환해줍니다.

$ 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

다음으로 (파이썬) 가상환경을 활성화하고 VPN 서버 설정파일을 다운로드 받습니다.

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

config.cfg 파일에는 배포 타깃 별 설정, 클라이언트 계정 설정 등이 저장되어있습니다. 예를 들어 라이트세일의 인스턴스 타입은 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"

여기서 $AWS_ACCESS_KEY_ID는 환경변수 값을 읽어오므로 치환하지 않아도 도커 실행시 지정한 값이 자동으로 들어갑니다. 명령어를 실행하고, 이제 기다리기만 하면됩니다.

...

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

앤서블을 통한 서버 설정이 끝나면 다음과 같은 결과가 출력됩니다. failed가 없다면 성공했다고 볼 수 있습니다. 설치에 실패했다면 재시도를 해보고 그래도 실패한다면 공식 트러블슈팅 문서를 참고해보세요.

부록: 검증된 배포 방법

trailofbits/algo 이미지와 config.cfg는 정확한 버저닝이 이루어지고 있지 않아, 위에서 소개한대로 최신 버전을 받아올 경우 문제가 생길 수 있습니다. 이 글을 작성한 시점의 이미지와 설정 파일을 사용하면 재현 가능성이 좀 더 높아집니다. 앞서 소개한 도커 실행 명령어와 설정 파일 다운로드 명령어를 다음과 같이 변경해봅니다.

$ 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@sha256:53227c701fd1b91ad5f3b13652deeed1af7441afcc4dc0bc006df95109afa6ca \
  bash
container$ wget https://raw.githubusercontent.com/trailofbits/algo/45aa0065cdf0063edc5ad3d0ded1351050da1c16/config.cfg

VPN 클라이언트 설정 파일

VPN 서버 배포가 끝났으면 로컬의 컨테이너를 종료하고(ctrl + d), 현재 디렉터리 아래의 ./algo 디렉터리 내용을 확인해봅니다.

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

Algo는 IPsec, SSH 터널, 와이어가드 등을 지원하며 각 디렉터리에 해당 클라이언트 접속을 위한 설정 파일이 있습니다. 클라이언트 계정은 config.cfg에 정의되어있으며 기본적으로 phone, laptop, desktop 세 개의 계정이 만들어집니다. 참고로 중간에 IP 주소를 이름으로 가진 디렉터리가 보이는데 이 값이 VPN 서버가 셋업된 서버의 주소입니다. 이 서버는 라이트세일 웹 콘솔에서도 확인할 수 있습니다.

와이어가드 클라이언트를 셋업하는 방법은 클라우드에 설치하는 개인용 VPN 서버 알고(Algo) 원글에서 소개합니다.

Algo VPN 서버 종료

앞에서 이야기한 대로 서버를 실행해두면 사용 시간만큼 요금이 발생합니다. 더 이상 필요하지 않다면 라이트세일 웹 콘솔이나 AWSCLI를 사용해 서버를 종료합니다.

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

허브(Hub)를 사용해 명령행해서 깃허브(GitHub) 풀리퀘스트 보내기

기사, 2013-12-29 - 깃허브(GitHub)는 깃(Git) 저장소를 원격에서 관리할 수 있게 도와줍니다. 깃허브에서는 깃허브의 기능을 커맨드라인에서 구현한 허브(Hub)라는 도구를 제공하고 잇습니다. 이 글에서는 허브를 사용해 깃허브 저장소를 만들고 풀리퀘스트를 보내는 방법을 소개합니다.

구글, 도커(Docker) 컨테이너 기반 서버리스 서비스인 클라우드 런(Cloud Run) 발표

새소식, 2019-05-01 - 구글은 지난 4월 11일, 구글 클라우드 넥스트 2019에서 도커 컨테이너를 서버리스 환경에서 운영할 수 있는 클라우드 런 서비스를 발표했습니다.

아마존 ECR(Amazon ECR), 도커 이미지 취약점 스캔 기능 추가

새소식, 2020-01-09 - 작년 10월 28일에 아마존 웹 서비스(Amazon Web Service)의 매니지드 도커 레지스트리 서비스 아마존 ECR(Amazon ECR)에 이미지 취약점 검사 기능이 추가되었습니다. 이 기능을 사용해 현재 등록된 이미지의 취약점을 스캔하거나, 새로 푸시되는 이미지를 자동적으로 스캔하는 것이 가능합니다.