Können Listen_Adressen wirklich auf eine Liste gesetzt werden?

32

Ich habe eine VM mit der IP-Adresse 192.168.0.192, auf der postgreSQL ausgeführt wird.

Wenn ich spezifiziere

listen_addresses = '*'

dann kann ich mich von einer anderen VM bei 192.168.0.191 und von localhost verbinden.

Aber ich kann nicht scheinen, eine Liste zu benutzen, um postgreSQL anzuweisen, diese zwei Adressen zu benutzen. Wenn ich listen_addresses in eine Liste ändere:

listen_addresses = '192.168.0.191, localhost'

dann kann ich mich nicht mehr von 192.168.0.191 verbinden.

Ich bemerke, dass fast alle Beispiele auf stackexchange listen_addresses auf '*' setzen. Liegt das daran, dass das Listenformular nicht funktioniert?

zabouti
quelle

Antworten:

45

Ja, listen_addresseskann auf eine Liste von Adressen auf dem lokalen Host festgelegt werden , an die zum Abhören gebunden werden soll.

In deinem Beispiel:

listen_addresses = '192.168.0.191, localhost'

Wenn der lokale Computer über eine IP-Adresse verfügt 192.168.0.192, sollten Sie diese IP-Adresse angeben, nicht die IP-Adresse des Remote-Hosts 192.168.0.191. PostgreSQL kann keine Bindung an die IP-Adresse eines Remote-Hosts herstellen.

Sie sagen nicht "Wer darf eine Verbindung herstellen?", Sondern "Auf welchen Schnittstellen soll PostgreSQL Verbindungen akzeptieren?". Das Bit "Wer darf verbinden?" Ist das nächste und wird in konfiguriert pg_hba.conf.

Also: Versuchen Sie es '192.168.0.192, localhost'. Oder einfach *, weil Sie wahrscheinlich tatsächlich alle Netzwerkschnittstellen abhören möchten.

Craig Ringer
quelle
1
Es klappt. Gibt es also einen praktischen Unterschied zwischen der Liste und '*'?
Zabouti
10
@ Zabouti Sicher. Wenn Ihr Server beispielsweise zwei externe Netzwerkschnittstellen hat, können Sie PostgreSQL anweisen, nur eine davon zu binden, sodass auf der anderen Seite nicht einmal eine TCP-Verbindung zu Pg hergestellt werden kann. Dies ist in der Regel eine zusätzliche Sicherheitsstufe für ein System mit mehreren Schnittstellen zu verschiedenen Sicherheitsdomänen. Sehr praktisch in Kombination mit VLANs, virtuellen Switches usw. Die häufigste Einstellung ist, localhostdass TCP / IP-Verbindungen von keiner externen Netzwerkschnittstelle möglich sind, sondern nur von der Loopback-Adresse.
Craig Ringer
1
@CraigRinger: eine sehr gute Antwort!
Franken
@CraigRinger Sie sollten diese Kommentare zu Ihrer Antwort hinzufügen. Das sind sehr nützliche Informationen.
João Portela
1
Ja, ich denke, der Kommentar ist vielleicht sogar besser als die Antwort. Rock on Craig!
Darth Egregious
2

Ich habe festgestellt, dass es anstelle der Verwendung localhostsein muss, 127.0.0.1wenn Sie auch andere Adressen angeben.

In meinem Fall, dass ich sowohl die Docker-Host-IP-Adresse als auch localhost, aber nicht die externe IP-Adresse abhöre, funktioniert dies nicht (ich erhalte eine Verbindung, die in meinen Docker-Containern abgelehnt wurde):

listen_addresses = '172.17.0.1, localhost'

Aber das macht:

listen_addresses = '172.17.0.1, 127.0.0.1'
VirtualWolf
quelle
0

Der Eintrag 0.0.0.0 ermöglicht das Abhören aller IPv4-Adressen und :: das Abhören aller IPv6-Adressen. Wenn die Liste leer ist, überwacht der Server überhaupt keine IP-Schnittstelle. In diesem Fall können nur Unix-Domain-Sockets zum Herstellen einer Verbindung verwendet werden.

walid redwan
quelle