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.
Inhaltsverzeichnis
Wer Traefik noch nicht installiert hat, findet hier eine Anleitung, wie ihr dies schnell tun könnt.
Als Grundlage meiner Anleitung dient dient dieses Github Repository von linuxserver.
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 🙂
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.
cd /opt/containers/openvpn-as/ nano 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=http" - "traefik.http.routers.openvpn.rule=Host(`vpn.euredomain.de`)" ## Hier eure Domain eingeben ## - "traefik.http.middlewares.openvpn-https-redirect.redirectscheme.scheme=https" - "traefik.http.routers.openvpn.middlewares=openvpn-https-redirect" - "traefik.http.routers.openvpn-secure.entrypoints=https" - "traefik.http.routers.openvpn-secure.rule=Host(`vpn.euredomain.de`)" ## Hier eure Domain eingeben ## - "traefik.http.routers.openvpn-secure.tls=true" - "traefik.http.routers.openvpn-secure.tls.certresolver=http" - "traefik.http.routers.openvpn-secure.service=openvpn" - "traefik.http.services.openvpn.loadbalancer.server.port=943" - "traefik.http.services.openvpn.loadbalancer.server.scheme=https" - "traefik.docker.network=proxy" - "traefik.http.routers.openvpn-secure.middlewares=secHeaders@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 ### networks: proxy: external: true
Notwendige Anpassungen:
- 3x eure Domain bei Traefik anpassen („vpn.euredomain.de“)
Diese Docker Compose Datei funktioniert nur, wenn ich euch mittels meiner Anleitung hier Traefik installiert habt. Sonst heißen einige Traefik Variablen wohl anders. Diese müsst ihr dann dementsprechend bei euch 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://github.com/linuxserver/docker-openvpn-as
- DAVx⁵ – Android Kalender per CalDAV integrieren (z. B. Nextcloud) - 28. Februar 2021
- KeePass – Passwörter über eigene Cloud synchronisieren - 17. Februar 2021
- FRITZ!Box 6660 Cable mit Vodafone Cable nutzen - 16. Februar 2021
4 Kommentare
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?
Hallo,
hört sich gut an. Hast du ein bereits ein Script geschrieben?
LG
Christian
Hi Christian,
ich finde es toll wieviel Mühe Du dir machst und das hier auch alles so aktuell wie möglich hälst.
Bezüglich VPN würde ich mal Wireguard, der prima in Docker läuft, in’s Rennen geben. Ist vielleicht besser als ein Script für OpenVPN zu basteln.
Gruß
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