Hallo, Habr-Nutzer! Hatten Sie jemals den Wunsch, sich virtuell in eine andere Stadt, ein anderes Land oder einen anderen Kontinent zu begeben? Ich habe oft das Bedürfnis danach, daher ist die Möglichkeit, meinen eigenen VPN-Server zu haben, den ich überall in wenigen Sekunden starten kann, für mich von großer Bedeutung. In diesem Artikel möchte ich Ihnen mein Projekt vorstellen, das ich ins Leben gerufen habe, als ich nach einer fertigen Lösung gesucht habe, in diesem Fall einem Docker-Image, das es ermöglicht, schnell einen OpenVPN-Server mit minimalen Einstellungen und einem akzeptablen Sicherheitsniveau einzurichten.
Hintergrund
Die Möglichkeit, einen Dienst auf jeder Maschine zu starten – sei es ein physischer Server, ein virtueller privater Server oder sogar ein Container in einem anderen Container-Orchestrierungssystem – war von entscheidender Bedeutung. Mein Blick fiel sofort auf Docker. Erstens, dieser Dienst gewinnt zunehmend an Beliebtheit, und folglich bieten immer mehr Anbieter fertige Lösungen mit vorinstallierter Software an; zweitens gibt es ein zentrales Repository für Images, von dem aus man den Dienst mit nur einem Befehl im Terminal herunterladen und starten kann. Die Vorstellung, dass ein solches Projekt bereits existieren sollte, ließ mich nicht los, und ich suchte hartnäckig weiter. Doch die meisten Projekte, die ich fand, waren entweder zu umständlich (man musste einen Container für die dauerhafte Datenspeicherung erstellen und den Anwendungscontainer mehrmals mit verschiedenen Parametern starten), oder sie hatten keine brauchbare Dokumentation, oder sie waren ganz aufgegeben. Nachdem ich nichts Annehmbares gefunden hatte, begann ich mit meinem eigenen Projekt. Es folgten schlaflose Nächte mit dem Studium von Dokumentationen, dem Schreiben von Code und dem Debuggen, aber schließlich erblickte mein Dienst das Licht der Welt und erstrahlte in allen Farben des monochromen LED-Panels meines Routers. Daher bitte ich um Ihr Lob und Ihre Anerkennung – . Ich habe sogar ein Logo entworfen (oben, vor dem Schnitt), aber urteilen Sie nicht zu streng darüber, denn ich bin kein Designer (noch nicht). Bei der Umsetzung dieses Projekts hatte ich die Geschwindigkeit der Bereitstellung, minimale Konfigurationseinstellungen und ein akzeptables Sicherheitsniveau im Fokus. Durch Ausprobieren habe ich das optimale Gleichgewicht dieser Kriterien gefunden, wobei ich an einigen Stellen die Geschwindigkeit der Bereitstellung für die Sicherheit opfern musste und für die minimalen Einstellungen die Portabilität bezahlt habe: In der aktuellen Konfiguration kann ein einmal erstellter Container auf einem Server nicht auf einen anderen verschoben und dort gestartet werden. Zum Beispiel werden alle Client- und Serversicherheitszertifikate beim Start des Dienstes generiert, was etwa 2 Sekunden dauert. Die Generierung der Datei für den Diffie-Hellman-Schlüssel musste jedoch in die Build-Zeit verlagert werden: Sie wird während des Baus des Docker-Images erstellt und kann bis zu 10 Minuten in Anspruch nehmen. Ich würde mich sehr über eine Sicherheitsprüfung einer solchen Lösung von der hochgeschätzten Community freuen.
Start
Um den Dienst zu starten, benötigen wir einige Dinge:
- Server: physisch oder virtuell. Theoretisch kann man im Docker-in-Docker-Modus arbeiten, aber ich habe diese Option nicht umfassend getestet;
- Docker selbst. Viele Hosting-Anbieter bieten fertige Lösungen mit Docker 'an Bord';
- Öffentliche IP-Adresse.
Wenn alle Angaben korrekt sind, müssen wir den folgenden Befehl in der Konsole Ihres Servers ausführen:
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/openvpnAufmerksame Leser könnten bemerkt haben, dass die IP-Adresse des Servers automatisch mithilfe von ipify.orgbestimmt wird. Wenn das aus irgendeinem Grund nicht funktioniert, kann die Adresse manuell eingegeben werden. Wenn alle vorherigen Schritte korrekt ausgeführt wurden, sollten wir in der Konsole etwas Ähnliches sehen:
Sun Jun 9 08:56:11 2019 Initialisierungssequenz abgeschlossen
Sun Jun 9 08:56:12 2019 Client.ovpn-Datei wurde erstellt
Sun Jun 9 08:56:12 2019 Server config gestartet, laden Sie Ihre Client.ovpn-Konfiguration unter http://example.com/ herunter
Sun Jun 9 08:56:12 2019 HINWEIS: Nachdem Sie Ihre Client-Konfiguration heruntergeladen haben, wird der HTTP-Server heruntergefahren!Wir sind fast am Ziel: Jetzt müssen wir kopieren (in Ihrem Fall wird es die Adresse Ihres Servers sein) und in die Adresszeile des Browsers einfügen. Nachdem Sie die Eingabetaste gedrückt haben, wird die client.ovpn-Datei heruntergeladen und der HTTP-Server verschwinden. Wenn diese Lösung Zweifel aufwirft, können Sie den folgenden Trick verwenden: Führen Sie den vorherigen Befehl aus und fügen Sie die Flags hinzu. zp und das Passwort. Jetzt, wenn Sie den generierten Link in das Browserfenster einfügen – erhalten Sie ein ZIP-Archiv mit dem Passwort. Wenn Sie die Datei mit der Client-Konfiguration haben, können Sie jeden geeigneten Client verwenden. Ich verwende Tunnelblick für Mac.
Video-Tutorial
Dieses Video-Tutorial enthält eine detaillierte Anleitung zur Bereitstellung des Dienstes auf DigitalOcean.

EDIT1:
- Ich habe die Fehler in der Veröffentlichung korrigiert,
- In Antwort auf die Kommentare möchte ich diese Information hier herüberbringen: Das Flag —privileged wird für die Arbeit mit iptables benötigt.
EDIT2:
- Ich habe den Befehl zum Starten des Images verbessert: Jetzt benötigt er das Flag —privileged nicht mehr.
- Ich habe einen Link zu einem russischsprachigen Video-Tutorial hinzugefügt:
Quelle: habr.com
