Ich zeige euch hier, wie ihr den OpenVPN Access Server (AS) in wenigen Minuten mit Docker realisiert. Traefik dient uns hier als Reverse Proxy und stellt später den Dienst verschlüsselt per TLS bereit. Die Besonderheit des Access Servers ist, dass er ein Webinterface zur Verfügung stellt. Jedoch sind in der kostenlosen Version nur zwei gleichzeitige Verbindungen möglich.
Datum | Änderungen |
---|---|
08.11.2020 | Erstellung dieser Anleitung |
09.02.2023 | Anpassung an neue Traefik Anleitung, Docker Compose v2 |
Leider nutzt der OpenVPN Server standardmäßig selbstsignierte Zertifikate, wodurch jeder Webbrowser eine Sicherheitswarnung anzeigt. Die Zertifikate einfach “austauschen” klappt leider nicht, da diese mittels eines Clients oder Webinterface importiert werden müssen. In dieser Anleitung zeige ich euch eine Möglichkeit, wie ich es bei mir gelöst habe. Wenn jemand eine elegantere Möglichkeit kennt, kann er diese gerne in die Kommentare schreiben 🙂
Bei diesem Docker Image handelt es sich um ein Image, welches NICHT mehr gepflegt wird. Daher solltet ihr auf ein anderes Image / Software wechseln. Hier bei goNeuland.de findet ihr viele Anleitungen zum Thema Wireguard.
0. Grundvoraussetzung
- Docker & Docker Compose v2 (Debian / Ubuntu)
- Traefik v2 – Reverse-Proxy mit CrowdSec einrichten
1. Ordner anlegen
Zuerst legen wir uns passende Ordner-Strukturen an.
mkdir -p /opt/containers/openvpn-as/config
2. Docker Compose anlegen
Nun legen wir die eigentliche Docker Datei an. Hierfür habe ich mir diese Docker Compose Datei angeschaut und sehr viel abändern müssen, damit diese lauffähig wird.
nano /opt/containers/openvpn-as/docker-compose.yml
Inhalt
version: "2.1" services: openvpn-as: image: linuxserver/openvpn-as container_name: openvpn-as cap_add: - NET_ADMIN environment: - PUID=1000 - PGID=1000 - TZ=Europe/Berlin #- INTERFACE=eth0 #optional volumes: - /opt/containers/openvpn-as/config:/config ports: - 943:943 - 9443:9443 #- 1194:1194/udp #auskommentiert, da UDP mit Traefik nicht richtig funktioniert restart: unless-stopped labels: - "traefik.enable=true" - "traefik.http.routers.openvpn.entrypoints=https" - "traefik.http.routers.openvpn.rule=(Host(`vpn.euredomain.de`))" - "traefik.http.routers.openvpn.tls=true" - "traefik.http.routers.openvpn.tls.certresolver=http" - "traefik.http.routers.openvpn.service=openvpn" - "traefik.http.services.openvpn.loadbalancer.server.port=943" - "traefik.docker.network=proxy" - "traefik.http.routers.openvpn.middlewares=default@file" networks: - proxy certdumper: image: humenius/traefik-certs-dumper container_name: traefik_certdumper_openvpn network_mode: none volumes: # mount the folder which contains Traefik's `acme.json' file # in this case Traefik is started from its own docker-compose in ../traefik - /opt/containers/traefik/data:/traefik:ro # mount openvpn SSL folder - /var/run/docker.sock:/var/run/docker.sock:ro - /opt/containers/openvpn-as/config/etc/web-ssl:/output:rw environment: - DOMAIN=euredomain.de #### Hier eure Domain ohne vpn angeben ### - ACME_FILE_PATH=/traefik/acme_letsencrypt.json networks: proxy: external: true
Notwendige Anpassungen:
- 1x eure Domain bei Traefik anpassen („vpn.euredomain.de“)
- 1x eure Domain bei certdumper anpassen
3. Firewall anpassen
OpenVPN nutzt folgende Ports:
- Login: tcp/943
- Tunnel: tcp/9443
- Tunnel: udp/1194
Traefik hat Probleme mit UDP Weiterleitungen. Daher gebe ich nur die beiden TCP Ports frei.
Bei mir auf dem Server nutze ich als Firewall UFW. Dazu habe ich hier eine Anleitung geschrieben. Bei UFW gebt ihr folgendes auf eurem Server ein:
sudo ufw allow 943/tcp sudo ufw allow 9443/tcp
4. OpenVPN Acces Server starten
OpenVPN startet ihr wie gewohnt mit folgendem Befehl:
docker compose -f /opt/containers/openvpn-as/docker-compose.yml up
Nach einiger Zeit sollte folgendes in der Konsole stehen:
openvpn-as | [cont-init.d] 99-custom-scripts: exited 0. openvpn-as | [cont-init.d] done. openvpn-as | [services.d] starting services openvpn-as | [services.d] done.
Nun könnt ihr auf folgende Domain gehen:
https://vpn.euredomain.de:943/admin
Jetzt erscheint eine Warnmeldung. In den nächsten Schritten werden wir dieses Problem lösen.
5. Zertifikate anpassen
Der zweite Container in unserer Docker Compose Datei extrahiert bei jedem Start die Traefik Zertifikate und erlaubt uns diese hier zu nutzen. Wenn ihr eure Konsole etwas hochscrollt solltet ihr solch eine Meldung sehen:
traefik_certdumper_openvpn | [2020-11-08T16:29:31+0000]: Got value of DOMAIN: euredomain.de. Splitting values. traefik_certdumper_openvpn | [2020-11-08T16:29:31+0000]: Values split! Got 'euredomain.de' traefik_certdumper_openvpn | [2020-11-08T16:29:31+0000]: Clearing dumping directory traefik_certdumper_openvpn | [2020-11-08T16:29:31+0000]: Dumping certificates traefik_certdumper_openvpn | [2020-11-08T16:29:31+0000]: Certificate or key for 'euredomain.de' differ, updating
Wenn dies nicht bei euch erscheint, so müsst ihr eure Docker Compose Datei (Schritt 2) so anpassen und den Container neu starten:
environment: - DOMAIN=vpn.euredomain.de # vpn mit angeben
Nun lassen wir uns alle verfügbaren Zertifikatsdateien anzeigen. Öffnet dazu eine neue Konsole und gebt folgendes ein:
ls /opt/containers/openvpn-as/config/etc/web-ssl
Die Ausgabe sollte sein:
ca.crt ca.key cert.pem key.pem server.crt server.key
Nun müssen wir diese Zertifikate noch per Hand austauschen. Dazu habe ich diese offizielle Anleitung verwendet. Zum Austausch müssen wir eine Datei in dem laufenden Container starten. Also beendet diesen NICHT und startet eine NEUE Konsole.
docker exec openvpn-as /bin/bash -c "./usr/local/openvpn_as/scripts/sacli --import GetActiveWebCerts" docker exec openvpn-as /bin/bash -c "./usr/local/openvpn_as/scripts/sacli --key \"cs.priv_key\" --value_file \"/usr/local/openvpn_as/etc/web-ssl/key.pem\" ConfigPut" docker exec openvpn-as /bin/bash -c "./usr/local/openvpn_as/scripts/sacli --key \"cs.cert\" --value_file \"/usr/local/openvpn_as/etc/web-ssl/cert.pem\" ConfigPut" docker exec openvpn-as /bin/bash -c "./usr/local/openvpn_as/scripts/sacli --key \"cs.ca_bundle\" --value_file \"/usr/local/openvpn_as/etc/web-ssl/cert.pem\" ConfigPut"
Wenn alles funktioniert solltet ihr nach jedem dieser Befehle folgende Ausgabe erhalten:
docker exec openvpn-as /bin/bash -c "./usr/local/openvpn_as/scripts/sacli --key \"cs.priv_key\" --value_file \"/usr/local/openvpn_as/etc/web-ssl/key.pem\" ConfigPut" [True, {}] docker exec openvpn-as /bin/bash -c "./usr/local/openvpn_as/scripts/sacli --key \"cs.cert\" --value_file \"/usr/local/openvpn_as/etc/web-ssl/cert.pem\" ConfigPut" [True, {}] docker exec openvpn-as /bin/bash -c "./usr/local/openvpn_as/scripts/sacli --key \"cs.ca_bundle\" --value_file \"/usr/local/openvpn_as/etc/web-ssl/cert.pem\" ConfigPut" [True, {}]
6. OpenVPN Access Server neu starten
Nun beenden wir den OpenVPN Server. Dazu geht ihr in die Konsole, in der ihr den Server gestartet habt und beendet ihn mit “STRG+C”.
Startet den Server nun wieder neu.
docker-compose -f /opt/containers/openvpn-as/docker-compose.yml up -d
Nun müsst ihr einige Minuten warten. Geht dann auf folgende Webseite:
https://vpn.euredomain.de:943/admin
Nun sollte es so aussehen.
Die Zugangsdaten lauten:
- Username = admin
- Password = password
Nun müsst ihr noch die AGBs akzeptieren.
Wenn ihr eine Lizenz des OpenVPN Access Server besitzt, so könnt ihr diese nun hier eingeben. Ansonsten lasst das Feld leer. Die Einschränkung sind nur zwei gleichzeitige Verbindungen auf den Server.
7. OpenVPN konfigurieren
Nun geht ihr auf “Status –> Status Overview” um euch eine Übersicht anzuschauen.
Hier fällt auf, dass der “Server Name” eine private IP aus dem Docker Bereich ist. Dies hat zum Problem, dass später keine Clients connecten können. Daher passen wir diese nun an.
Dazu geht ihr auf “Configuration –> Network Settings”.
Hier gebt ihr euren Hostname an. Dieser lautet:
vpn.euredomain.de
Nun scrollt ihr ans Ende der Seite und klickt “Save Settings”.
Nun erscheint diese Meldung:
Klickt hier auf “Update Running Server”. Anschließend sollte folgendes erscheinen.
Nun könnt ihr euch mit euren Clients verbinden.
8. OpenVPN Access admin Kennwort ändern
Dieses Passwort müsst ihr per Konsole ändern. Gebt dazu folgendes ein:
docker exec -it openvpn-as /bin/bash
Nun könnt ihr das Passwort ändern:
root@c11e8a43060b:/# passwd openvpn Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
Das Passwort wird direkt übernommen.
9. OpenVPN Access Server Clients
Hier gibt es eine Liste aller offiziellen OpenVPN Access Server Clients.
Ich habe den Android Client getestet und dieser lief ohne Probleme. Wichtig ist, dass ihr beim (Android) Client den Port 943 angeben müsst.
10. Wichtiger Hinweis zu den Zertifikaten
Traefik (Lets encrypt) Zertifikate sind nur 3 Monate gültig. Dies bedeutet, dass ihr Schritt 5 der Anleitung ca. alle 2-3 Monate wiederholen müsst. Wer eine gute Lösung für das Problem hat, kann diese gerne in die Kommentare schreiben 🙂
11. Quellen
https://openvpn.net/vpn-server-resources/connecting/
https://openvpn.net/vpn-server-resources/installing-a-valid-ssl-web-certificate-in-access-server/
https://github.com/linuxserver/docker-openvpn-as
Hi,
schien mir erst etwas “verstaubt” aber es scheinen ja doch noch einige an OpenVPN mit Traefik zu basteln. Bei mir läuft es zur Zeit “parallel” auf dem Server und ich würde es gerne auch hinter Traefik schieben, allerdings nur, wenn die Erneuerung der Zertifikate automatisch läuft.
Daher mal ein Ansatz, vielleicht kann es jemand ausprobieren oder bestätigen, der die Installation nach dieser Anleitung schon am Laufen hat!?
Datei erstellen:
nano /usr/local/sbin/openvpn-certrenewal.sh
mit folgendem Inhalt (im Wesentlichen aus Schritt 5), ggf. noch ein paar weitere/längere Pausen mit “sleep” nötig!?
#!/bin/bash
docker exec openvpn-as /bin/bash -c “./usr/local/openvpn_as/scripts/sacli –import GetActiveWebCerts”
sleep 1m
docker exec openvpn-as /bin/bash -c “./usr/local/openvpn_as/scripts/sacli –key \”cs.priv_key\” –value_file \”/usr/local/openvpn_as/etc/web-ssl/key.pem\” ConfigPut”
docker exec openvpn-as /bin/bash -c “./usr/local/openvpn_as/scripts/sacli –key \”cs.cert\” –value_file \”/usr/local/openvpn_as/etc/web-ssl/cert.pem\” ConfigPut”
docker exec openvpn-as /bin/bash -c “./usr/local/openvpn_as/scripts/sacli –key \”cs.ca_bundle\” –value_file \”/usr/local/openvpn_as/etc/web-ssl/cert.pem\” ConfigPut”
sleep 1m
docker restart openvpn-as
Danach cronjob einrichten:
crontab -e
und dort zeile einfügen
0 0 20 * * /usr/local/sbin/openvpn-certrenewal.sh
Wie gesagt, nur erste Idee…
Oh, es wird noch auf die alte acme.json verwiesen. – Ist vermutlich vor Traefik2.0 entstanden.
Nachdem ich jetzt alles auf ARM64 umgebaut hatte, wird ein Verzeichnis “/vpn” (vermutlich auf der Docker-Seite) nicht gefunden.
Hat jemand hier den openVPN bereits auf ARM64 zum Laufen gebracht?
Hi, hat generell alles funktioniert wie ich es mir vorgestellt habe.. Allerdings habe ich bei mir noch zwei Probleme:
Danke und Grüße
Malte
Hallo,
durch Zufall habe ich deine Seite entdeckt und konnte alles auf Debian 11 nachbauen.
Traefik, Nextcloud, Mailsever alles funktioniert.
Aber hier klappt was nicht:
Nun müssen wir diese Zertifikate noch per Hand austauschen. Dazu habe ich diese offizielle Anleitung verwendet. Zum Austausch müssen wir eine Datei in dem laufenden Container starten. Also beendet diesen NICHT und startet eine NEUE Konsole.
Die Befehle zum Austausch klappen bei meinem Debian nicht. Error No such file or directory /usr/local/openvpn_as/etc/web-ssl/key.pem
Ansonsten läuft es gut auf meinem Vserver.
Sehr gute Arbeit von dir.
Hallo. Ich habe einen normalen OpenVPN Server mit LDAP & Port 1194 + 443 erstellt. Leider läuft der mit traefik noch nicht so richtig. Vllt gibts hier ein followup? Configs: https://pastebin.com/LfWk0BXD
Huhu,
bzgl. der Zertifikat-Thematik:
Könnte man sich nicht per Bash-Script und crontab eine Routine Basteln, die z.b. exakt nach neuen Zertifikaten diese rüber “kopiert”?
Wenn man die Update-Routine von Traefik unter die Lupe nimmt, müsste man ja auf das Zeitinterval hierfür kommen, oder?