Starten Sie OpenVPN in Docker in 2 Sekunden

Hallo, Bewohner von Chabrowsk! Haben Sie jemals eine Situation erlebt, in der Sie unbedingt virtuell in eine andere Stadt, ein anderes Land oder einen anderen Kontinent transportiert werden wollten? Ich habe dieses Bedürfnis ziemlich oft, daher war die Möglichkeit, einen eigenen VPN-Server zu haben, der in wenigen Sekunden überall gestartet werden kann, ziemlich dringend. In diesem Artikel möchte ich über mein Projekt sprechen, das ich mir damals ausgedacht habe Suchen Sie nach einer fertigen Lösung, in diesem Fall Docker, einem Image, mit dem Sie schnell einen OpenVPN-Server mit einem Minimum an Einstellungen und einem akzeptablen Sicherheitsniveau einrichten können.

Starten Sie OpenVPN in Docker in 2 Sekunden

Vorgeschichte

Die Fähigkeit, den Dienst auf jeder Maschine auszuführen – sei es ein physischer Server, ein virtueller privater Server oder sogar ein Containerraum innerhalb eines anderen Containerverwaltungssystems – war von entscheidender Bedeutung. Mein Blick fiel sofort auf Docker. Erstens erfreut sich dieser Dienst zunehmender Beliebtheit und daher bieten immer mehr Anbieter fertige Lösungen mit Vorinstallation an; Zweitens gibt es einen zentralen Speicher für Bilder, von dem aus Sie den Dienst mit einem Befehl im Terminal herunterladen und ausführen können. Die Idee, dass es ein solches Projekt bereits geben sollte, kam mir und ich suchte intensiv. Aber die meisten Projekte, die ich gefunden habe, waren entweder zu umständlich (man musste einen Container für die permanente Datenspeicherung erstellen und den Container mit der Anwendung mehrmals mit unterschiedlichen Parametern starten) oder ohne vernünftige Dokumentation oder wurden völlig aufgegeben. Ich habe nichts Akzeptables gefunden , ich habe mit der Arbeit an Ihrem Projekt begonnen. Es lagen schlaflose Nächte vor mir, in denen ich die Dokumentation studieren, Code schreiben und debuggen musste, aber schließlich erblickte mein Dienst das Licht der Welt und begann in allen Farben des monochromen LED-Panels des Routers zu funkeln. Also bitte ich dich zu lieben und zu bevorzugen - Docker-OpenVPN. Ich habe mir sogar ein Logo ausgedacht (oben, vor dem Schnitt), aber beurteilen Sie es nicht streng, da ich (mehr) kein Designer bin. Als ich dieses Projekt implementiert habe, habe ich der Geschwindigkeit der Bereitstellung Vorrang eingeräumt, mindestens jedoch Einstellungen und ein akzeptables Sicherheitsniveau. Durch Versuch und Irrtum habe ich die optimale Balance dieser Kriterien gefunden, allerdings musste ich an einigen Stellen aus Gründen der Sicherheit Einbußen bei der Bereitstellungsgeschwindigkeit hinnehmen und musste für ein Minimum an Einstellungen für die Portabilität bezahlen: In der aktuellen Konfiguration a Ein einmal auf einem Server erstellter Container kann nicht auf einen anderen Server übertragen und gestartet werden. Beispielsweise werden alle Client- und Serverzertifikate beim Start des Dienstes generiert, was etwa 2 Sekunden dauert. Allerdings musste die Generierung der Hellman-Defi-Datei in die Build-Zeit eingerechnet werden: Sie wird während des Builds des Docker-Images erstellt und kann bis zu 10 Minuten dauern. Ich würde wirklich gerne ein Sicherheitsaudit einer solchen Lösung von der angesehenen Community erhalten.

Starten

Um den Dienst zu starten, benötigen wir mehrere Dinge:

  1. Server: physisch oder virtuell. Theoretisch ist die Ausführung im Docker-in-Docker-Modus möglich, ich habe diese Option jedoch nicht ausführlich getestet;
  2. Eigentlich Docker. Viele Hosting-Anbieter bieten fertige Lösungen mit Docker an Bord;
  3. Öffentliche IP-Adresse.

Wenn alle Details vorliegen, müssen wir nur noch 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/openvpn

Einem aufmerksamen Leser ist vielleicht aufgefallen, dass die IP-Adresse des Servers automatisch ermittelt wird ipify.org. Wenn dies aus irgendeinem Grund nicht funktioniert, können Sie die Adresse manuell angeben. Wenn alle vorherigen Schritte korrekt ausgeführt wurden, sollten wir in der Konsole etwas Ähnliches sehen:

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 you client config, http server will be shut down!

Wir sind dem Ziel nahe: Jetzt müssen wir kopieren example.com (in Ihrem Fall ist es die Adresse Ihres Servers) und fügen Sie sie in die Adressleiste Ihres Browsers ein. Nachdem Sie die Eingabetaste gedrückt haben, wird die Datei client.ovpn heruntergeladen und der http-Server selbst verschwindet in Vergessenheit. Wenn Sie Zweifel an dieser Lösung haben, können Sie den folgenden Trick anwenden: Führen Sie den vorherigen Befehl aus und fügen Sie Flags hinzu zp und Passwort. Wenn Sie nun den generierten Link in ein Browserfenster einfügen, erhalten Sie ein Zip-Archiv mit einem Passwort. Sobald Sie eine Client-Konfigurationsdatei haben, können Sie jeden geeigneten Client verwenden. Ich verwende Tunnelblick für Mac.

Videoanleitung

Dieses Video-Tutorial enthält detaillierte Anweisungen zum Bereitstellen des Dienstes auf DigitalOcean.

PS Wenn Sie dieses Projekt nützlich finden, geben Sie ihm bitte einen Stern auf GitHub, forken Sie es und erzählen Sie es Ihren Freunden. Auch Mitwirkende und Sicherheitsüberprüfungen sind allgemein willkommen.PPS Wenn dieser Artikel auf Habr landet, habe ich vor, den nächsten darüber zu schreiben, wie ich Docker-in-Docker und Docker-in-Docker-in-Docker gestartet habe, warum ich es getan habe und was dabei herausgekommen ist.
EDIT1:

  1. Fehler in der Veröffentlichung korrigiert,
  2. Als Antwort auf die Kommentare habe ich beschlossen, diese Informationen hier zu platzieren: Das Flag „privileged“ ist für die Arbeit mit iptables erforderlich

EDIT2:

  1. Der Image-Startbefehl wurde verbessert: Jetzt ist das Flag –privileged nicht mehr erforderlich
  2. Link zum russischsprachigen Video-Guide hinzugefügt: youtu.be/A8zvrHsT9A0

Source: habr.com

Kommentar hinzufügen