我有一台在 centos 上运行的 pgsql9.4 服务器,它有一个 pg_hba.conf,用于接受来自特定 IP 范围的 md5 连接。删除 IP 后,我的 pg_hba.conf 文件如下所示:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all ident
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local replication postgres peer
#host replication postgres 127.0.0.1/32 ident
#host replication postgres ::1/128 ident
#local #DBNAME# #USERNAME# md5
#host #DBNAME# #USERNAME# ###.###.###.0/24 md5
此配置非常适合 xxx.xx.xx.0 到 xxx.xx.xx.24 范围内的 IP。但是,当我尝试增加它以适应来自更高 IP 号 (112) 的服务器的访问并尝试重新启动 postgres 服务时,服务在重新启动时失败。
我尝试将这个数字从 0/25 逐渐增加到可以运行我们的 Puppet 服务器的数字。
我还尝试添加第二条相同的记录以仅包含 IP 范围 111/112,但无济于事。
有人知道为什么 Postgres 可能认为这些是无效的 pg_hba.conf 吗?
编辑:忘记提及 listen_addresses 设置为 '*',以便可以在 pg_hba.conf 中逐个用户控制访问
答案1
该主机信息是CIDR 表示法,当你使用时,你给出的不是从 0 到 24 的范围,而是从到的172.16.33.0/24
范围(读作172.16.33.1
172.16.33.254
CIDR 块以更好地理解原因)。ipcalc
该工具可以帮助您识别:
$ ipcalc 172.16.33.0/24
Network: 172.16.33.0/24
Address space: Private Use
Address class: Class B
Netmask: 255.255.255.0 = 24
Broadcast: 172.16.33.255
HostMin: 172.16.33.1
HostMax: 172.16.33.254
Hosts/Net: 254
因此,172.16.33.0/24
已经包含了172.16.33.111` and
172.16.33.112 , meaning you don't need to do anything else in
pg_hba.conf but add the line with
172.16.33.0/24`。
答案2
所以看起来好像我误解了 pg_hba.conf 文件的语法。0/24 不是 IP 地址范围。
检查 postgres 日志给了我一条错误消息地址“###.##.##.111/112”中的 CIDR 掩码无效这让我注意到了 CIDR 符号的存在和用法。
我通过为每个想要容纳的 IP 添加记录以及每个 IP 的 /32 来解决了错误
91 host DBNAME USERNAME 172.16.33.111/32 md5
92 host DBNAME USERNAME 172.16.33.112/32 md5
93 host DBNAME USERNAME 172.16.33.0/24 md5
这似乎很有效。现在我只需要复习一下对 pg_hba.conf 中使用的不同符号的理解 :)