W tym wpisie pokaże Tobie jak prosto założyć własny serwer VPN (w oparciu o OpenVPN Access Server) na chmurze Amazona Web Services (AWS). Jeżeli jeszcze nie korzystasz z AWS takie rozwiązanie będzie dla Ciebie darmowe przez rok, dzięki AWS Free Tier. Po roku koszty i tak będą niższe od komercyjnych VPNów! Zapraszam do lektury.
Virtual Private Network (w skrócie VPN) to, w dużym uproszczeniu, zaszyfrowany tunel za pośrednictwem którego łączysz się z siecią. Najpopularniejsze zastosowanie to dostęp do zasobów wewnętrznych, takich jak sieć firmowa, ale w kontekście tego artykułu chodzi nam o tunelu pomiędzy Tobą i Internetem. Dla Ciebie korzystanie z takiego tunelu nie wpływa w istotny sposób na funkcjonalność połączenia, chociaż może oczywiście obniżać przepustowość połączenia. Natomiast wszystkie urządzenia i osoby znajdujące się pomiędzy Tobą i serwerem VPN (tzw. endpoint’em) widzą tylko jeden strumień zaszyfrowanych danych. Wszystkie strony i usługi z których będziesz korzystał zidentyfikują Twoją lokalizację nie na podstawie Twojego IP, ale IP serwera VPN. Przydaje się to chociażby jeśli chcemy uzyskać dostęp do treści blokowanych w miejscu w którym się znajdujemy.
Tak jak wspomniałem, spróbujemy uruchomić własny serwer VPN w oparciu o open-sourcowe rozwiązanie OpenVPN (w trochę komercyjnej wersji jaką jest OpenVPN Access Server) i chmurę AWS (Amazon Web Services). A więc nawet jeżeli nie potrzebujesz pilnie własnego VPNa może to być ciekawy projekt na rozpoczęcie pracy z chmurą. Oto lista tematów które omówimy:
- Założenie konta na Amazon Web Services
- Postawienie maszyny wirtualnej EC2
- Łączenie się z maszyną za pomocą SSH
- Instalacja oprogramowania OpenVPN Access Server
- Nawiązywanie połączenia z serwerem z różnych urządzeń
Krok 1: Konto na AWS
Pierwsza rzecz której będziesz potrzebował to konto na Amazon Web Services. Możesz je założyć tutaj – będziesz potrzebował karty kredytowej którą Amazon sprawdzi blokując $1, a sam proces aktywacji może potrwać kilka godzin. Czekając na aktywację możesz poczytać o AWS Free Tier, gdzie znajdziesz wszystkie usługi do których będziesz miał bezpłatny dostęp jako nowy użytkownik. Jeżeli wszystko przebiegnie zgodnie z planem uzyskasz dostęp do konsoli AWS która wygląda mniej więcej tak:
Pro tip – zanim przejdziesz dalej sprawdź w prawym górnym rogu konsoli swój region. Domyślnie u mnie było to US East (Ohio). Polecam przełączyć się na centrum obliczeniowe w Unii Europejskiej ze względu na jakość połączenia. Ja wybrałem Irlandię ☘️.
Krok 2: Konfiguracja i uruchomienie EC2
Elastic Compute Cloud, w skrócie EC2, to w nomenklaturze AWS po prostu maszyna wirtualna – skalowalny zasób obliczeniowy na którym możesz zainstalować jeden z przygotowanych obrazów. W chwili pisania tego artykułu darmowy tier pozwala na instalację obrazów z m.in. SUSE Enterprise Server 12, Ubuntu Server 16.04 oraz Microsoft Windows Server 2016. Możesz także sam przygotować swój obraz do instalacji na maszynie – temat rzeka. Jeśli chcesz spróbować zacznij od dokumentacji opisującej zagadnienie obrazów znanych lepiej pod skrótem AMI – Amazon Machine Images.
Wejdz w panel instancji EC2 (Services -> EC2
) i kliknij przycisk Launch Instance
. Zostaniesz przekierowany do kreatora instancji, który przeprowadzi Cię przez 6 kolejnych kroków. Nas interesują tylko trzy z nich:
Krok 1 w którym należy wybrać wspomniany obraz maszyny. Wybierzmy Ubuntu Server 16.04 LTS (HVM), SSD Volume Type oznaczony jako ami-5e8bb23b. Możliwe że od czasu publikacji tego artykułu wersja obrazu została zmieniona – jeśli tak wybierz dowolny obraz oparty na Ubuntu Server.
Krok 2 w którym należy wybrać typ instancji. Typ instancji określa ilość przypisanych do niej zasobów a więc również jej cenę. Ja wybieram t2.micro ponieważ tylko ta opcja jest dostępna za darmo w trakcie okresu próbnego. Z doświadczenia powiem tylko że jest to instancja która spokojnie obsłuży kilka jednoczesnych tuneli VPN.
Przeklikaj się przez krok 3, 4 oraz 5. Zatrzymajmy się chwilę na kroku 6. Tutaj skonfigurujemy grupę bezpieczeństwa, czyli zestaw reguł określających jakie protokoły i na jakich portach będą odblokowane. Domyślnie Amazon nie ogranicza reguł outbound (maszyna może wykonywać połączenia wychodzące przy użyciu każdego portu i protokołu). Natomiast inbound (a więc połączenia do maszyny) zawiera tylko jedno dopuszczenie – protokół TCP na porcie 22. Źródło w tej regule to 0.0.0.0/0 a więc „otwarte na świat” – każdy w Internecie będzie mógł połączyć się z usługą SSH działającym właśnie na tym porcie. Dodajmy jeszcze 2 reguły inbound:
- Typ Custom TCP, port 943, źródło 0.0.0.0/0
- Typ Custom UDP, port 1194, źródło 0.0.0.0/0
Po dodaniu tych reguł kliknij Review and Launch
. W podsumowaniu procesu powinieneś zobaczyć mniej więcej coś takiego:
Zwróć uwagę czy reguły bezpieczeństwa się zgadzają. Jeśli wszystko jest OK można startować – kliknij Launch
🚀. Amazon poprosi Cię jeszcze o wskazanie pary kluczy (prywatnego i publicznego) które pozwolą nam nawiązać bezpieczne połączenie z maszyną. Wybierz opcję stworzenia nowej pary kluczy, przypisz im nazwę i kliknij Download Key Pair
. W ten sposób ściągniesz plik .pem zawierający klucz prywatny – warto pamiętać że nie będziesz miał więcej tej możliwości. Dlatego ważne jest aby po ściągnięciu klucza zapisać go w bezpiecznym miejscu.
Po zakończeniu zobaczysz panel EC2 z tabelą instancji. Znajdziesz tam swoją nową maszynę która powinna od razu się uruchomić.
Pamiętaj że od tego momentu naliczane są także jej koszty. Jeżeli założyłeś nowe konto i został Tobie przydzielony dostęp do AWS Free Tier a maszyna którą właśnie stworzyłeś jest typu t2.micro to co miesiąc przysługuje Tobie 750 darmowych godzin. Jak łatwo policzyć jest to 31,5 dni a więc teoretycznie starczy na cały miesiąc. Jeżeli jednak
- uruchomisz więcej niż jedną instancję,
- wybierzesz inny typ instancji lub
- nie jesteś nowym użytkownikiem
…to możesz sobie nabić spory rachunek 💰. Zalecam ostrożność i częste odwiedzanie centrum billingu (kliknij w <Twoja nazwa użytkownika> -> My Billing Dashboard
w prawym górnym rogu konsoli.
Krok 3: Połączenie z maszyną wirtualną
Stworzyliśmy naszą maszynę wirtualną. Upewnij się że maszyna działa – wartość którą chcemy zobaczyć w kolumnie Instance State to running, natomiast w Status Checks – 2/2 checks passed.
Aby zobaczyć dokładne instrukcje połączenia z maszyną kliknij przycisk Connect
znajdujący się nad tabelą. Dla użytkowników Linuxa/Unixa mam dobrą wiadomość, wszystko co musisz zrobić żeby połączyć się z maszyną to wpisanie następującej komendy w terminalu:
# chmod 400 klucz.pem
# ssh -i "klucz.pem" ubuntu@host.compute.amazonaws.com
gdzie klucz.pem to dokładna nazwa pliku z kluczem który wcześniej pobrałeś a host to publiczny adres DNS Twojej maszyny.
Użytkownicy Windows mają trochę pod górę, ale Amazon wyciąga do Was rękę dostarczając bardzo wygodną dokumentację 👉🏼 Connection Documentation. W dużym skrócie będziesz potrzebował:
- Klienta PuTTY aby połączyć się z usługą SSH
- Aplikacji PuTTYgen aby skonwertować swój klucz prywatny (.pem) na format PuTTY (.ppk)
Szczegółowy opis obu punktów znajduje się w dokumentacji. Jeżeli uda Ci się połączyć z maszyną powinieneś zobaczyć prompt serwera Ubuntu podobny do tego:
Na koniec należy zadbać o aktualność naszego systemu. Jak nakazuje tradycja, bezpieczeństwo i higiena pracy, zaktualizujmy dane z repozytoriów oraz zainstalujmy najnowsze wersje pakietów:
# sudo apt-get update
# sudo apt-get upgrade
Krok 4: Instalacja serwera VPN – OpenVPN Access Server
Ważny disclaimer – w tym artykule pokazuję jak zainstalować OpenVPN Access Server. Jest to nieco prostsza droga w porównaniu do ręcznej konfiguracji – usługą można zarządzać przez przeglądarkę web, a chcąc połączyć się z VPNem serwer przygotuje dla nas skonfigurowaną aplikację kliencką. Jeżeli chcesz mieć absolutną kontrolę nad swoim serwerem i nie lubisz zabawy w konfigurację przez przeglądarkę to bardzo polecam ten artykuł na medium.com który opisuje instalację OpenVPN bez Access Server.
OpenVPN Access Server ma też swoje ograniczenia – jest oparty na open-sourcowym OpenVPN ale zestaw narędzi ułatwiających konfigurację jest produktem komercyjnym. Bez wgrania dodatkowych, płatnych, licencji serwer pracuje w trybie demonstracyjnym. Jedynym ograniczeniem tego trybu jest możliwość jednoczesnej pracy 2 urządzeń, dlatego do domowych zastosowań powinien spokojnie wystarczyć.
Od strony technicznej – OpenVPN korzysta z własnego protokołu bezpieczeństwa który wykorzystuje TSL/SSL do wymiany kluczy. Oznacza to że nie korzysta z popularnego wśród komercyjnych rozwiązań VPN protokołu IPSec. W związku z tym ma również przewagę funkcjonalną – operatorzy Internetu którzy z jakichś przyczyn chcą ograniczyć użycie VPN będą raczej celowali w wyeliminowanie użytkowników IPSec, i być może pozostawią Twojego OpenVPN’a w spokoju 🕵️♂️.
Warto tu jeszcze wspomnieć o istnieniu AWS Marketplace, czyli internetowego sklepu w którym można kupić oprogramowanie gotowe do wdrożenia w chmurze i usługi z nim powiązane. OpenVPN Access Server jest tam również obecny – można zainstalować gotowy obraz AMI (patrz wyżej) z tym systemem. Skorzystanie z tej opcji nie byłoby jednak znacznie szybsze ani bardziej przejrzyste niż ręczna instalacja usługi.
OK, dosyć teorii. Zacznijmy od pobrania na nasz serwer właściwej paczki. Wejdź na stronę OpenVPN -> VPN Solution -> Software Packages (ta ścieżka mogła się zmienić odkąd powstał ten artykuł, jeśli nie widzisz tych odnośników w menu daj znać w komentarzach poniżej).
Wybierz Ubuntu i skopiuj adres paczki odpowiedniej dla naszej maszyny. Dla mnie będzie to Ubuntu 16 amd/x86 64-bit (AWS nie wspiera systemów 32-bitowych). Stwórz na maszynie nowy folder, ściągnij tam paczkę używając wget
, po czym zainstaluj ją używając dpkg
:
# mkdir openvpn
# cd openvpn
# wget http://swupdate.openvpn.org/as/openvpn-as-2.5.2-Ubuntu16.amd_64.deb
# sudo dpkg -i openvpn-as-2.5.2-Ubuntu16.amd_64.deb
W rezultacie powinieneś otrzymać informację z adresami pod którymi dostępny będzie interfejs użytkownika, u mnie wygląda to tak:
+++++++++++++++++++++++++++++++++++++++++++++++
Access Server Web UIs are available here:
Admin UI: https://172.31.9.133:943/admin
Client UI: https://172.31.9.133:943/
+++++++++++++++++++++++++++++++++++++++++++++++
Myślisz sobie pewnie: gra gitara, wystarczy kopiuj-wklej do przeglądarki. Nie do końca – adresy IP które zwrócił instalator są w wewnętrznej podsieci AWS. To znaczy że mógłbyś się z nimi połączyć z innej instancji EC2, ale nie z Internetu. Ponieważ my będziemy łączyli się z zewnątrz musimy wrócić do konsoli AWS i sprawdzić zewnętrzny adres IP naszej maszyny wirtualnej opisany jako IPv4 Public IP . Alternatywnie możesz użyć adresu DNS – Public DNS (IPv4). Na szczęście port i ścieżka (:943/admin
) już się zgadzają. Zanim przejdziemy dalej ustaw jeszcze hasło dla użytkownika openvpn
:
# sudo passwd openvpn
Krok 5: Konfiguracja OpenVPN Access Server
Kiedy podmienimy IP na publiczny adres maszyny i wejdziemy na wskazany Admin UI prawdopodobnie będziesz musiał/a przeklikać się przez groźnie wyglądające ostrzeżenie dotyczącym brakującego certyfikatu. W zależności od przeglądarki jakiej używasz będziesz musiał/a kliknąć „zaawansowane” i dodać wyjątek do reguł bezpieczeństwa dla tego adresu IP lub kliknąć Otwórz stronę xx.xx.xx.xx (niebezpieczną)
. Po zalogowaniu (pamiętaj – użytkownik to openvpn
) powinieneś zobaczyć panel administratora podobny do tego:
Jesteśmy w domu. Polecam Tobie odwiedzić wszystkie podstrony panelu, większość parametrów jest przystępnie opisana, chociaż oczywiście jak zawsze przy pracy z oprogramowaniem sieciowym wymagane będzie mocne google-fu aby zrozumieć niektóre z nich. Rzeczy które trzeba lub warto zrobić to:
Zmiana adresu IP
OpenVPN wciąż myśli że jest dostepny dla użytkowników pod wewnętrznym adresem IP Amazona. Trzeba go wyprowadzić z błędu. Wejdź w Configuration -> Network Settings
i zmień wartość pierwszego pola (Hostname or IP Adress) na zewnętrzny adres IP Twojej maszyny.
Stworzenie użytkowników
Wejdź w User Management -> User Permission
. Dodaj nowego użytkownika z którego będziesz korzystał łącząc się z VPNem i przypisz mu hasło. Teoretycznie możesz korzystać z VPNa używając konta openvpn
ale to bardzo niehigieniczne używać na co dzień konta z uprawnieniami administratora.
Ustawienia VPN’a
Wejdź w Configuration -> VPN Settings
. W obszarze Routing – dla pierwszej opcji – „Should VPN clients have access to private subnets (non-public networks on the server side)?” wybierz No. Jeżeli kiedyś dodasz nowe instancje i będziesz chciał aby dostęp do nich był tylko poprzez tunel VPN – powróć do tej opcji i zmień ją na Yes.
W obszarze DNS Settings warto zaznaczyć opcję „Have clients use specific DNS servers” aby zapobiec wyciekom DNS. W dużym skrócie – pomimo tego że cały Twój ruch będzie transmitowany szyfrowanym tunelem Twój komputer wciąż może odpytywać (jawnie) serwer DNS dostawcy internetu o adresy hostów z którymi łączy się przez tunel. O ile sama komunikacja pozostanie bezpieczna to już adresy serwerów z którymi się łączysz mogą zostać przechwycone. Inaczej mówiąc, nie będzie wiadomo o czym rozmawiasz ale będzie wiadomo z kim. Zaznaczenie tej opcji spowoduje pokazanie się dwóch kolejnych parametrów – Primary DNS Server i Secondary DNS Server. Możesz wybrać serwery DNS Google (8.8.8.8
, 4.4.4.4
) ja wybrałem Open DNS (208.67.222.222
, 208.67.222.220
).
Wybór dostępnych aplikacji klienckich
Wejdź w Configuration -> Client Settings
. W obszarze Customize Client Web Server UI będziesz mógł wybrać jakie typy klientów będą dostępne dla użytkowników VPNa.
Krok 6: Konfiguracja Klienta
Czas na ukoronowanie naszych wysiłków. W tym kroku pobierzemy oprogramowanie klienckie i zaczniemy korzystać z naszego nowego VPN’a. W przeglądarce wejdź na adres interfejsu klienta, który od panelu admina różni się zwyczajnie brakiem ścieżki /admin
na końcu. Zaloguj się używając stworzonego konta (nie openvpn
). Zostaniemy przywitani bardzo prostym zestawem opcji odpowiadających typom aplikacji klienckich które wybraliśmy w poprzednim punkcie. U mnie wygląda to tak:
Pobierz właściwego swojej obecnej platformie klienta. Na niektórych platformach konieczne będzie także pobranie profilu połączenia ale aplikacja przeprowadzi Cię przez ten proces. Tak przynajmniej było u mnie na telefonie z systemem iOS.
Podsumowanie
Jeżeli udało Ci się przebrnąć przez cały poradnik i połączyć ze swoim nowym, błyszczącym serwerem VPN – gratuluję! Jak chcesz to potrafisz ?. Jako ciekawostkę polecam wyszukać w Google frazę „what is my location” lub zbliżoną. Ja swoją maszynę postawiłem w regionie Irlandia, więc nie zdziwiłem się bardzo, gdy na swoje pytanie dostałem taką odpowiedź:
Odpowiedzmy sobie na koniec na kilka istotnych pytań.
Ile kosztuje taki VPN?
Otóż jak już wcześniej wspomniałem – niewiele lub zero. Jeżeli nie przekroczysz dostępnego deputatu darmowych godzin, nie uruchomisz 2 lub więcej maszyn, nie potrzebujesz licencji na więcej niż 2 jednoczesne połączenia to ta zabawa pozostanie dla Ciebie darmowa przez rok. A jak to wygląda po pierwszym roku? Dokładny cennik godzinowy poszczególnych instancji znajdziesz tutaj. Koszt maszyny t2.micro to $0.0126 w regionie Irlandia (np. Frankfurt jest nieco droższy). Oznacza to koszt miesięczny na poziomie ~$10 – czyli według dzisiejszego kursu dolara ok. 39 zł.
Po pierwszym roku możesz przełączyć się na instancję EC2 typu t2.nano dla której koszt godzinowy to $0.0067 (a więc $5 na miesiąc). W jednym z kolejnych artykułów pokażę także jak można uruchamiać taką usługę (lub dowolną inną usługę zlokalizowaną na EC2) w trybie „na żądanie”. Posłuży nam do tego AWS Lambda, czyli serverless computing, jeden z bardziej hypowanych tematów IT w ostatnich latach. Czy warto cokolwiek optymalizować kiedy mówimy o tak niskich kwotach? Raczej nie, ale będzie to fajny, praktyczny przykład zastosowania Lambdy a propozycje które na rynku pracy otrzymują specjaliści od serverless computing są absolutnie warte zapoznania się z tą technologią.
Komu nie przyda się VPN na AWS?
Jeżeli robisz rzeczy nielegalne (jak np. ściąganie i dzielenie się komercyjnymi mediami czy programami) to oczywiście lepiej skorzystać z komercyjnych VPN’ów które otwarcie deklarują że np. nie gromadzą logów a więc nie mogą przekazać ich na niczyje żądanie. Amazon nie zapewnia ochrony przed policją czy innymi instytucjami, z którymi współpracują w wymaganym przepisami zakresie.
Nie wiem jak wygląda status wykorzystania w ten sposób AWS do np. obejścia cenzury w niektórych państwach, dla bezpieczeństwa również skorzystałbym z komercyjnych rozwiązań.
Natomiast jeżeli chcesz się ochronić przed przestępstwami, utratą prywatności, wyciekiem danych czy ukryć swój prawdziwy adres IP – możesz śmiało korzystać z chmury Amazona.
Mam nadzieję że udało Ci się przejść przez ten poradnik i nawet jeżeli nie potrzebujesz VPNa, wyniosłeś z niego coś cennego. Jeśli tak – daj proszę znać w komentarzach poniżej! Do zobaczenia w następnym wpisie (edit: dwa lata trzeba było czekać 😁👉 Zdalne repozytorium Git na AWS.)
2 Comments
Komentarz testowy
Dzięki za tutorial, przydał się i wyjaśnił kilka kwestii. Oby więcej takich na blogu i czekam na obiecane rozwinięcie kwestii AWS Lambda!
Pozdrawiam