Reverse Proxy mit Lets Encrypt funktioniert nicht

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
stevie1401
Beiträge: 608
Registriert: 19.10.2014 15:51
Kontaktdaten:

Reverse Proxy mit Lets Encrypt funktioniert nicht

Beitrag von stevie1401 »

Ich habe einen Reverse Proxy Server eingerichtet und die Ports 80 und 430 auf den PC weitergeleitet, auf dem mein Purebasic-Websocket-Server läuft.
Ein Lets Encrypt Schlüssel ist erfolgreich erstellt.
Der Purebasic-Websocket-Server läuft allerdings auf Port 1602.Dieser Port wird auch auf den PC auf dem der PB-Webserver Server läuft umgeleitet.
Von "draussen" komme ich nur unverschlüsselt auf den Server.
Was mache ich falsch?
Habe ich noch etwas vergessen zu tun?
Ich programmiere plattformunabhängig und suche immer Lösungen für alle Plattformen.
Win 7/10, Linux Mint Cindy 3 (Debian), Mint 18.3 / 19.1
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8398
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 20.10
NVIDIA Quadro P2200
Wohnort: Saarbrücken
Kontaktdaten:

Re: Reverse Proxy mit Lets Encrypt funktioniert nicht

Beitrag von NicTheQuick »

430 ist falsch. Der HTTPS-Port ist 443. Um das Zertifikat zu erzeugen, brauchst du nur Port 80. Deswegen ist es dir vielleicht vorher nicht aufgefallen.
Testen kannst du dein Zertifikat später übrigens hier: https://www.ssllabs.com/ssltest/
Einfach die Domain eingeben und dann wird die Verbindung auf Herz und Nieren getestet.
Bild
stevie1401
Beiträge: 608
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Reverse Proxy mit Lets Encrypt funktioniert nicht

Beitrag von stevie1401 »

Sorry, 430 war ein Tippfehler. Ich meinte natürlich Port 443.
Getestet habe ich auch. Alles ok. Nur komme ich von einer verschlüsselten Seite NICHT auf meinen Web-Socket Server.

muss ich das:
<VirtualHost *:80>
ServerName doko-lounge-selfhost.eu
ProxyPreserveHost On
DocumentRoot /var/www/html
ProxyPass /.well-known !
ProxyPass / http://192.168.2.32:80/
ProxyPassReverse / http://192.168.2.32:80/
</VirtualHost>

vielleicht in
<VirtualHost *:1602>
ServerName doko-lounge-selfhost.eu
ProxyPreserveHost On
DocumentRoot /var/www/html
ProxyPass /.well-known !
ProxyPass / http://192.168.2.32:1602/
ProxyPassReverse / http://192.168.2.32:1602/
</VirtualHost>

ändern oder hinzufügen da der Web-Server ja auf Port 1602 läuft?

Habe es gerade versucht. Funktioniert leider auch nicht.
Ich programmiere plattformunabhängig und suche immer Lösungen für alle Plattformen.
Win 7/10, Linux Mint Cindy 3 (Debian), Mint 18.3 / 19.1
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8398
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 20.10
NVIDIA Quadro P2200
Wohnort: Saarbrücken
Kontaktdaten:

Re: Reverse Proxy mit Lets Encrypt funktioniert nicht

Beitrag von NicTheQuick »

Du brauchst einen VirtualHost für Port 80 und für Port 443.

Aber ich steig jetzt nicht mehr ganz durch bei dir.

Also du hast einen Router mit zwei Port forwarding Regeln. Die Ports 80 und 443 hast du weitergeleitet auf die Ports 80 und 443 deines PCs.
Dieser PC hat einen Apachen auf Port 80 und 443 laufen und dieser soll dann Proxy zu deiner PB-Anwendung spielen, die auf dem selben PC läuft?

Zunächst solltest du sichergehen, dass dein Apache überhaupt auf den Port 443 hört. Unter einem Ubuntu gibt es dafür diese Datei:
/etc/apache2/ports.conf

Code: Alles auswählen

Listen 80

<IfModule ssl_module>
        Listen 443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 443
</IfModule>
An ihr erkennt man, dass der Apache nur auf Port 443 läuft, wenn das ssl-Module aktiv ist. Wenn man sich nicht sicher ist, muss man es aktivieren. z.B. so:

Code: Alles auswählen

sudo a2enmod ssl
Dann solltest du z.B. folgende Datei anlegen:
/etc/apache2/sites-available/doko-lounge.selfhost.eu.conf (Du hattest hier einen Tippfehler. Ich habe - durch . ersetzt)

Code: Alles auswählen

<VirtualHost *:80>
	ServerName doko-lounge.selfhost.eu
	ServerAdmin mailadresse@example.com
	
	# Falls jemand www. benutzt, schneide es ab.
	RewriteEngine On
	RewriteCond %{HTTP_HOST} ^www\. [NC]
	RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
	RewriteRule ^ %{REQUEST_SCHEME}://%1%{REQUEST_URI} [L,NE,R=301]
	
	<Location "/.well-known">
		Require all granted
	</Location>

	# Hier muss der Pfad hin, in den Let's Encrypt Dateien anlegen darf
	DocumentRoot /var/www/html

	# Leite alle Zugriffe direkt auf HTTPS um
	RewriteEngine On
	RewriteCond %{HTTPS} off
	RewriteCond %{REQUEST_URI} !^/.well-known/(.*)
	RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
	
</VirtualHost>

<Virtualhost *:443>
	ServerName doko-lounge.selfhost.eu
	ServerAdmin mailadresse@example.com

	# Let's Encrypt Zertifikate laden
	SSLCertificateFile      /etc/letsencrypt/live/doko-lounge.selfhost.eu/cert.pem
	SSLCertificateKeyFile   /etc/letsencrypt/live/doko-lounge.selfhost.eu/privkey.pem
	SSLCertificateChainFile /etc/letsencrypt/live/doko-lounge.selfhost.eu/fullchain.pem
	
	# Konfiguriere die erlaubten SSL-Protokolle
	SSLEngine On
	SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
	SSLCipherSuite EECDH+AESGCM:EDH+AESGCM

	SSLHonorCipherOrder on
	SSLCompression off
	
	# Aktiviere HSTS und erlaube Frames nur vom selben Origin
	Header always set Strict-Transport-Security "max-age=31536000;"
	Header always set X-Frame-Options SAMEORIGIN
	Header always set X-Content-Type-Options nosniff

	# Das braucht man, damit die RemoteIP weitergegeben wird
	RemoteIPHeader X-Forwarded-For

	# Das ist wichtig, damit der originale Servername an den Proxy weitergegeben wird
	ProxyPreserveHost On
	ProxyPass / http://127.0.0.1:1602/
	ProxyPassReverse / http://127.0.0.1:1602/
</VirtualHost>
Danach aktivierst du die Seite und startest den Apachen neu.

Code: Alles auswählen

sudo a2ensite doko-lounge.selfhost.eu.conf
sudo systemctl restart apache2.service
Falls du das ganze unter Windows machst, musst du selbst herausfinden, wo diese Dateien alle liegen und ob die Pfade stimmen. Ich habe einfach mal geraten.
Bild
stevie1401
Beiträge: 608
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Reverse Proxy mit Lets Encrypt funktioniert nicht

Beitrag von stevie1401 »

Ja Mensch, da guckt man sich 1000 Videos an, aber bei dir habe ich es endlich etwas verstanden, NicTheQuick.
Ich werde das morgen ausgiebig testen.
Ich habe den Apache auf Linux Mint 20 laufen.

Erst einmal vielen Dank!!
Ich programmiere plattformunabhängig und suche immer Lösungen für alle Plattformen.
Win 7/10, Linux Mint Cindy 3 (Debian), Mint 18.3 / 19.1
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8398
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 20.10
NVIDIA Quadro P2200
Wohnort: Saarbrücken
Kontaktdaten:

Re: Reverse Proxy mit Lets Encrypt funktioniert nicht

Beitrag von NicTheQuick »

Ich habe mir für den ganzen Kram schon einige Makros angelegt, die mir das vereinfachen. Ich hab das gerade extra für dich nochmal etwas aufgedröselt und ein paar Kommentare reingeschrieben. Ich kann mir vor stellen, dass zwischendurch doch noch Fehler passen. Um die Apache-Konfiguration zu testen, schreib einfach das hier:

Code: Alles auswählen

sudo apachectl configtest
Ist der Syntax OK, dann sollte ein Restart möglich sein. Solange du keine Module installierst, deinstallierst und ausschließlich nur VirtualHosts änderst, dann reicht auch ein "sudo systemctl reload apache2.service". Aber einen großen Unterschied wird das für dich wahrscheinlich nicht machen.
Falls nicht schon geschehen, musst du auch noch folgendes Modul aktivieren

Code: Alles auswählen

sudo a2enmod proxy_http
Und wenn du noch mehr Fragen hast, frag einfach, aber schreib mir auch die genauen Fehlermeldungen hier, damit es einfacher für mich ist. In /var/log/apache/ findest du auch immer allerhand Logs.
Bild
stevie1401
Beiträge: 608
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Reverse Proxy mit Lets Encrypt funktioniert nicht

Beitrag von stevie1401 »

Hm, ich hab alle so gemacht wie du es beschrieben hast.
Leider kommt folgende Fehlermeldung:
Syntax error on line 49 of /etc/apache2/sites-enabled/doko-lounge.selfhost.eu.conf:
Invalid command 'RemoteIPHeader', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.
Klammere ich RemoteIPHeader aus, kommt folgende Meldung:
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
Leider kann ich nirgends einen Eintrag mit der IP 127.0.1.1 finden...

Ich habe noch eine Verständnisfrage.
Der Client versucht ja sich mit dem Server über Websockets auf Port 1602 zu verbinden.
Muss ich da keinen VirtualHost für Port 1602 erstellen?
Ich programmiere plattformunabhängig und suche immer Lösungen für alle Plattformen.
Win 7/10, Linux Mint Cindy 3 (Debian), Mint 18.3 / 19.1
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8398
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 20.10
NVIDIA Quadro P2200
Wohnort: Saarbrücken
Kontaktdaten:

Re: Reverse Proxy mit Lets Encrypt funktioniert nicht

Beitrag von NicTheQuick »

stevie1401 hat geschrieben:
Syntax error on line 49 of /etc/apache2/sites-enabled/doko-lounge.selfhost.eu.conf:
Invalid command 'RemoteIPHeader', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.
Die Zeile brauchst du nicht unbedingt. Du kannst sie entweder löschen, oder du aktivierst das Modul headers:

Code: Alles auswählen

sudo a2enmod headers
stevie1401 hat geschrieben:Klammere ich RemoteIPHeader aus, kommt folgende Meldung:
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
Das ist nur eine Info, kein echter Fehler. Das kannst du ignorieren.
stevie1401 hat geschrieben:Ich habe noch eine Verständnisfrage.
Der Client versucht ja sich mit dem Server über Websockets auf Port 1602 zu verbinden.
Muss ich da keinen VirtualHost für Port 1602 erstellen?
Der Client sollte natürlich auch für seine Websockets https über Port 433 nutzen. Der Port 1602 sollte nur auf deinem PC offen sein, und nicht öffentlich im Internet hängen. Auch die Websockets sollten über den vorhandenen VirtualHost laufen. Die werden dann ja automatisch geproxied zu Port 1602 am PC.
Bild
stevie1401
Beiträge: 608
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Reverse Proxy mit Lets Encrypt funktioniert nicht

Beitrag von stevie1401 »

Hm, ok, dann scheint alles ok zu sein.
Aber wie erreiche ich nun per Websocket mein Programm?
Laut Kiffi in der Spiderbasic-Rubrik, muss ich nun nicht mehr mit

Code: Alles auswählen

"ws://doko-lounge.selfhost.eu:1602"


sondern mit

Code: Alles auswählen

"wss://doko-lounge.selfhost.eu:1602"

Meinen Server erreichen.
Klappt aber nicht.
Auch nicht

Code: Alles auswählen

"wss://doko-lounge.selfhost.eu:80"

und

Code: Alles auswählen

"wss://doko-lounge.selfhost.eu:443"
Ich programmiere plattformunabhängig und suche immer Lösungen für alle Plattformen.
Win 7/10, Linux Mint Cindy 3 (Debian), Mint 18.3 / 19.1
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8398
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 20.10
NVIDIA Quadro P2200
Wohnort: Saarbrücken
Kontaktdaten:

Re: Reverse Proxy mit Lets Encrypt funktioniert nicht

Beitrag von NicTheQuick »

Oh, interessant. Das Protokoll ws bzw. wss habe ich noch nie genutzt. Jetzt hast du meine Wissenslücke erwischt. :D
Aber auch dafür gibt es ein Modul im Apachen: https://httpd.apache.org/docs/2.4/mod/m ... unnel.html

Zunächst müsstest du also auch dieses Modul aktivieren:

Code: Alles auswählen

sudo a2enmod proxy_wstunnel
Und jetzt muss ich raten. Und rate dir diesen Teil

Code: Alles auswählen

	ProxyPreserveHost On
	ProxyPass / http://127.0.0.1:1602/
	ProxyPassReverse / http://127.0.0.1:1602/
mit diesem zu ersetzen

Code: Alles auswählen

	ProxyPreserveHost On
	RewriteEngine On
	RewriteCond %{HTTP:Upgrade} =websocket [NC]
	RewriteRule ^/(.*)           ws://127.0.0.1:1602/$1 [P,L]
	RewriteCond %{HTTP:Upgrade} !=websocket [NC]
	RewriteRule ^/(.*)           http://127.0.0.1:1602/$1 [P,L]

	ProxyPassReverse / http://127.0.0.1:1602/
Das sollte je nach einkommendem Protokoll entweder auf http oder ws Proxy spielen. Das P (Proxy) in [P,L] bedeutet, dass hier nicht wirklich eine URL umgeschrieben wird, sondern das selbe gemacht wird wie normalerweise ProxyPass macht. Das L (Last) in [P,L] bedeutet, dass nach dem Ausführen dieser Regel nichts weiter getan werden soll.
Bild
Antworten