So führen Sie OpenVPN in einem Docker-Container unter Ubuntu 14.04 aus

Einführung

In diesem Tutorial wird erklärt, wie Sie einen OpenVPN -Container mithilfe von https://docker.com [Docker] einrichten und ausführen.

OpenVPN bietet eine Möglichkeit, virtuelle private Netzwerke (VPNs) mithilfe der TLS-Verschlüsselung (Evolution of SSL) zu erstellen. OpenVPN schützt den Netzwerkverkehr vor Abhör- und Man-in-the-Middle-Angriffen (MITM). Über das private Netzwerk kann ein Gerät, z. B. ein Laptop oder ein Mobiltelefon, das in einem unsicheren WiFi-Netzwerk ausgeführt wird, sicher mit einem Remote-Server verbunden werden, der den Datenverkehr dann an das Internet weiterleitet. Private Netzwerke können auch verwendet werden, um Geräte über das Internet sicher miteinander zu verbinden.

Docker bietet eine Möglichkeit, die Prozess- und Konfigurationsdaten des OpenVPN-Servers zu kapseln, um die Verwaltung zu vereinfachen. Das Docker OpenVPN image ist vorgefertigt und enthält alle notwendigen Abhängigkeiten, um den Server in einer vernünftigen und stabilen Umgebung auszuführen. Es sind Skripte enthalten, um den Standard-Anwendungsfall erheblich zu automatisieren. Auf Wunsch ist jedoch eine vollständige manuelle Konfiguration möglich. Ein Docker-Volumencontainer wird verwendet, um auch die Konfigurations- und EasyRSA-PKI-Zertifikatdaten zu speichern.

Docker Registry ist ein zentrales Repository für offizielle und von Benutzern entwickelte Docker-Images. Das in diesem Lernprogramm verwendete Bild ist ein vom Benutzer bereitgestelltes Bild, das unter kylemanna/openvpn verfügbar ist. Das Image wird auf den Cloud-Build-Servern von Docker Registry unter Verwendung der Quelle aus dem Repository GitHub project zusammengestellt. Der mit Github verknüpfte Cloud-Server-Build bietet die Möglichkeit, das Docker-Image zu überwachen, damit Benutzer die Docker-Quelldatei und den zugehörigen Code (http://blog.docker.com/2013/11/introducing-trusted-builds/) überprüfen können. Vertrauenswürdiger Build]. Wenn der Code im GitHub-Repository aktualisiert wird, wird ein neues Docker-Image erstellt und in der Docker-Registrierung veröffentlicht.

Beispielanwendungsfälle

  • Sichere Weiterleitung zum Internet, wenn Sie sich in einem nicht vertrauenswürdigen öffentlichen (WiFi) Netzwerk befinden

  • Privates Netzwerk zum Anschließen eines mobilen Laptops, Bürocomputers, Heim-PCs oder Mobiltelefons

  • Privates Netzwerk für sichere Dienste hinter NAT-Routern, die nicht über NAT-Traversal-Funktionen verfügen

Tore

  • Richten Sie den Docker-Daemon unter Ubuntu 14.04 LTS ein

  • Richten Sie einen Docker Volume Container ein, der die Konfigurationsdaten enthält

  • Generieren Sie eine EasyRSA PKI-Zertifizierungsstelle

  • Extrahieren Sie automatisch generierte Client-Konfigurationsdateien

  • Konfigurieren Sie eine ausgewählte Anzahl von OpenVPN-Clients

  • Behandeln Sie das Starten des Docker-Containers beim Booten

  • Einführung in fortgeschrittene Themen

Voraussetzungen

  • Linux-Shell-Kenntnisse. In diesem Handbuch wird weitgehend davon ausgegangen, dass der Benutzer in der Lage ist, Linux-Daemons im herkömmlichen Sinne einzurichten und auszuführen

  • Root-Zugriff auf einem Remote-Server

  • Für dieses Tutorial wird ein DigitalOcean 1 CPU / 512 MB RAM Droplet unter Ubuntu 14.04 vorausgesetzt. Docker erleichtert das Ausführen des Images auf jeder Linux-Distribution auf dem Host

  • Jeder virtuelle Host funktioniert, solange auf dem Host QEMU / KVM- oder Xen-Virtualisierungstechnologie ausgeführt wird. * OpenVZ wird nicht funktionieren *

  • Sie benötigen Root-Zugriff auf dem Server. In diesem Handbuch wird davon ausgegangen, dass der Benutzer als nicht privilegierter Benutzer mit aktiviertem sudo ausgeführt wird. Lesen Sie das Digital Ocean-Tutorial zur Benutzerverwaltung unter Ubuntu 14.04 wenn benötigt

  • Ein lokales Clientgerät wie ein Android-Telefon, ein Laptop oder ein PC. Fast alle Betriebssysteme werden über verschiedene OpenVPN-Clients unterstützt

Schritt 1 - Docker einrichten und testen

Docker bewegt sich schnell und die LTS-Richtlinie (Long Term Support) von Ubuntu hält nicht mit. Um dies zu umgehen, installieren wir einen PPA, der uns die neueste Version von Docker liefert.

Fügen Sie den Signaturschlüssel für das Upstream-Docker-Repository-Paket hinzu. Der Befehl "+ apt-key" verwendet erweiterte Berechtigungen über "+ sudo". In diesem Fall wird möglicherweise eine Kennwortabfrage für das Kennwort des Benutzers angezeigt:

curl -L https://get.docker.com/gpg | sudo apt-key add -
  • Hinweis: * Geben Sie bei Bedarf Ihr sudo-Passwort am blinkenden Cursor ein.

Fügen Sie das Upstream-Docker-Repository zur Systemliste hinzu:

echo deb http://get.docker.io/ubuntu docker main | sudo tee /etc/apt/sources.list.d/docker.list

Aktualisieren Sie die Paketliste und installieren Sie das Docker-Paket:

sudo apt-get update && sudo apt-get install -y lxc-docker

Fügen Sie Ihren Benutzer der Gruppe "+ docker " hinzu, um die Kommunikation mit dem Docker-Daemon als normaler Benutzer zu ermöglichen, wobei "+" Ihr Benutzername ist. * Beenden und erneut anmelden, damit die neue Gruppe wirksam wird *:

sudo usermod -aG docker

Nach dem * erneuten Anmelden * überprüfen Sie die Gruppenzugehörigkeit mit dem Befehl + id +. Die erwartete Antwort sollte "+ docker +" wie im folgenden Beispiel enthalten:

uid=1001(test0) gid=1001(test0) groups=1001(test0),27(sudo),999(docker)

Optional: Führen Sie "+ bash " in einem einfachen Debian Docker-Image aus (" - rm ", um den Container nach dem Beenden zu bereinigen, und " -it +" für interaktive Aktionen), um die Docker-Operation auf dem Host zu überprüfen:

docker run --rm -it debian:jessie bash -l

Erwartete Antwort von Docker, wenn die Bilder abgerufen und der Container eingerichtet werden:

Unable to find image 'debian:jessie' locally
debian:jessie: The image you are pulling has been verified
511136ea3c5a: Pull complete
36fd425d7d8a: Pull complete
aaabd2b41e22: Pull complete
Status: Downloaded newer image for debian:jessie
root@de8ffd8f82f6:/#

Sobald Sie sich im Container befinden, wird die Eingabeaufforderung "+ root @: / # +" angezeigt, die darauf hinweist, dass sich die aktuelle Shell in einem Docker-Container befindet. Überprüfen Sie die Version von Debian, die im Container ausgeführt wird, um sicherzustellen, dass sie sich vom Host unterscheidet:

cat /etc/issue.net

Erwartete Antwort für den OpenVPN-Container zum Zeitpunkt des Schreibens:

Debian GNU/Linux jessie/sid

Wenn Sie eine andere Version von Debian sehen, ist das in Ordnung.

Verlassen Sie den Container, indem Sie "+ logout +" eingeben. Die Eingabeaufforderung des Hosts sollte erneut angezeigt werden.

Schritt 2 - Richten Sie den Easy RSA PKI Certificate Store ein

Dieser Schritt bereitet normalerweise denjenigen Kopfzerbrechen, die mit OpenVPN oder Diensten, die PKI verwenden, vertraut sind. Glücklicherweise vereinfachen Docker und die Skripte im Docker-Image diesen Schritt, indem sie Konfigurationsdateien und alle erforderlichen Zertifikatsdateien für uns generieren.

Erstellen Sie einen Volume-Container. In diesem Lernprogramm wird die Umgebungsvariable "+" verwendet, um das Kopieren und Einfügen zu vereinfachen. Stellen Sie dies auf alles ein, was Sie möchten. Der Standardwert " ovpn-data +" wird für einzelne OpenVPN Docker-Container-Server empfohlen. Durch Festlegen der Variablen in der Shell wird die Zeichenfolgensubstitution wirksam, um zu verhindern, dass der Benutzer sie für jeden Schritt im Lernprogramm manuell ersetzt:

="ovpn-data"

Erstellen Sie einen leeren Docker-Volume-Container mit "+ busybox +" als minimalem Docker-Image:

docker run --name  -v /etc/openvpn busybox

Initialisieren Sie den Container "", der die Konfigurationsdateien und Zertifikate enthält, und ersetzen Sie "" durch Ihren vollqualifizierten Domänennamen. Der Wert "++" sollte der vollständig qualifizierte Domänenname sein, den Sie für die Kommunikation mit dem Server verwenden. Dies setzt voraus, dass die DNS settings bereits konfiguriert sind. Alternativ kann auch nur die IP-Adresse des Servers verwendet werden. Dies wird jedoch nicht empfohlen.

docker run --volumes-from  --rm kylemanna/openvpn ovpn_genconfig -u udp://:1194

Generieren Sie die EasyRSA PKI-Zertifizierungsstelle. Sie werden aufgefordert, eine Passphrase für den privaten CA-Schlüssel einzugeben. Wähle einen guten aus und erinnere dich daran. Ohne die Passphrase ist es nicht möglich, Client-Zertifikate auszustellen und zu signieren:

docker run --volumes-from  --rm -it kylemanna/openvpn ovpn_initpki
  • Beachten Sie, dass die Sicherheit des Containers "++" wichtig ist. * Er enthält alle privaten Schlüssel zum Identifizieren des Servers und aller Client-Zertifikate. Denken Sie daran und kontrollieren Sie den Zugriff nach Bedarf. Die Standard-OpenVPN-Skripte verwenden eine Passphrase für den CA-Schlüssel, um die Sicherheit zu erhöhen und das Ausstellen gefälschter Zertifikate zu verhindern.

Weitere Informationen zum Sichern des Zertifikatspeichers finden Sie in der * Schlussfolgerung * unten.

Schritt 3 - Starten Sie den OpenVPN-Server

Um den Docker-Container, der den OpenVPN-Serverprozess ausführt, automatisch zu starten (weitere Informationen finden Sie unter https://docs.docker.com/articles/host_integration/[Docker Host Integration), erstellen Sie eine https://www.digitalocean.com/community/tutorials / das-upstart-ereignissystem-was-es-ist-und-wie-man-es benutzt

sudo vim /etc/init/docker-openvpn.conf

Inhalte, die in + / etc / init / docker-openvpn.conf + abgelegt werden sollen:

description "Docker container for OpenVPN server"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
 exec docker run --volumes-from ovpn-data --rm -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn
end script

Starten Sie den Prozess mit dem Upstart-Init-Mechanismus:

sudo start docker-openvpn

Überprüfen Sie anhand der Spalte "+ STATUS", ob der Container gestartet wurde und nicht sofort abstürzt:

test0@tutorial0:~$ docker ps
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS                    NAMES
c3ca41324e1d        kylemanna/openvpn:latest   "ovpn_run"          2 seconds ago       Up 2 seconds        0.0.0.0:1194->1194/udp   focused_mestorf

Schritt 4 - Generieren Sie Client-Zertifikate und Konfigurationsdateien

In diesem Abschnitt erstellen wir ein Client-Zertifikat mit der PKI-Zertifizierungsstelle, die wir im letzten Schritt erstellt haben.

Stellen Sie sicher, dass "++" entsprechend ersetzt wird (dies muss kein vollqualifizierter Domänenname sein). Der Client-Name wird verwendet, um den Computer zu identifizieren, auf dem der OpenVPN-Client ausgeführt wird (z. B. "Heim-Laptop", "Arbeits-Laptop", "nexus5" usw.).

Das Tool "+ easyrsa " fordert Sie zur Eingabe des CA-Kennworts auf. Dies ist das Passwort, das wir oben mit dem Befehl ` ovpn_initpki +` festgelegt haben. Erstellen Sie das Client-Zertifikat:

docker run --volumes-from  --rm -it kylemanna/openvpn easyrsa build-client-full  nopass

Nachdem jeder Client erstellt wurde, ist der Server bereit, Verbindungen anzunehmen.

Die Clients benötigen die Zertifikate und eine Konfigurationsdatei, um eine Verbindung herzustellen. Die eingebetteten Skripte automatisieren diese Aufgabe und ermöglichen es dem Benutzer, eine Konfiguration in eine einzelne Datei zu schreiben, die dann auf den Client übertragen werden kann. Ersetzen Sie "++" wie gewünscht:

docker run --volumes-from  --rm kylemanna/openvpn ovpn_getclient  > .ovpn

Die resultierende "+ .ovpn " - Datei enthält die privaten Schlüssel und Zertifikate, die zum Herstellen einer Verbindung zum VPN erforderlich sind. * Bewahren Sie diese Dateien sicher auf und lassen Sie sie nicht herumliegen. * Sie müssen die " *. Ovpn +" - Dateien sicher zu den Clients transportieren, die sie verwenden. Vermeiden Sie aus Sicherheitsgründen die Verwendung öffentlicher Dienste wie E-Mail oder Cloud-Speicher, wenn Sie die Dateien übertragen.

Empfohlene Übertragungsmethoden sind ssh / scp, HTTPS, USB und microSD-Karten, sofern verfügbar.

Schritt 5 - OpenVPN-Clients einrichten

Die folgenden Befehle oder Vorgänge werden auf den Clients ausgeführt, die eine Verbindung zum oben konfigurierten OpenVPN-Server herstellen.

Ubuntu- und Debian-Distributionen über natives OpenVPN

Auf Ubuntu 12.04 / 14.04 und Debian Wheezy / Jessie-Clients (und ähnlichen):

Installieren Sie OpenVPN:

sudo apt-get install openvpn

Kopieren Sie die Client-Konfigurationsdatei vom Server und legen Sie sichere Berechtigungen fest:

sudo install -o root -m 400 .ovpn /etc/openvpn/.conf

Konfigurieren Sie die Init-Skripte so, dass alle Konfigurationen, die mit "+ / etc / openvpn / *. Conf +" übereinstimmen, automatisch gestartet werden:

echo AUTOSTART=all | sudo tee -a /etc/default/openvpn

Starten Sie den Serverprozess des OpenVPN-Clients neu:

sudo /etc/init.d/openvpn restart

Arch Linux über Native OpenVPN

Installieren Sie OpenVPN:

pacman -Sy openvpn

Kopieren Sie die Client-Konfigurationsdatei vom Server und legen Sie sichere Berechtigungen fest:

sudo install -o root -m 400 .ovpn /etc/openvpn/.conf

Starten Sie den Serverprozess des OpenVPN-Clients:

systemctl start openvpn@

Optional: Konfigurieren Sie systemd so, dass + / etc / openvpn / .conf + beim Booten gestartet wird:

systemctl enable openvpn@

MacOS X über TunnelBlick

Laden Sie TunnelBlick herunter und installieren Sie es.

Kopieren Sie "+ .ovpn +" vom Server auf den Mac.

Importieren Sie die Konfiguration, indem Sie auf die zuvor kopierte Datei "+ *. Ovpn +" doppelklicken. TunnelBlick wird aufgerufen und die Konfiguration importiert.

Öffne TunnelBlick, wähle die Konfiguration aus und wähle dann * connect *.

Android über OpenVPN Connect

Installieren Sie die OpenVPN Connect App aus dem Google Play Store.

Kopieren Sie "+ .ovpn +" auf sichere Weise vom Server auf das Android-Gerät. USB- oder microSD-Karten sind sicherer. Legen Sie die Datei auf Ihre SD-Karte, um sie leichter öffnen zu können.

Importieren Sie die Konfiguration: * Menü * → * Importieren * → * Profil von SD-Karte importieren *

Wählen Sie * Verbinden *.

Schritt 6 - Überprüfen Sie den Betrieb

Es gibt verschiedene Möglichkeiten, um zu überprüfen, ob der Datenverkehr über das VPN geleitet wird.

Webbrowser

Besuchen Sie eine Website, um die externe IP-Adresse zu ermitteln. Die externe IP-Adresse sollte die des OpenVPN-Servers sein.

Versuchen Sie Google "Was ist meine IP" oder https://icanhazip.com [icanhazip.com].

Befehlszeile

Von der Kommandozeile aus ist + wget + oder + curl + praktisch. Beispiel mit + curl +:

curl icanhazip.com

Beispiel mit + wget +:

wget -qO - icanhazip.com

Die erwartete Antwort sollte die IP-Adresse des OpenVPN-Servers sein.

Eine andere Möglichkeit besteht darin, eine spezielle DNS-Suche zu einem speziell konfigurierten DNS-Server nur für diesen Zweck durchzuführen, indem Sie "+ host " oder " dig " verwenden. Beispiel mit ` host +`:

host -t A myip.opendns.com resolver1.opendns.com

Beispiel mit + dig +:

dig +short myip.opendns.com @resolver1.opendns.com

Die erwartete Antwort sollte die IP-Adresse des OpenVPN-Servers sein.

Zusätzliche zu überprüfende Dinge

Überprüfen Sie Ihre Netzwerkschnittstellenkonfiguration. Auf Unix-basierten Betriebssystemen ist dies so einfach wie das Ausführen von "+ ifconfig " in einem Terminal und das Suchen nach der " tunX +" - Schnittstelle von OpenVPN, wenn diese verbunden ist.

Überprüfen Sie die Protokolle. Auf Unix-Systemen überprüfen Sie "+ / var / log " auf alten Distributionen oder " journalctl +" auf systemd-Distributionen.

Fazit

Das dafür erstellte Docker-Image ist Open Source und kann viel mehr als hier beschrieben.

Das Quellrepository docker-openvpn kann überprüft und geändert werden. Pull-Anfragen für allgemeine Funktionen oder Fehlerbehebungen sind willkommen.

Erweiterte Themen wie * backup * und * static client IPs * werden im Ordner docker-openvpn/docs behandelt.

Melden Sie Fehler an docker-openvpn issue tracker.