39

I have a VM with IP address 192.168.0.192 running postgreSQL.

If I specify

listen_addresses = '*'

then I can connect from another VM at 192.168.0.191 and from localhost.

But I can't seem to use a list to tell postgreSQL to use those two addresses. If I change listen_addresses to a list:

listen_addresses = '192.168.0.191, localhost'

then I can no longer connect from 192.168.0.191.

I notice that almost all examples on stackexchange set listen_addresses to '*'. Is this because the list form does not work?

0
56

Yes, listen_addresses can be set to a list of addresses on the local host to bind to for listening.

In your example:

listen_addresses = '192.168.0.191, localhost'

If the local machine has IP 192.168.0.192, you should specify that IP, not the remote host 192.168.0.191 IP. PostgreSQL cannot bind to the IP address of a remote host.

You're not saying "who is allowed to connect", you're saying "which interfaces should PostgreSQL accept connections on". The "who's allowed to connect" bit is next, and is configured in pg_hba.conf.

So: Try '192.168.0.192, localhost'. Or just *, since you probably actually want to listen on all network interfaces.

6
  • 1
    It works. So is there any practical difference between the list and '*'? – zabouti Aug 20 '13 at 3:37
  • 12
    @zabouti Sure. If your server has (say) two external network interfaces, you can tell PostgreSQL to only bind on one of them, so it's not even possible to make a TCP connection to Pg on the other. It's mostly an extra level of security for a system that has multiple interfaces to different security domains. Quite handy in combination with VLANs, virtual switches, etc. The most common use is setting it to localhost so that TCP/IP connections are not possible from any external network interface, only the loopback address. – Craig Ringer Aug 20 '13 at 4:03
  • 1
    @CraigRinger: a very good answer! – francs Feb 25 '14 at 5:27
  • @CraigRinger you should add those comments to your answer. That's very useful information. – João Portela Dec 18 '14 at 10:57
  • 1
    Yeah I think the comment might be even better than the answer. Rock on Craig! – Darth Egregious Oct 7 '15 at 18:58
4

I've found that instead of using localhost it needs to be 127.0.0.1 if you're specifying any other addresses as well.

So in my case of listening on the Docker host IP address as well as localhost, but not the external IP, this doesn't work (I get a connection refused from inside my Docker containers):

listen_addresses = '172.17.0.1, localhost'

But this does:

listen_addresses = '172.17.0.1, 127.0.0.1'
1

The entry 0.0.0.0 allows listening for all IPv4 addresses and :: allows listening for all IPv6 addresses. If the list is empty, the server does not listen on any IP interface at all, in which case only Unix-domain sockets can be used to connect to it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.