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.

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:

  1. 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

Teile diesen Beitrag
Christian
Letzte Artikel von Christian (Alle anzeigen)

Categories:

2 Kommentare

  1. 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?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.