Les listen_addresses peuvent-elles vraiment être définies dans une liste?

32

J'ai une machine virtuelle avec l'adresse IP 192.168.0.192 sous PostgreSQL.

Si je précise

listen_addresses = '*'

je peux alors me connecter depuis une autre machine virtuelle à l'adresse 192.168.0.191 et à partir de localhost.

Mais je n'arrive pas à utiliser une liste pour dire à postgreSQL d'utiliser ces deux adresses. Si je modifie listen_addresses en une liste:

listen_addresses = '192.168.0.191, localhost'

alors je ne peux plus me connecter depuis 192.168.0.191.

Je remarque que presque tous les exemples de stackexchange définissent listen_addresses sur '*'. Est-ce parce que le formulaire de liste ne fonctionne pas?

zabouti
la source

Réponses:

45

Oui, listen_addressespeut être défini sur une liste d'adresses sur l'hôte local auquel se lier pour l'écoute.

Dans votre exemple:

listen_addresses = '192.168.0.191, localhost'

Si la machine locale a une adresse IP 192.168.0.192, vous devez spécifier cette adresse IP et non l' 192.168.0.191adresse IP de l' hôte distant . PostgreSQL ne peut pas être lié à l'adresse IP d'un hôte distant.

Vous ne dites pas "qui est autorisé à se connecter", vous dites "sur quelles interfaces PostgreSQL doit-il accepter les connexions". Le bit "qui est autorisé à se connecter" est le suivant et est configuré dans pg_hba.conf.

Alors: essayez '192.168.0.192, localhost'. Ou simplement *, puisque vous voulez probablement écouter sur toutes les interfaces réseau.

Craig Ringer
la source
1
Ça marche. Y a-t-il une différence pratique entre la liste et '*'?
Zabouti
10
@zabouti Bien sûr. Si votre serveur dispose (par exemple) de deux interfaces réseau externes, vous pouvez indiquer à PostgreSQL de ne relier que l’une à l’autre, de sorte qu’il n’est même pas possible d’établir une connexion TCP avec Pg de l’autre. Il s'agit principalement d'un niveau de sécurité supplémentaire pour un système comportant plusieurs interfaces vers différents domaines de sécurité. Très pratique en combinaison avec des VLAN, des commutateurs virtuels, etc. L’utilisation la plus courante consiste à le configurer de localhostsorte que les connexions TCP / IP ne soient pas possibles à partir de toute interface réseau externe, mais uniquement de l’adresse de bouclage.
Craig Ringer
1
@CraigRinger: une très bonne réponse!
Francs
@CraigRinger, vous devriez ajouter ces commentaires à votre réponse. C'est une information très utile.
João Portela
1
Oui, je pense que le commentaire est peut-être même meilleur que la réponse. Rock sur Craig!
Dark Egregious
2

J'ai constaté qu'au lieu de l'utiliser, vous devez le localhostfaire 127.0.0.1si vous spécifiez également d'autres adresses.

Donc, dans mon cas d'écoute sur l'adresse IP de l'hôte Docker ainsi que sur l'hôte local, mais pas sur l'IP externe, cela ne fonctionne pas (la connexion est refusée à l'intérieur de mes conteneurs Docker):

listen_addresses = '172.17.0.1, localhost'

Mais cela fait:

listen_addresses = '172.17.0.1, 127.0.0.1'
VirtualWolf
la source
0

L'entrée 0.0.0.0 permet d'écouter toutes les adresses IPv4 et :: permet d'écouter toutes les adresses IPv6. Si la liste est vide, le serveur n'écoute aucune interface IP, auquel cas seuls des sockets de domaine Unix peuvent être utilisés pour s'y connecter.

Walid Redwan
la source