brunch

You can make anything
by writing

C.S.Lewis

by 플로은 Jun 07. 2019

AWS와 Outline으로 나만의 VPN 서버 만들기

내 프라이버시는 존중되어야 할 권리 중 하나니까

 오늘은 VPN 시리즈를 기획해보려고 한다. 몇 달 전 SNI(Server Name Indication) 차단이 시작되었다. 이제는 조금 지나고 묻힌 것 같기는 하다. 사실 이러한 기술적인 부분에 대해서는 나도 자세히 알고 있지 않기에 자세한 설명에는 어려움이 있다.


 여하튼 누군가가 내가 접속하는 사이트의 주소를 볼 수 있는 것이라 이해하면 될 것이다. 브런치에 접속하는 경우, 우리는 웹 브라우저의 주소 표시 줄에 "brunch.co.kr"를 입력하고 엔터를 누름으로써 브런치 서버에 "나 브런치에서 글 좀 보게 페이지 좀 표시해줘!"라는 요청을 전송한다. 그리고 나면, 브런치 서버에 사용자의 요청이 접수되고, 브런치 서버는 사용자의 웹 브라우저에 사용자가 요청한 것에 관한 결과를 웹 브라우저에 표시할 것이다. 이 과정에서 우리는 브런치 서버에 패킷(Packet)이라는 것을 전송하게 되는데, 그 패킷에 우리가 접속하고 싶어 했던 브런치 주소가 들어있다. 그리고 SKB, KT, LG U+ 와 같은 ISP(Internet Service Provider)들은 미리 망 내에 설치해 둔 장비로 사용자가 서버에 요청한 이 주소가 차단 대상인 주소인지를 확인하게 되고, 일치하는 경우에는 차단되어 관련된 페이지를 볼 수 없게 되고, 차단 목록에 없는 경우에는 요청한 웹페이지를 보게 되는 것이다.


 물론 ISP들은 내가 서버에서 뭘 하는지는 알 수 없지만, 접속하고자 한 페이지가 무엇인지는 알 수 있다. 그것이 검열의 원리이자 여기서 문제가 되는 점이다. SNI 차단을 비롯한 DNS 차단, HTTPS 차단 등과 같은 검열은 이미 시행됐다. 차단을 피하기 위해서 주로 VPN이라는 방법을 많이 사용한다. 무료 VPN 서비스로 Hotspot Shield, TunnelBear 등을 많이 들어보았을 것이다. 하지만 이런 VPN도 서버가 필요하다. 매일매일 엄청난 비용이 들 텐데 왜 이것을 우리에게 무료로 제공해 줄 수 있는지는 다 이유가 있다. 이와 관련해서는 나중에 따로 글을 발행할 예정이다. 유료 VPN 서비스에는 ExpressVPN, NordVPN 등이 있다. 물론 다양한 서버를 원한다면 유료 VPN을 사용하는 것이 비용이 덜 들겠지만, 프라이버시 보호 등의 목적으로 하나의 서버로도 충분하다면 차라리 내가 직접 만드는 것이 비용도 덜 들고 편리할 수도 있다.




Lightsail 메인 화면


 서론이 길었다. 그래서 오늘은 나만의 VPN 서버 구축 방법을 서술하려고 한다. 이유는 내가 나중에 제작하는 방법을 빠르게 찾기 위함도 있고, 자신만의 VPN 서버를 구축하려는 사람들에게 도움을 주고자 하는 이유도 있다. 이 글에서는 AWS(Amazon Web Services) 중에서도 사용이 간편한 Lightsail과 Outline이라는 Alphabet(구글의 모회사)의 자회사인 Jigsaw에서 개발한 오픈 소스 소프트웨어를 활용할 것이다. Shadowsocks을 기반으로 작성된 프로젝트이며 아직 초기 단계에 있는 프로젝트이기 때문에 원한다면 GitHub에서 기여를 할 수도 있다. 그럼, 이제 본격적으로 시작해보자.





0. AWS 계정 생성하기


 이 부분은 자세히 설명할 것이 없다. VPN 서버를 만들기 위해서 반드시 있어야 하며 없다면 AWS에서 계정을 만들어야 한다.




1. Lightsail에서 Instance 만들기


 AWS 계정을 성공적으로 만들었다면, Lightsail Console에 들어간다. 한국어 메뉴가 있으나 여기서는 영어로 설명한다. 한국어로 해도 크게 상관은 없다. 콘솔에 접속되었다면 Instances 탭을 클릭해서 인스턴스를 만들 준비를 한다. 그리고 Instances 탭 안에 있는 "Create Instances" 버튼을 클릭한다.


Instance 생성


 OS는 Ubuntu 18.04 LTS로 선택하고 지역, 요금, 이름은 본인 상황에 맞게 설명한다. 지역은 사용할 서버의 위치를 지정하는 것이다. 당연하지만 서버를 사용하려는 지역으로부터 지리적으로 제일 가까운 곳이 빠를 것이다. 이 글을 읽는 대부분은 한국에 거주 중일 가능성이 크므로 서울로 설정했다. 물론 도쿄 등 다른 지역으로 설정해도 상관은 없지만 상대적으로 서울보다 속도가 안 나올 수 있는 점은 감수해야 한다. AWS는 트래픽을 인바운드와 아웃바운드를 합쳐서 계산하는데, 쉽게 말하면 Transfer에 적혀있는 용량의 반이 실제 VPN으로 사용할 수 있는 용량이다. 그러니 1TB 요금제는 500GB, 2TB 요금제는 1TB와 같이 계산해 볼 수 있다. 사용할 때는 모바일 데이터를 사용하듯 트래픽에서 그만큼의 용량을 차감시킨다고 생각하고 사용하면 된다. 요금제에서 제공하는 트래픽을 초과할 시 어마어마한 추가 요금이 발생하므로 부족할 듯싶으면 미리 큰 용량으로 선택하자. 여기서 필자는 5달러 요금을 선택했다. 그런데 솔직히 말해서 한 달에 1TB를 쓰기는 정말 어렵다. 필자의 경우에도 5달러 요금이 제공하는 1TB의 트래픽도 남아돈다.




2. 고정 IP 생성하고 인스턴스에 연동하기


 인스턴스를 만들고 나면, 상대가 Pending에서 Running으로 바뀔 것이다. 그리고 이제 고정 IP를 만들어서 방금 만든 인스턴스에 붙여줘야 한다.


Pending에서 Running으로



 여기서 굳이 고정 IP를 만들어 줘야 하는 이유가 있다. 기본적으로 제공하는 유동 IP의 경우 서버가 재부팅되면 IP가 바뀐다. 바뀌고 나면 기존에 Outline Manager, Outline Client에서 바뀐 IP를 매번 입력해 주어야 하므로 매우 불편할 것이다. 마침 Lightsail에서는 고정 IP를 인스턴스 당 하나를 무료로 제공해준다. 단, 무료로 제공해주는 고정 IP는 항상 인스턴스에 연결되어 있어야 무료이고 인스턴스에서 연결 해제하면 요금이 청구된다. 상태가 Running으로 바뀌고 나면, Networking 탭에서 "Create static IP"를 클릭한다.


Lightsail Networking 탭



 고정 IP의 위치는 앞에서 설정한 서버 위치와 같게 설정하고, 연결할 인스턴스 역시 방금 만든 인스턴스를 선택한다. 고정 IP의 이름은 마음대로 하면 된다. 완료되었다면 "Create" 버튼을 클릭하자.


고정 IP 만들기



 성공적으로 생성되면 고정 IP 주소 정보가 표시되며 고정 IP가 연결된 인스턴스도 표시될 것이다.


만들어진 고정 IP




3. 터미널로 서버에 접속해 모든 패키지 업데이트하기


 고정 IP까지 연결하고 나면, 서버 보안을 위해 모든 패키지를 최신 버전으로 업데이트해 줘야 한다. 터미널로 들어가려면 Instances 탭에서 만들었던 인스턴스를 클릭한 후, Connect 탭에서 "Connect using SSH"를 클릭하면 사용 중인 브라우저에서 터미널이 열릴 것이다.


Instance 안의 Connect 탭



 열리고 나서 다음 명령어를 실행하면, 루트 사용자로 전환될 것이고 패키지를 업데이트하고 업그레이드할 것이다. 참고로 "$"는 입력할 필요 없고, "$" 바로 옆에 있는 명령어를 입력하면 된다. 그리고 업데이트와 업그레이드 도중에 무언가를 물어보면 그냥 "Y"를 입력해주면 된다.


$ sudo su
$ apt update
$ apt upgrade




4. Outline Manager와 터미널로 VPN 서버 설정하기


 업데이트와 업그레이드가 마무리되었다면, 잠깐 터미널 창은 그대로 둔 채 Outline 홈페이지에 접속해 Outline Manager을 다운로드하고 설치한다.


Outline Manager



 설치된 Outline Manager를 실행한다. 그리고 Amazon Web Services를 선택한다.


AWS 선택



 여기서 제공하는 정보 중에 2번 칸의 텍스트를 전부 복사하고 열려있는 터미널에 붙여 넣어 실행한다. 팁이 있다면 터미널에서는 복사 붙여 넣기가 작동하지 않는다. 대신 오른쪽 아래에 있는 클립보드 아이콘을 클릭하고 붙여 넣은 후 터미널의 까만 부분을 우클릭하면 붙여 넣을 수 있다.


이 화면에서 2번의 텍스트 선택 후 복사


클립보드 아이콘 클릭 후 텍스트 붙여 넣기, 이후 터미널의 까만 부분 우클릭



 그렇게 붙여 넣은 명령어를 실행하면 Docker가 설치되어 있지 않다고 하고 설치할 것이냐를 물어보는데, "Y"를 입력하고 Docker를 설치한다. 설치가 완료되면 apiUrl과 방화벽에서 열어주어야 할 Management port와 Access key port를 알려줄 것이다. 여기서 apiUrl은 초록색 글씨, Management port와 Access key port는 "Make sure to open the following ports on your firewall, router, or cloud provider:" 밑에 나오는 2줄에서 확인할 수 있다.


도커 설치 물음에 예를 입력한 후 나오는 초록 글씨와 밑에 나오는 포트 번호



 apiUrl은 장문인 데다 나중에 Outline Manager에 붙여 넣어야 하므로 미리 복사해두는 것이 편할 것이다. 복사한 텍스트를 붙여 넣는 방법은 클립보드 아이콘을 클릭 후 붙여 넣을 내용을 입력 후 터미널의 까만 부분을 우클릭하는 것이었다. 그렇다면 내용을 빼오려면 어떻게 해야 할까? 그렇다. 초록 글씨를 드래그해서 복사를 한 다음, 클립보드 아이콘을 눌러 그것을 다시 복사하면 된다.


apiUrl인 초록 글씨를 드래그해서 복사한 후 클립보드 아이콘에서 다시 복사



 포트 번호도 메모했다고 생각하고 다음 단계로 넘어가겠다. 이제 터미널은 잠깐 두고, 인스턴스의 Networking 탭에 들어가 보면 Firewall 설정이 있을 것이다. "Edit rules"를 클릭하고 "Add another"를 클릭한다.


"Edit rules" 클릭 후 "Add another" 클릭



 여기서부터는 본인의 포트에 맞게 열어주어야 한다. Outline은 열어줘야 할 포트 번호를 무작위로 생성하기 때문이다. 필자의 경우, Management port는 Protocol이 TCP, Port range가 60542가 되도록 설정해야 한다. 또한 Access key port는 Protocol이 TCP and UDP, Port range가 7996이 되도록 설정해야 한다. 알맞게 입력하고 "Save"를 클릭해준다.


터미널에서 알려준 포트에 알맞게 설정



 아까 복사한 초록 글씨, apiUrl을 이제 쓸 때가 왔다. 이제 터미널은 닫아도 되고, 아까 복사했던 내용을 Outline Manager의 3번 칸에 붙여 넣고 "Done"을 클릭한다.


apiUrl을 3번에 붙여 넣고 "DONE" 클릭



(추가 정보) 나중에 포트 번호를 알고 싶은데 기억이 나지 않고 메모한 것을 잃어버렸다면, Outline Manager에서 만든 서버를 클릭하고 Settings 탭에 들어가면 서버 정보가 나온다. Management API URL 속에 있는 숫자는 Management port, Port for new access keys는 Access key port임을 확인할 수 있다.


바로 저것이다




5. Access key 발급받고 VPN 사용하기


 VPN을 사용하기 위해 Outline Client를 Outline 홈페이지에서 다운로드 해 미리 설치해둔다. 이제 Outline Manager에서 기기 아이콘을 클릭한다. 그러면 창이 하나 뜰 것이다.


(추가 정보) 원한다면 언제든지 "Add new key"를 클릭하여 액세스 코드를 생성할 수 있다. 생성하고 VPN 설정 방법은 같으니, 기기나 사용자에 따라서 액세스 코드를 따로 주는 것도 괜찮을 것 같다.


오른쪽에 있는 저 기기 아이콘이다



 창이 뜨고 나면 "이 기기 연결하기"를 클릭한다. 액세스 코드 복사하기 창이 나오고, "복사" 버튼을 클릭하면 액세스 코드가 복사된다.


이제 즐길 준비(?)만 하면 되는 것이다



 미리 설치한 Outline Client를 열고 아까 키를 복사해둔 상태를 유지했다면, 키를 감지했다고 나오고 서버 추가 창이 나올 것이다. 그러면 서버를 추가하고 연결 버튼을 눌러 서버에 연결하면 된다.


이제, 안 끝났다, 딱 한 가지가 남아있다




6. 내 IP가 VPN 서버의 IP로 잘 변경되었는지 확인하기


 혹시라도 내 IP가 안 바뀌어 있었다면? 그럴 일은 없겠지만 혹시 모른다. 그러니 확인 절차로 네이버나 다음에 "IP주소 조회/확인"이라고 검색하거나 ipleak.net 같은 사이트 등에서 IP가 성공적으로 바뀌었는지 확인한다. IP가 바뀌어 있다면 이제 나만의 안전하고 평화로운 그리고 아늑하고(?) VPN 서버가 생긴 것이다.




 정말 수고하셨습니다. 이제 나만의 VPN 서버가 생겼습니다. 앞으로는 VPN을 사용하여 안전하게 웹서핑을 할 수 있습니다.





 마지막으로 한 가지 말할 것이 있다. 필자는 분명히 개인의 프라이버시를 존중하는 목적의 VPN 서버 구축 방법을 안내했다. 이렇게 만든 VPN을 악의적으로 사용해서 나쁜 짓을 할 생각은 절대 하지 않기를 바란다. 어디까지나 찾을 수 없는 것이 아니라 찾기 힘든 것이다. 그래서 나쁜 짓을 한 범인을 찾는데 안 썼을 때보다 시간이 조금 더 걸릴 뿐이지 마음만 먹으면 금방 충분히 다 찾을 수 있다. 그러니 용도를 악용하지 않았으면 한다.

 아무리 찾아도 Outline을 활용하여 VPN 서버를 구축하는 방법이 깔끔하게 정리되어 있지 않거나 설명이 다소 어렵거나 미흡한 글이 많았고, 이런 내용의 글이 브런치에는 그냥 없었다. 그래서 이 글을 작성하기로 결심했고, 앞으로 이 글이 개인의 인터넷 환경을 더욱 안전하고 자유롭게 만들 수 있도록 보탬이 되었으면 한다.








Copyright ⓒ 2019 by 플로은

All rights reserved. 모든 권리 보유.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari