真的可以将listen_addresses设置为列表吗?


32

我有一个IP地址为192.168.0.192的VM,运行的是postgreSQL。

如果我指定

listen_addresses = '*'

然后我可以从另一个位于192.168.0.191的虚拟机和本地主机进行连接。

但是我似乎无法使用列表来告诉 postgreSQL使用这两个地址。如果我将listen_addresses更改为列表:

listen_addresses = '192.168.0.191, localhost'

那么我将无法从192.168.0.191连接。

我注意到stackexchange上的几乎所有示例都将listen_addresses设置为“ *”。这是因为列表形式不起作用吗?

Answers:


45

是的,listen_addresses可以设置为绑定到本地主机上的地址列表以进行侦听。

在您的示例中:

listen_addresses ='192.168.0.191,本地主机'

如果本地计算机具有IP 192.168.0.192,则应指定该IP,而不是远程主机192.168.0.191IP。PostgreSQL无法绑定到远程主机的IP地址。

您不是在说“允许谁连接”,而是在说“ PostgreSQL应该在哪些接口上接受连接”。接下来是“允许连接的人”位,并在中配置pg_hba.conf

因此:尝试'192.168.0.192, localhost'。或者只是*,因为您实际上可能想在所有网络接口上进行监听。


1
有用。那么列表和“ *”之间有什么实际区别吗?
zabouti

10
@zabouti当然。如果您的服务器具有(例如)两个外部网络接口,则可以告诉PostgreSQL仅在其中一个上进行绑定,因此甚至不可能在另一个接口上与Pg建立TCP连接。对于具有多个连接到不同安全域的接口的系统,这主要是额外的安全级别。与VLAN,虚拟交换机等结合使用时非常方便。最常见的用途是将其设置为,localhost从而无法从任何外部网络接口(仅回环地址)进行TCP / IP连接。
Craig Ringer

1
@CraigRinger:一个很好的答案!
法郎2014年

@CraigRinger,您应该将这些评论添加到您的答案中。那是非常有用的信息。
若昂里斯本

1
是的,我认为评论可能比答案还要好。摇滚克雷格!
Darth Egregious 2015年

2

我发现,如果您还要指定其他地址,则不必使用localhost127.0.0.1

因此,在我侦听Docker主机IP地址以及localhost而不是外部IP的情况下,这是行不通的(我从Docker容器内部拒绝了连接):

listen_addresses = '172.17.0.1, localhost'

但这确实是:

listen_addresses = '172.17.0.1, 127.0.0.1'

0

条目0.0.0.0允许侦听所有IPv4地址,::允许侦听所有IPv6地址。如果列表为空,则服务器根本不监听任何IP接口,在这种情况下,只能使用Unix域套接字连接。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.