Nextcloud in der DMZ mit OPNsense

Kategorien: tutorial

Nextcloud ist eine sehr gute Lösung für Cloud-Dienste (was immer das heißen mag). Sie ist auch leicht selbst auf einem eigenen Rechner zu hosten. In diesem Artikel beschreibe ich, wie man eine existierende Nextcloud-Instanz in einer OPNsense-DMZ nach außen freigeben.

Voraussetzungen

In diesem Artikel gehe ich davon aus, dass bereits ein Server in der DMZ eine laufende Nextcloud-Instanz anbietet. Es ist hilfreich, wenn man sich sicher ist, dass der Nextcloud-Server im lokalen Netz ordentlich läuft. Ich gehe auch davon aus, dass bereits ein externer DNS-Eintrag für den Nextcloud-Server existiert und bereits ein Let’s-Encrypt-Zertifikat für den Server in OPNsense angelegt und erzeugt wurde.

Einrichtung

Prinzipiell muss man auch für Nextcloud nur einen Reverse-Proxy in OPNsense, deshalb führt man die in dem verlinkten Artikel beschriebenen Schritte ebenfalls für den Nextcloud-Server in der DMZ aus. Damit funktioniert der Zugriff aus dem Browser wie erwartet. Sind wir damit etwa schon fertig? Nicht ganz. Zumindest, wenn man die Calender- und Contacts-Apps von Nextcloud zur Synchronisation mit Apple-Geräten nutzen möchte.

Altbekannte Dienste

Einige Clients unterstützen eine automatisches Auffinden (automatic discovery) von Diensten. Dazu muss der Webserver URLs der Form example.org/.well-known/<dienst> anbieten. Dies nutzt zum Beispiel Let’s Encrypt, um beim HTTP-01-Verfahren die Kontrolle des Antragstellers über die Domain nach zu weisen. Die URL würde dann example.org/.well-known/acme-challenge lauten.

Für die Kalender und Adressbuch-Synchronisation mit den Protokollen CalDAV und CardDAV, gibt es entsprechende URLs example.org/.well-known/caldav beziehungsweise example.org/.well-known/carddav. Diese muss man mit einem 301-Permanent-Redirect auf die Adresse des Diensts in Nextcloud (irgendwas mit remote.php umleiten. Wie das für den Kalender funktioniert beschreibe ich im folgenden. Andere Dienste folgen dem gleichen Muster.

URL-Rewriting

Als erstes benötigen wir die URL des Dienstes in der eigenen Nextcloud-Instanz. Dazu Öffnen wir die Calendar-App in Nextcloud. Da wir oben bereits nach der Anleitung Reverse-Proxy in OPNsense unseren Nextcloud im Reverse-Proxy eingerichtet haben, können wir ja schon die externe URL verwenden. Wenn nicht auch nicht schlimm. Wir benötigen nur den absoluten Pfad der URL. In der Calendar-App klicken wir unten links auf “Settings & Import”.

Kalender “Settings & Import

Jetzt bekommen wir die Einstellungen der Calendar-App angezeigt.

Kalender-Einstellungen

Mit CTRL-A, CTRL-C kopieren wir uns den Wert aus “Primary CalDAV address” in diesem Beispiel ist das:

Den Eintrag unter “iOS/macOS CalDAV address” brauchen wir hier nicht. Man kann ihn nutzen, um in iOS/macOS genau diesen Kalender einzubinden.

Von der URL oben brauchen wir nur den hinteren Teil /mycloud/remote.php/dav. Wir wechseln in OPNsense in die “Services>Nginx>Configuration”. Die URL-Rewrite-Regel findet man im zweiten Karteireiter mit einem Klick auf das kleine Dreieck.

URL-Rewrite-Regel auswählen

Mit dem ‘+’-Knopf legt man jetzt die Regel an. Hier tragen wir unter “Original URL Pattern” den altbekannten Dienst /.well-known/caldav. Eine Falle lauert hier, da die Zeichenkette ein regulärer Ausdruck ist. Der Punkt steht in diesem Fall für ein beliebiges Zeichen. Wenn man wie im folgenden gezeigt einen Backslash vor den Punkt schreibt, passt das Muster nur auf genau diesen Pfad. Mit den regulären Ausdrücken könnte man auch eine URL-Rewrite-Regel für CalDAV und CardDAV anlegen. Wir legen der Einfachheit halber einfach zwei Regeln an.

URL-Rewrite-Regel anlegen

Wichtig ist das “Flag”. Der Wert “Permanent” sorgt für einen HTTP-Statuskode 301 – “Moved Permanently”, der den Client anweist, neue URL abzufragen.

Location

Als nächstes benötigen wir eine neue Location. Also wählen wir in Karteireiter mit einem Klick auf das Dreieck “Location” aus.

Mit einem Klick auf ‘+’ legen wir eine neue Location an.

Hier gibt es wieder eine Menge Parameter. Es reicht aber, die folgenden wie hier gezeigt zu setzen. Die “Upstream Servers” muss man halt, auf den Wert setzen, wie man die Server-Gruppe beim Einrichten des Reverse-Proxies genannt hat.

Location anlegen

Wichtig ist noch die Größe für Uploads sowohl auf dem Nextcloud-Server als auch im Reverse Proxy an zu passen. Auf meinem Nexcloud-Server habe ich einfach folgende Änderung vorgenommen:

diff /etc/php/7.4/apache2/php.ini /etc/php/7.4/apache2/php.ini.orig
694c694
< post_max_size = 16G
---
> post_max_size = 8M
846c846
< upload_max_filesize = 16G
---
> upload_max_filesize = 2M

Das alleine reicht aber nicht. In der Location muss man auch noch zwei Parameter anpassen. Die werden allerdings erst sichtbar, wenn man den advanced mode einschaltet.

Advanced mode einschalten

Jetzt konnte ich die beiden Parameter Maximum Body Size und Maximum Temporary file Size auf Werte setzen, die es mir erlauben auch Videos vom Smartphone hochzuladen.

Location anlegen

HTTP(S)-Server erweitern

Jetzt müssen wir noch die Location in unserem “HTTP-Server” hinzufügen. Dazu klicken wir noch einmal auf das kleine Dreieck und wählen “HTTP Server” aus.

Hier müssen wir keinen neuen Server anlegen, sondern unseren Nextcloud-Server editieren. Richtig. Das macht man mit dem Bleistift-Knopf. Im Dialog müssen wir nur noch den Haken vor unserer Location setzen.

Location hinzufügen

Das ganze muss man noch für CardDAV durchführen. Faule, schlaue Leute lösen das mir regulären Ausdrücken. Mir ist das zu unübersichtlich. Ein zweite URL-Rewrite-Regel und eine zweite Location anlegen und im Server einschalten, macht genau das was ich will.

Fazit

Jetzt kann man die Nextcloud-Installation extern testen lassen.

  1. Der Nextcloud Security Scan liefert bei dieser Installation ein “A” und kein “A+”, weil der __HOST-Prefix nicht stimmt. Nach dem Lesen des Internet-Draft, habe ich beschlossen mit “A” zu leben. “A+” kann man scheinbar nur erreichen, wenn der Nextcloud-Server seine eigene Subdomain bekommt. Das ist mir zu aufwendig, da in allen Clients die neue URL ohne mycloud konfiguriert werden müsste.

  2. Der SSL Labs Server Test liefert ein ebenfalls nur ein “A”. Das ist mir im Moment aber auch gut genug.

Das könnte Sie auch interessieren