Algo로 개인 VPN 서버 구축하기(요약판)
들어가며: Algo 셋업 요약판
이 글은 클라우드에 설치하는 개인용 VPN 서버 알고(Algo)에서 VPN 서버 배포 명령어를 요약한 버전입니다. Algo VPN 셋업에 대한 보다 자세한 정보와 와이어가드Wireguard 클라이언트 설정에 관해서는 원글을 참고해주세요.
Algo VPN 서버 셋업에 필요한 준비물
Algo VPN 서버 셋업을 하려면 다음과 같은 준비물들이 필요합니다.
- 아마존 웹 서비스Amazon Web Services 계정
- 아마존 라이트세일Amazon Lightsail 셋업을 위한 AWS 액세스키
- 도커Docker(로컬)
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