¿Puede listen_addresses realmente establecerse en una lista?

32

Tengo una máquina virtual con la dirección IP 192.168.0.192 que ejecuta postgreSQL.

Si especifico

listen_addresses = '*'

entonces puedo conectarme desde otra VM en 192.168.0.191 y desde localhost.

Pero parece que no puedo usar una lista para decirle a postgreSQL que use esas dos direcciones. Si cambio listen_addresses a una lista:

listen_addresses = '192.168.0.191, localhost'

entonces ya no puedo conectarme desde 192.168.0.191.

Noté que casi todos los ejemplos en stackexchange establecen listen_addresses en '*'. ¿Es esto porque el formulario de lista no funciona?

zabouti
fuente

Respuestas:

45

Sí, listen_addressesse puede establecer en una lista de direcciones en el host local para enlazar y escuchar.

En tu ejemplo:

listen_addresses = '192.168.0.191, localhost'

Si la máquina local tiene IP 192.168.0.192, debe especificar esa IP, no la 192.168.0.191IP del host remoto . PostgreSQL no puede vincularse a la dirección IP de un host remoto.

No estás diciendo "quién tiene permiso para conectarse", estás diciendo "en qué interfaces debe PostgreSQL aceptar conexiones". El bit "quién tiene permitido conectarse" es el siguiente y está configurado en pg_hba.conf.

Entonces: inténtalo '192.168.0.192, localhost'. O simplemente *, ya que probablemente quiera escuchar en todas las interfaces de red.

Craig Ringer
fuente
1
Funciona. Entonces, ¿hay alguna diferencia práctica entre la lista y '*'?
zabouti
10
@zabouti Claro. Si su servidor tiene (digamos) dos interfaces de red externas, puede decirle a PostgreSQL que solo se una en una de ellas, por lo que ni siquiera es posible hacer una conexión TCP a Pg en la otra. Es principalmente un nivel adicional de seguridad para un sistema que tiene múltiples interfaces para diferentes dominios de seguridad. Muy útil en combinación con VLAN, conmutadores virtuales, etc. El uso más común es configurarlo para localhostque las conexiones TCP / IP no sean posibles desde ninguna interfaz de red externa, solo la dirección de bucle invertido.
Craig Ringer
1
@CraigRinger: una muy buena respuesta!
francos
@CraigRinger, debe agregar esos comentarios a su respuesta. Esa es información muy útil.
João Portela
1
Sí, creo que el comentario podría ser incluso mejor que la respuesta. Rock en Craig!
Darth Egregious
2

He descubierto que, en lugar de usarlo localhost, debe ser 127.0.0.1si también especificas otras direcciones.

Entonces, en mi caso de escuchar en la dirección IP del host Docker así como en el host local, pero no en la IP externa, esto no funciona (obtengo una conexión rechazada desde el interior de mis contenedores Docker):

listen_addresses = '172.17.0.1, localhost'

Pero esto hace:

listen_addresses = '172.17.0.1, 127.0.0.1'
VirtualWolf
fuente
0

La entrada 0.0.0.0 permite escuchar todas las direcciones IPv4 y :: permite escuchar todas las direcciones IPv6. Si la lista está vacía, el servidor no escucha en ninguna interfaz IP, en cuyo caso solo se pueden usar sockets de dominio Unix para conectarse a ella.

walid redwan
fuente