Hallo Liste,
ich möchte einen Postgres-Server für den Zugang aus dem Netz öffnen. Postgres selbst läuft in einem Docker-Container. Im Compose-File wird der Port exposed:
ports: - 127.0.0.1:54321:5432
`docker ps` zeigt den Container entsprechend mit `127.0.0.1:54321->5432/tcp` an. Warum 54321?
Ich möchte, dass der Server nur unter xyz.abc.de:5432 verfügbar ist.
Die Domain zeigt auf den Server. Zum Testen habe ich im Host-System mit `python -m SimpleHTTPServer 5432` einen Webserver gestartet und mit curl verifiziert, dass die Verbindung funktioniert.
Auf dem Host-System läuft auch ein Apache, dem hab ich einen VHost eingerichtet:
<VirtualHost *:5432> ServerName xyz.abc.de
SSL…
ProxyPreserveHost On ProxyRequests Off SSLProxyEngine on
ProxyPass / http://localhost:54321/ ProxyPassReverse / http://localhost:54321/ </VirtualHost>
und mit `a2ensite` scharf geschaltet. In `/etc/apache2/ports.conf` habe ich `Listen 5432` eingetragen und Apache neu gestartet.
Trotzdem kann ich mich nicht mit dem Postgres-Server verbinden:
$ psql -h xyz.abc.de -U lbsn psql: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
Was hab ich vergessen bzw. falsch gemacht? Hat jemand einen Tipp für mich?
Gruß Marc
Am 25. Juni 2018 17:15:53 MESZ schrieb mail@marcloechner.de:
Was hab ich vergessen bzw. falsch gemacht? Hat jemand einen Tipp für mich?
PostgreSQL spricht kein HTTP, sondern ein eigenes Protokoll. Dieses kann nicht von einem HTTP-Server wie Apache geproxyt werden.
Du könntest versuchen, einen reinen TLS-Proxy zu nehmen, der kein HTTP macht, sondern das Postgres-Protokoll nur in TLS einpackt. TLS unterstützen die meisten Postgres-Clients, und in TLS kannst du mittels SNI (Server Name Indication) die gewünschte Virtual-Host-Beschränkung umsetzen.
Ich kann mangels Erfahrung keine entsprechende TLS-Proxy-Software empfehlen. Schau mal nach "TLS terminator" oder "TLS loadbalancer". Vielleicht kann Apache sowas auch selber, kann da jemand anderes helfen?
Schöne Grüße Stefan
Hallo Stefan,
Stefan Majewsky majewsky@posteo.de (Mo 25 Jun 2018 22:21:46 CEST):
Was hab ich vergessen bzw. falsch gemacht? Hat jemand einen Tipp für mich?
PostgreSQL spricht kein HTTP, sondern ein eigenes Protokoll. Dieses kann nicht von einem HTTP-Server wie Apache geproxyt werden.
Genau das wollte ich auch schreiben.
Habe es dann aber wieder gelöscht, weil ich dann die TLS-Settings in seinem Bespiel gesehen habe und mir jetzt auch nicht mehr sicher bin, ob da der Apache einfach nur das SSL, welches ja um jedes andere Protokoll gelegt sein kann, durchreicht und vielleicht der PostgreSQL-Server das dann sogar versteht, und sein eigenes Layer7-Protokoll da rauspopeln kann.
Vielleicht ist aber auch aus den Einstellungen, die der OP verwendet, für einen Eingeweihten sofort sichtbar, daß der Apache das TLS wird terminieren wollen.
Der Schlüssel steckt vermutlich in „SSLProxyEngine“
Best regards from Dresden/Germany Viele Grüße aus Dresden Heiko Schlittermann
2018-06-25 23:04 GMT+02:00 Heiko Schlittermann hs@schlittermann.de:
Hallo Stefan,
Stefan Majewsky majewsky@posteo.de (Mo 25 Jun 2018 22:21:46 CEST):
Was hab ich vergessen bzw. falsch gemacht? Hat jemand einen Tipp für mich?
PostgreSQL spricht kein HTTP, sondern ein eigenes Protokoll. Dieses kann nicht von einem HTTP-Server wie Apache geproxyt werden.
Richtig.
Für IPv6 ist die Lösung einfach: Dafür sorgen, daß ICMP6 und 5432/tcp vom Docker-Host durchgelassen werden. Der Docker hat wie jede Gerätschaft seine eigene Adresse und muß selbige nicht per NAT umlügen.
Für IPv4 wirst Du an NAT auf dem Docker-Host nicht vorbeikommen. Eine sehr gute Einführung dazu ist auf https://www.karlrupp.net/de/computer/nat_tutorial zu finden.
Bevor Du den PostgreSQL aber in irgendeiner Weise im weltweiten Verbindungsnetz zugänglich machst, solltest Du ihn dringends mit SSL abgesichert haben - siehe https://www.postgresql.org/docs/current/static/ssl-tcp.html
Am 2018-06-26 10:04, schrieb William Epler:
2018-06-25 23:04 GMT+02:00 Heiko Schlittermann hs@schlittermann.de:
Hallo Stefan,
Stefan Majewsky majewsky@posteo.de (Mo 25 Jun 2018 22:21:46 CEST):
Was hab ich vergessen bzw. falsch gemacht? Hat jemand einen Tipp für mich?
PostgreSQL spricht kein HTTP, sondern ein eigenes Protokoll. Dieses kann nicht von einem HTTP-Server wie Apache geproxyt werden.
Richtig.
Für IPv6 ist die Lösung einfach: Dafür sorgen, daß ICMP6 und 5432/tcp vom Docker-Host durchgelassen werden. Der Docker hat wie jede Gerätschaft seine eigene Adresse und muß selbige nicht per NAT umlügen.
Für IPv4 wirst Du an NAT auf dem Docker-Host nicht vorbeikommen. Eine sehr gute Einführung dazu ist auf https://www.karlrupp.net/de/computer/nat_tutorial zu finden.
Bevor Du den PostgreSQL aber in irgendeiner Weise im weltweiten Verbindungsnetz zugänglich machst, solltest Du ihn dringends mit SSL abgesichert haben - siehe https://www.postgresql.org/docs/current/static/ssl-tcp.html
Vielen Dank für alle Antworten. Dass der Apache tatsächlich nur HTTP versteht und andere TCP-Verbindungen nicht einfach so durchproxied, macht natürlich Sinn. Das war mir gestern noch nicht so bewusst. Die TLS-Einstellungen hab ich von anderen Projekten kopiert, die aber alle nur Webkram sind, also HTTP sprechen.
Inzwischen haben auch noch andere Umstände dafür gesorgt, dass ich das lieber ganz anders mache: Postgres und pgadmin4 aus einem Compose-File heraus auf der gleichen Kiste starten. Nachteil: für jeden Datenbank-Server, die nach dem Compose-File gebaut wird, ein eigenes pgadmin4 Vorteil: keine offenen Datenbankverbindungen über verschiedene Rechner hinweg, sondern nur im jeweiligen Docker-Network
Danke und Gruß Marc
lug-dd@mailman.schlittermann.de