结论是只改pg_hba.conf不生效,必须同步配置postgresql.conf的listen_addresses、确保规则顺序正确、ADDRESS匹配客户端真实IP、METHOD与客户端SSL模式一致,并重载或重启服务;否则PostgreSQL虽监听到请求却因无匹配规则而拒绝连接。

直接说结论:只改 pg_hba.conf 不生效,必须配合 postgresql.conf 中的 listen_addresses 设置,且规则顺序、认证方式、IP范围写错都会导致连接被拒。
为什么改了 pg_hba.conf 还连不上?
常见现象是 PgAdmin 或客户端报错:FATAL: no pg_hba.conf entry for host "x.x.x.x", user "postgres", database "postgres"。这说明 PostgreSQL 已监听到请求,但没在 pg_hba.conf 里找到匹配规则——不是没读取文件,而是规则不满足。
- 规则按从上到下顺序匹配,**第一条命中即终止**,后面再精确也无效
-
ADDRESS字段必须和客户端真实出口 IP 一致(注意 NAT、代理、云厂商安全组后的真实源 IP) - IPv4 和 IPv6 规则分开写,
0.0.0.0/0不覆盖::/0 - 若用户没设密码或密码过期,
md5或scram-sha-256认证会静默失败
pg_hba.conf 添加远程规则的写法要点
核心是写对这五个字段:TYPE DATABASE USER ADDRESS METHOD。生产环境别抄“允许所有”这种危险模板。
- 只允某个固定 IP:
host all all 192.168.1.100/32 scram-sha-256 - 允内网网段(推荐):
host all all 192.168.1.0/24 scram-sha-256 - 允 IPv6 网段:
host all all ::1/128 scram-sha-256(本地)或host all all 2001:db8::/64 scram-sha-256 - 避免用
trust,除非是完全隔离的测试环境;md5在 PG 10+ 已不推荐,优先用scram-sha-256 - 加在文件末尾不一定生效——确认它没被前面的
reject或更宽泛的host all all 0.0.0.0/0 reject挡住
改完要不要重启服务?
不需要重启 PostgreSQL 进程,执行重载即可,但必须由数据库超级用户触发:
- 命令行重载:
pg_ctl reload -D /var/lib/postgresql/16/main(Linux 路径需按实际调整) - SQL 内重载:
SELECT pg_reload_conf();(需以postgres用户登录) - 宝塔面板用户:在“软件商店 → PostgreSQL → 设置 → 重启”按钮本质也是调用
systemctl restart postgresql,虽稍重但最稳妥 - 重载失败时检查日志:
tail -n 20 /var/log/postgresql/postgresql-16-main.log,常见报错如语法错误、路径不存在、权限不足
最容易被忽略的是:改完 pg_hba.conf 后,忘了检查 postgresql.conf 里的 listen_addresses 是否真在监听对应网卡,也忘了开系统防火墙或云平台安全组的 5432 端口——这两步缺一不可,否则连接请求根本到不了 PostgreSQL 进程。

















