Externer Zugriff auf Nextcloud hinter DS-Lite

Hallo Ihr Lieben,

ich versuche jetzt schon seit einigen Tagen Nextcloud hinter meinem DS-Lite Anschluss zu Laufen zu bringen. Ich habe schon unendlich viele Foren durchsucht und etliche Dinge ausprobiert, leider ohne Erfolg. Mittlerweile weiß ich so viel, dass es vermutlich an der Nextcloud Konfiguration hängen muss.

Zu meinem Setup:
Ich habe eine Domain und einen VPS Server mit fester IP bei Strato.
Auf dem VPS ist ein NGINX Proxy Manager per Docker-Compose auf Ubuntu 22.04 installiert. Zusätzlich läuft dort auch noch ein Wireguard Server mit der IP 10.99.99.1. Dieser ist mit einem Peer in meinem Fritzbox LAN verbunden. Auf dem Peer läuft ebenfalls Ubuntu 22.04 und dieser hat die Wireguard IP 10.99.99.3, sowie im Fritzbox LAN die IP 192.168.178.119. Die Wireguard-Verbindung funktioniert tadellos und die Pakete kommen auf dem Peer an. Von dort aus werden die Pakete an meine Nextcloud Instanz weitergeleitet. Diese wurde „von Hand“, also per Lamp-Stack auf einer Ubuntu 22.04 VM installiert. Als Webserver dient ein Apache2 mit PHP8.2. Die Nextcloud VM hat die Fritzbox LAN IP 192.168.178.148. Der Apache hört auf Port 80.
Der Zugriff auf die NC läuft also folgendermaßen: WAN —> nc.domain.tld —> Strato VPS —> NGINX Proxy Manager (erzeugt LE SSL Zertifikat mit DNS-Challenge) —> Wireguard 10.99.99.1 —> 10.99.99.3 Peer 192.168.178.119 —> 192.168.178.148:80 Nextcloud

Ein TCPDUMP auf der Nextcloud VM für den Port 80 liefert mir folgende Infos:

tcpdump: listening on ens18, link-type EN10MB (Ethernet), snapshot length 262144 bytes
07:17:17.064859 IP (tos 0x0, ttl 62, id 20012, offset 0, flags [DF], proto TCP (6), length 60)
192.168.178.119.36474 > 192.168.178.148.80: Flags [S], cksum 0x8efc (correct), seq 3905414785, win 64240, options [mss 1460,sackOK,TS val 599414247 ecr 0,nop,wscale 7], length 0
07:17:17.064930 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
192.168.178.148.80 > 192.168.178.119.36474: Flags [S.], cksum 0xe68b (incorrect → 0x121c), seq 1045409166, ack 3905414786, win 64296, options [mss 1380,sackOK,TS val 691693519 ecr 599414247,nop,wscale 7], length 0
07:17:17.085418 IP (tos 0x0, ttl 62, id 20013, offset 0, flags [DF], proto TCP (6), length 52)
192.168.178.119.36474 > 192.168.178.148.80: Flags [.], cksum 0x39b5 (correct), ack 1, win 502, options [nop,nop,TS val 599414269 ecr 691693519], length 0
07:17:17.085418 IP (tos 0x0, ttl 62, id 20014, offset 0, flags [DF], proto TCP (6), length 587)
192.168.178.119.36474 > 192.168.178.148.80: Flags [P.], cksum 0x7d4f (correct), seq 1:536, ack 1, win 502, options [nop,nop,TS val 599414269 ecr 691693519], length 535: HTTP, length: 535
GET / HTTP/1.1
Host: nc.domain.tld
X-Forwarded-Scheme: https
X-Forwarded-Proto: https
X-Forwarded-For: 194.0.[externeIP]
X-Real-IP: 194.0.[externeIP]
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8
accept-language: de,en-US;q=0.7,en;q=0.3
accept-encoding: gzip, deflate, br
upgrade-insecure-requests: 1
sec-fetch-dest: document
sec-fetch-mode: navigate
sec-fetch-site: none
sec-fetch-user: ?1
07:17:17.085444 IP (tos 0x0, ttl 64, id 61027, offset 0, flags [DF], proto TCP (6), length 52)
192.168.178.148.80 > 192.168.178.119.36474: Flags [.], cksum 0xe683 (incorrect → 0x3789), ack 536, win 502, options [nop,nop,TS val 691693540 ecr 599414269], length 0
07:17:17.126714 IP (tos 0x0, ttl 64, id 61028, offset 0, flags [DF], proto TCP (6), length 1614)
192.168.178.148.80 > 192.168.178.119.36474: Flags [P.], cksum 0xec9d (incorrect → 0x329d), seq 1:1563, ack 536, win 502, options [nop,nop,TS val 691693581 ecr 599414269], length 1562: HTTP, length: 1562
HTTP/1.1 302 Found
Date: Tue, 04 Jun 2024 07:17:17 GMT
Server: Apache
Referrer-Policy: no-referrer
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Permitted-Cross-Domain-Policies: none
X-Robots-Tag: noindex, nofollow
X-XSS-Protection: 1; mode=block
Set-Cookie: oc9ocqr9dlzk=7hjqbs34jrir54h4djhhtdhje3; path=/; secure; HttpOnly; SameSite=Lax
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: oc_sessionPassphrase=QpDQKmcpZgWT%2F5GkBBXpLuSHPD3rwuxqxcs5WjoXL2nbuXvHoFplJ3cShy%2FHn0jWQOX5gQm8yVmEbjPwjWRPe9Cs1QTnGC3NMrpQL8JvA4uLNJhMSqPxmaa6qD7xcBXc; path=/; HttpOnly; SameSite=Lax
Set-Cookie: oc9ocqr9dlzk=7hjqbs34jrir54h4djhhtdhje3; path=/; secure; HttpOnly; SameSite=Lax
Content-Security-Policy: default-src ‘self’; script-src ‘self’ ‘nonce-eTBhS3ZIbTl0RnBGeU5aVE8yTmp6VDA3V2E4N1JFeEJrNEZmMktaZ1dTZz06b2hIUDlFRHcyMnNOdTZNSlRDYzFpMThERDVsQ01YZ0s5cmdicU40VkNVQT0=’; style-src ‘self’ ‘unsafe-inline’; frame-src *; img-src * data: blob:; font-src ‘self’ data:; media-src *; connect-src *; object-src ‘none’; base-uri ‘self’;
Set-Cookie: __Host-nc_sameSiteCookielax=true; path=/; httponly;secure; expires=Fri, 31-Dec-2100 23:59:59 GMT; SameSite=lax
Set-Cookie: __Host-nc_sameSiteCookiestrict=true; path=/; httponly;secure; expires=Fri, 31-Dec-2100 23:59:59 GMT; SameSite=strict
Set-Cookie: oc9ocqr9dlzk=7hjqbs34jrir54h4djhhtdhje3; path=/; secure; HttpOnly; SameSite=Lax
Location: http://nc.domain.tld/login
Content-Length: 0
Content-Type: text/html; charset=UTF-8
07:17:17.148590 IP (tos 0x0, ttl 62, id 20015, offset 0, flags [DF], proto TCP (6), length 64)
192.168.178.119.36474 > 192.168.178.148.80: Flags [.], cksum 0x1e03 (correct), ack 1, win 502, options [nop,nop,TS val 599414332 ecr 691693540,nop,nop,sack 1 {1369:1563}], length 0
07:17:17.159208 IP (tos 0x0, ttl 64, id 61030, offset 0, flags [DF], proto TCP (6), length 1420)
192.168.178.148.80 > 192.168.178.119.36474: Flags [.], cksum 0xebdb (incorrect → 0x7fb8), seq 1:1369, ack 536, win 502, options [nop,nop,TS val 691693614 ecr 599414332], length 1368: HTTP, length: 1368
HTTP/1.1 302 Found
Date: Tue, 04 Jun 2024 07:17:17 GMT
Server: Apache
Referrer-Policy: no-referrer
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Permitted-Cross-Domain-Policies: none
X-Robots-Tag: noindex, nofollow
X-XSS-Protection: 1; mode=block
Set-Cookie: oc9ocqr9dlzk=7hjqbs34jrir54h4djhhtdhje3; path=/; secure; HttpOnly; SameSite=Lax
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: oc_sessionPassphrase=QpDQKmcpZgWT%2F5GkBBXpLuSHPD3rwuxqxcs5WjoXL2nbuXvHoFplJ3cShy%2FHn0jWQOX5gQm8yVmEbjPwjWRPe9Cs1QTnGC3NMrpQL8JvA4uLNJhMSqPxmaa6qD7xcBXc; path=/; HttpOnly; SameSite=Lax
Set-Cookie: oc9ocqr9dlzk=7hjqbs34jrir54h4djhhtdhje3; path=/; secure; HttpOnly; SameSite=Lax
Content-Security-Policy: default-src ‘self’; script-src ‘self’ ‘nonce-eTBhS3ZIbTl0RnBGeU5aVE8yTmp6VDA3V2E4N1JFeEJrNEZmMktaZ1dTZz06b2hIUDlFRHcyMnNOdTZNSlRDYzFpMThERDVsQ01YZ0s5cmdicU40VkNVQT0=’; style-src ‘self’ ‘unsafe-inline’; frame-src *; img-src * data: blob:; font-src ‘self’ data:; media-src *; connect-src *; object-src ‘none’; base-uri ‘self’;
Set-Cookie: __Host-nc_sameSiteCookielax=true; path=/; httponly;secure; expires=Fri, 31-Dec-2100 23:59:59 GMT; SameSite=lax
Set-Cookie: __Host-nc_sameSiteCookiestrict=true; path=/; httponly;secure; expires=Fri, 31-Dec-2100 23:59:59 GMT; SameSite=stri [|http]
07:17:17.387235 IP (tos 0x0, ttl 64, id 61031, offset 0, flags [DF], proto TCP (6), length 1420)
192.168.178.148.80 > 192.168.178.119.36474: Flags [.], cksum 0xebdb (incorrect → 0x7ed4), seq 1:1369, ack 536, win 502, options [nop,nop,TS val 691693842 ecr 599414332], length 1368: HTTP, length: 1368
HTTP/1.1 302 Found
Date: Tue, 04 Jun 2024 07:17:17 GMT
Server: Apache
Referrer-Policy: no-referrer
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Permitted-Cross-Domain-Policies: none
X-Robots-Tag: noindex, nofollow
X-XSS-Protection: 1; mode=block
Set-Cookie: oc9ocqr9dlzk=7hjqbs34jrir54h4djhhtdhje3; path=/; secure; HttpOnly; SameSite=Lax
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: oc_sessionPassphrase=QpDQKmcpZgWT%2F5GkBBXpLuSHPD3rwuxqxcs5WjoXL2nbuXvHoFplJ3cShy%2FHn0jWQOX5gQm8yVmEbjPwjWRPe9Cs1QTnGC3NMrpQL8JvA4uLNJhMSqPxmaa6qD7xcBXc; path=/; HttpOnly; SameSite=Lax
Set-Cookie: oc9ocqr9dlzk=7hjqbs34jrir54h4djhhtdhje3; path=/; secure; HttpOnly; SameSite=Lax
Content-Security-Policy: default-src ‘self’; script-src ‘self’ ‘nonce-eTBhS3ZIbTl0RnBGeU5aVE8yTmp6VDA3V2E4N1JFeEJrNEZmMktaZ1dTZz06b2hIUDlFRHcyMnNOdTZNSlRDYzFpMThERDVsQ01YZ0s5cmdicU40VkNVQT0=’; style-src ‘self’ ‘unsafe-inline’; frame-src *; img-src * data: blob:; font-src ‘self’ data:; media-src *; connect-src *; object-src ‘none’; base-uri ‘self’;
Set-Cookie: __Host-nc_sameSiteCookielax=true; path=/; httponly;secure; expires=Fri, 31-Dec-2100 23:59:59 GMT; SameSite=lax
Set-Cookie: __Host-nc_sameSiteCookiestrict=true; path=/; httponly;secure; expires=Fri, 31-Dec-2100 23:59:59 GMT; SameSite=stri [|http]

Die Pakete kommen also an, allerdings scheint dann irgendetwas schief zu gehen. Per IP kann ich die Nextcloud aus dem Fritzbox LAN ohne Probleme per 192.168.178.148 auf Port 80 erreichen.
Wenn ich es allerdings außerhalb des Netzwerks per Domain versuche, dann läuft das schlussendlich auf einem 504 Gateway-Timeout raus.
Ich hoffe ihr könnt mir helfen, ich weiß echt nicht mehr weiter :frowning:

Hier meine Configs für den Virtual Apache Host und meine NC:

$CONFIG = array (
‘instanceid’ => ‘oc9ocqr9dlzk’,
‘passwordsalt’ => ‘GEHEIM’,
‘secret’ => ‘GEMEIN’,
‘trusted_domains’ =>
array (
0 => ‘nc.domain.tld’,
1 => ‘192.168.178.148’,
),
‘trusted_proxies’ =>
array (
0 => ‘192.168.178.119’,
1 => ‘10.99.99.1’,
),
‘datadirectory’ => ‘/home/data’,
‘log_type’ => ‘file’,
‘logtimezone’ => ‘Europe/Berlin’,
‘default_language’ => ‘de’,
‘default_locale’ => ‘de_DE’,
‘default_phone_region’ => ‘DE’,
‘trashbin_retention_obligation’ => ‘15, 30’,
‘updater.release.channel’ => ‘stable’,
‘htaccess.RewriteBase’ => ‘/’,
‘loglevel’ => 2,
‘logfile’ => ‘/home/data/nextcloud.log’,
‘log_rotate_size’ => ‘104857600’,
‘dbtype’ => ‘mysql’,
‘version’ => ‘29.0.1.1’,
‘overwrite.cli.url’ => ‘http://nc.domain.tld/’,
‘overwriteprotocol’ => ‘http’,
‘dbname’ => ‘nextcloud’,
‘dbhost’ => ‘localhost’,
‘dbport’ => ‘’,
‘dbtableprefix’ => ‘oc_’,
‘mysql.utf8mb4’ => true,
‘dbuser’ => ‘ncuser’,
‘dbpassword’ => ‘GEHEIM’,
‘installed’ => true,
‘updater.secret’ => ‘GEHEIM’,
‘maintenance’ => false,
‘theme’ => ‘’,
);

<VirtualHost *:80>
ServerAdmin nextcloud@nc.domain.tld
DocumentRoot /var/www/nextcloud/
ServerName nc.domain.tld
ServerAlias 192.168.178.148
#Alias /nextcloud “/var/www/nextcloud/”
#Fix für __Host-prefix
<Directory /var/www/nextcloud/>
Options Indexes FollowSymlinks
AllowOverride All
Require all granted
Satisfy Any
<IfModule mod_dav.c>
Dav off
</IfModule>
SetEnv HOME /var/www/nextcloud
SetEnv HTTP_HOME /var/www/nextcloud
</Directory>
<Directory /home/data/>
Require all denied
</Directory>
<Files “.ht*”>
Require all denied
</Files>
TraceEnable off
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Und hier noch Screenshots von meinem npm Proxy Host:



Ich danke euch schon mal für eure Unterstützung!

In deinem TCP Dump zeigst du, dass die Anfragen von der LAN IP des Peers kommen, dorthin werden sie auch zurück geschickt, aber der weiss dann nicht, was damit machen, weil eigentlich sollte das Paket an den nginx proxy gehen (welche IP hat der?)

Frage: Wieso kommt der Traffic auf deiner NC VM mit der LAN IP des Peers und nicht mit der WG IP? Kann die Fritzbox kein WG (ich kenne mich damit leider nicht aus)?
In meinem Netz terminiere ich die WG Tunnels auf der Firewall (pfSense) und dann kommt der Traffic mit der WG IP auf der VM an. Routing übernimmt dann auch die Firewall und ist zentral geregelt und nicht auf einer jeweiligen VM.

Das habe ich tatsächlich noch nicht versucht den WG Tunnel direkt auf die FritzBox zu lenken. Danke für den Vorschlag, das probiere ich aus.

Allerdings ist es seltsam, dass ich eine schnöde kurz gebaute HTML Seite auf dem Apache über die selbe Konfig und selbst mit LE Zertifikat ohne Probleme über eine separate Subdomain (test.domain.tld) aufrufen kann. Das ganze Konstrukt scheint also vom Grundsatz her zu funktionieren. Nur eben nicht mit der Nextcloud. Ich habe auch eine Route in der FritzBox, die den Traffik an den WireGuard Tunnel an den Peer 192.168.178.119 schickt. So können alle Geräte im Heimnetz theoretisch die 10.99.99.0 Adressen erreichen.