Cześć, Habrze! Czy kiedykolwiek zdarzyło Wam się pragnąć wirtualnie przenieść się do innego miasta, kraju lub nawet na inny kontynent? Ja mam taką potrzebę dość często, dlatego możliwość posiadania własnego serwera VPN, który można uruchomić wszędzie w kilka sekund, była dla mnie szczególnie ważna. W tym artykule chciałbym podzielić się moim projektem, który zrealizowałem szukając gotowego rozwiązania, w tym przypadku obrazu Dockera, który umożliwia szybkie postawienie serwera OpenVPN, z minimalną konfiguracją i odpowiednim poziomem bezpieczeństwa.
Tło
Możliwość uruchamiania usługi na dowolnej maszynie: czy to fizycznym serwerze, czy wirtualnym serwerze prywatnym, czy również w przestrzeni kontenerowej w innej systemie zarządzania kontenerami — była krytycznie ważna. Od razu zwróciłem uwagę na Dockera. Po pierwsze, ta usługa zyskuje na popularności, a co za tym idzie, coraz więcej dostawców oferuje gotowe rozwiązania z jego preinstalacją; po drugie — istnieje scentralizowane repozytorium obrazów, z którego można pobrać i uruchomić usługę za pomocą jednej komendy w terminalu. Myśl, że podobny projekt już powinien istnieć, nawiedzała mnie i usilnie go szukałem. Jednak większość projektów, które znalazłem, była albo zbyt rozbudowana (należało stworzyć kontener do stałego przechowywania danych i wielokrotnie uruchamiać kontener z aplikacją z różnymi parametrami), albo nie miała sensownej dokumentacji, albo była całkowicie porzucona. Nie znajdując nic odpowiedniego, zacząłem pracę nad własnym projektem. Przede mną były bezsenne noce studiowania dokumentacji, pisania kodu i debugowania, ale ostatecznie mój serwis ujrzał światło dzienne i zabłysnął wszystkimi kolorami monochromatycznej diodowej tablicy routera. Oto, proszę, polubcie i przyjmijcie — . Stworzyłem nawet logo (powyżej, przed katem), ale proszę nie oceniać go surowo, bo nie jestem już projektantem. Kiedy realizowałem ten projekt, priorytetem była dla mnie szybkość wdrożenia, minimalna konfiguracja i akceptowalny poziom bezpieczeństwa. Metodą prób i błędów znalazłem optymalny balans tych kryteriów, niemniej jednak w niektórych miejscach musiałem poświęcić szybkość wdrożenia dla zwiększenia bezpieczeństwa, a minimalna konfiguracja przyczyniła się do braku przenośności: w obecnej konfiguracji kontener utworzony na jednym serwerze nie może zostać przeniesiony i uruchomiony na innym. Np. wszystkie certyfikaty klienckie i serwerowe są generowane przy uruchamianiu usługi i zajmuje to około 2 sekund. Jednak generację pliku Diffiego-Hellmana musiałem przenieść do czasu budowy: jest tworzone podczas tworzenia obrazu Dockera i może trwać do 10 minut. Bardzo chciałbym otrzymać audyt bezpieczeństwa podobnego rozwiązania od szanownej społeczności.
Uruchomienie
Aby uruchomić usługę, potrzebujemy kilku rzeczy:
- Serwera: fizycznego lub wirtualnego. Teoretycznie można uruchamiać w trybie Docker-in-Docker, ale nie przeprowadzałem szerokiego testowania tej opcji;
- Właściwego Dockera. Wiele dostawców hostingu oferuje gotowe rozwiązania z Dockerem „na pokładzie”;
- Publicznego adresu IP.
Jeżeli wszystkie dane są na miejscu, to pozostaje nam uruchomić następującą komendę w konsoli naszego serwera:
docker run --cap-add=NET_ADMIN
-it -p 1194:1194/udp -p 80:8080/tcp
-e HOST_ADDR=$(curl -s https://api.ipify.org)
alekslitvinenk/openvpnUważny czytelnik mógł zauważyć, że adres IP serwera jest automatycznie określany za pomocą ipify.org. Jeśli z jakiegoś powodu to nie działa, można podać adres ręcznie. Jeżeli wszystkie poprzednie kroki zostały wykonane poprawnie, powinniśmy zobaczyć w konsoli coś podobnego do:
Sun Jun 9 08:56:11 2019 Inicjalizacja zakończona
Sun Jun 9 08:56:12 2019 Plik Client.ovpn został wygenerowany
Sun Jun 9 08:56:12 2019 Config serwera uruchomiony, pobierz swoją konfigurację client.ovpn na http://example.com/
Sun Jun 9 08:56:12 2019 UWAGA: Po pobraniu konfiguracji klienta, serwer http zostanie zamknięty!Jesteśmy blisko celu: teraz musimy skopiować (w twoim przypadku będzie to adres twojego serwera) i wkleić go do paska adresu przeglądarki. Po naciśnięciu Enter plik client.ovpn zostanie pobrany, a sam serwer http zniknie. Jeśli to rozwiązanie budzi wątpliwości, można skorzystać z następującego triku: uruchomić poprzednie polecenie i dodać flagi zip i hasło. Teraz, jeśli wkleisz wygenerowany link w oknie przeglądarki — otrzymasz archiwum zip z hasłem. Kiedy masz plik z konfiguracją klienta, możesz użyć dowolnego odpowiedniego klienta. Ja używam Tunnelblick na Maca.
Filmowy samouczek
Ten filmowy samouczek zawiera szczegółową instrukcję dotyczącą uruchamiania usługi na DigitalOcean.

EDIT1:
- Poprawiłem błędy w publikacji,
- Odpowiadając na komentarze, postanowiłem umieścić tę informację tutaj: flaga —privileged jest potrzebna do pracy z iptables
EDIT2:
- Ulepszyłem polecenie uruchamiania obrazu: teraz nie wymaga flagi —privileged
- Dodałem link do rosyjskojęzycznego wideo instruktażowego:
Źródło: habr.com
