Ahoj, Habráci! Setkali jste se někdy se situací, kdy byste si přáli virtuálně se přenést do jiného města, země nebo dokonce na jiný kontinent? Tato potřeba mě oslovuje poměrně často, a proto jsem měl velmi silnou potřebu mít svůj VPN server, který bych mohl během pár sekund spustit kdekoli. V tomto článku bych rád prozradil svůj projekt, který jsem si vymyslel, když jsem hledal hotové řešení, v tomto případě docker image, který by umožnil rychlé spuštění OpenVPN serveru s minimem nastavení a přijatelnou úrovní zabezpečení.
Pozadí
Možnost spouštět službu na jakémkoli stroji: ať už fyzickém serveru, virtuálním privátním serveru, nebo dokonce v kontejnerovém prostoru v rámci jiného systému řízení kontejnerů — byla kriticky důležitá. Okamžitě mě zaujal Docker. Zaprvé, tato služba nabírá na popularitě, a tudíž čím dál víc poskytovatelů nabízí hotová řešení s jeho předinstalací; zadruhé — existuje centrální úložiště image, odkud si můžete stáhnout a spustit službu jedním příkazem v terminálu. Měla jsem myšlenku, že takový projekt už by měl existovat, a usilovně jsem hledal. Ale většina projektů, které jsem našel — byly buď příliš komplikované (bylo potřeba vytvářet kontejner pro trvalé uchování dat a několikrát spouštět kontejner s aplikací s různými parametry), nebo bez smysluplné dokumentace, nebo dokonce zcela opuštěné. Když jsem nenašel nic přijatelným, začal jsem pracovat na svém projektu. Předem byly bezesné noci zkoumání dokumentace, psaní kódu a ladění, ale nakonec můj služba uzřela světlo a rozjasnila se všemi barvami monochromatické LED panelu směrovače. Takže, prosím, vítejte — . Vymyslel jsem dokonce logo (nahoře, před katem), ale nehodnoťte ho příliš přísně, neboť nejsem designér (už). Když jsem realizoval tento projekt, kladl jsem důraz na rychlost nasazení, minimum nastavení a přijatelnou úroveň zabezpečení. Metodou pokusů a omylů jsem našel optimální rovnováhu těchto kritérií, pravda, někde bylo nutné obětovat rychlost nasazení pro bezpečnost, a za minimum nastavení jsem musel zaplatit přenositelností: v aktuální konfiguraci jednou vytvořený kontejner na jednom serveru nelze přesunout a spustit na jiném. Například všechny klientské a serverové certifikáty se generují při spuštění služby a to zabere kolem 2 sekund. Nicméně, generaci souboru DeFi Hellmana bylo nutné přesunout do doby sestavení: ten se vytváří během sestavení Docker obrazu a může trvat až 10 minut. Velmi bych si přál získat audit zabezpečení podobného řešení od váženého společenství.
Spuštění
K provozu služby potřebujeme několik věcí:
- Server: fyzický nebo virtuální. Teoreticky je možné spouštět v módu docker-in-docker, ale tuto možnost jsem neprováděl v širokém testování;
- Samotný Docker. Mnozí poskytovatelé hostingu nabízejí hotová řešení s Dockerem „na palubě“;
- Veřejná IP adresa.
Pokud jsou všechny údaje v pořádku, zbývá nám spustit následující příkaz v konzoli vašeho serveru:
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/openvpnPozorný čtenář si mohl všimnout, že IP adresa serveru se určuje automaticky pomocí ipify.org. Pokud to z nějakého důvodu nefunguje, lze adresu zadat ručně. Pokud byly všechny předchozí kroky provedeny správně, měli bychom v konzoli vidět něco podobného:
Sun Jun 9 08:56:11 2019 Initialization Sequence Completed
Sun Jun 9 08:56:12 2019 Client.ovpn file has been generated
Sun Jun 9 08:56:12 2019 Config server started, download your client.ovpn config at http://example.com/
Sun Jun 9 08:56:12 2019 NOTE: After you download your client config, http server will be shut down!Jsme blízko cíle: nyní musíme zkopírovat (ve vašem případě to bude adresa vašeho serveru) a vložte ji do adresního řádku prohlížeče. Jakmile stisknete Enter, soubor client.ovpn se stáhne a samotný http server zmizí. Pokud to vzbudí pochyby, můžete vyzkoušet následující trik: spusťte předchozí příkaz a přidejte příznaky zp a heslo. Nyní, pokud vložíte vygenerovaný odkaz do okna prohlížeče — získáte zip archiv s heslem. Jakmile máte soubor s klientskou konfigurací, můžete použít jakýkoliv vhodný klient. Já používám Tunnelblick pro Mac.
Video tutoriál
Tento video tutoriál obsahuje podrobný návod k nasazení služby na DigitalOcean.

EDIT1:
- Opravil jsem chyby v publikaci,
- Odpovídajícím na komentáře jsem se rozhodl tuto informaci zde vyčlenit: příznak —privileged je potřebný pro práci s iptables
EDIT2:
- Vylepšil jsem příkaz pro spuštění obrazu: nyní nevyžaduje příznak —privileged
- Přidal jsem odkaz na rusky mluvící video návod:
Zdroj: habr.com
