Os listen_addresses podem realmente ser definidos como uma lista?

32

Eu tenho uma VM com endereço IP 192.168.0.192 executando o postgreSQL.

Se eu especificar

listen_addresses = '*'

então eu posso conectar de outra VM em 192.168.0.191 e do localhost.

Mas não consigo usar uma lista para dizer ao postgreSQL para usar esses dois endereços. Se eu alterar os listen_addresses para uma lista:

listen_addresses = '192.168.0.191, localhost'

não consigo mais conectar a partir do 192.168.0.191.

Percebo que quase todos os exemplos no stackexchange configuram listen_addresses como '*'. Isso ocorre porque o formulário da lista não funciona?

zabouti
fonte

Respostas:

45

Sim, listen_addressespode ser definido como uma lista de endereços no host local ao qual vincular para escuta.

No seu exemplo:

listen_addresses = '192.168.0.191, localhost'

Se a máquina local tiver IP 192.168.0.192, você deve especificar esse IP, não o 192.168.0.191IP do host remoto . O PostgreSQL não pode se conectar ao endereço IP de um host remoto.

Você não está dizendo "quem tem permissão para se conectar", mas "em quais interfaces o PostgreSQL deve aceitar conexões". O bit "quem tem permissão para se conectar" é o próximo e está configurado em pg_hba.conf.

Então: tente '192.168.0.192, localhost'. Ou apenas *, já que você provavelmente deseja ouvir em todas as interfaces de rede.

Craig Ringer
fonte
1
Funciona. Existe alguma diferença prática entre a lista e '*'?
precisa saber é
10
@zabouti Claro. Se o seu servidor possui (digamos) duas interfaces de rede externas, você pode dizer ao PostgreSQL para vincular apenas uma delas, portanto, nem é possível fazer uma conexão TCP à Pg na outra. É principalmente um nível extra de segurança para um sistema que possui várias interfaces para diferentes domínios de segurança. Bastante útil em combinação com VLANs, comutadores virtuais etc. O uso mais comum é configurá-lo para localhostque as conexões TCP / IP não sejam possíveis a partir de nenhuma interface de rede externa, apenas o endereço de loopback.
Craig Ringer
1
@ CraigRinger: uma resposta muito boa!
francs
@ CraigRinger, você deve adicionar esses comentários à sua resposta. Essa é uma informação muito útil.
João Portela
1
Sim, acho que o comentário pode ser ainda melhor do que a resposta. Rock em Craig!
Darth Egregious #
2

Descobri que, em vez de usá- localhostlo, precisa estar 127.0.0.1se você estiver especificando outros endereços também.

Portanto, no meu caso de escuta no endereço IP do host do Docker e no host local, mas não no IP externo, isso não funciona (recebo uma conexão recusada de dentro dos meus contêineres do Docker):

listen_addresses = '172.17.0.1, localhost'

Mas isso faz:

listen_addresses = '172.17.0.1, 127.0.0.1'
VirtualWolf
fonte
0

A entrada 0.0.0.0 permite escutar todos os endereços IPv4 e :: permite escutar todos os endereços IPv6. Se a lista estiver vazia, o servidor não escutará nenhuma interface IP; nesse caso, apenas os soquetes do domínio Unix poderão ser usados ​​para conectar-se a ela.

walid redwan
fonte