Navicat连接PostgreSQL时报No pg_hba.conf entry如何解决?

作者:袖梨 2026-07-13
结论是Navicat连接PostgreSQL报“no pg_hba.conf entry”错误,根本原因是pg_hba.conf中无匹配客户端IP、用户、数据库及SSL状态的规则;常见因规则顺序错、IP网段不匹配、未重载配置或listen_addresses未放开所致。

直接说结论:这个错误不是navicat的问题,而是postgresql明确拒绝了你的连接请求——它在pg_hba.conf里没找到匹配你ip、用户、数据库和ssl状态的那一条规则。

为什么改了pg_hba.conf还是报错

常见现象是加了一行host all all 192.168.1.0/24 md5,保存后Navicat仍报FATAL: no pg_hba.conf entry for host "192.168.1.100"。原因往往有这几个:

  • 规则顺序错了:前面有一条hostnosslreject规则提前拦截,后面新增的host根本没机会匹配
  • 客户端实际IP不在你写的网段里:比如笔记本连的是手机热点(172.20.10.0/28),你却填了192.168.1.0/24
  • 用了hostssl但Navicat没开SSL,或开了SSL但服务器没配证书,导致匹配失败
  • 改完文件没重载:用sudo systemctl reload postgresql比重启更轻量,但必须执行;只保存文件不生效

pg_hba.conf该加哪一行才真正起作用

别盲目抄“host all all 0.0.0.0/0 md5”,生产环境极不安全。按实际场景选:

  • 局域网固定网段(推荐):host all all 192.168.1.0/24 md5 —— 先用ipconfigifconfig确认客户端真实网段
  • 单台设备访问:host all all 192.168.1.100/32 md5 —— /32 表示精确匹配一个IP
  • 云数据库强制SSL:hostssl all all 0.0.0.0/0 certhostssl all all 0.0.0.0/0 md5,对应Navicat里SSL Mode选requireverify-full
  • 临时调试可加host all all 127.0.0.1/32 trust验证本机是否通,但别留着

所有规则必须加在# IPv4 local connections:之后、其他host规则之前,避免被上面的localhost规则覆盖。

Navicat连接参数和PostgreSQL配置必须对得上

Navicat里填的每个字段,都得和PostgreSQL当前配置咬合:

  • 主机名:必须填服务器**真实局域网IP**,不是localhost127.0.0.1(除非你在服务端本机连)
  • 端口:默认5432,但若postgresql.conf里改过port = 5433,这里就得同步改
  • 用户名:必须是PostgreSQL里已存在的角色,且该角色没被CREATEROLELOGIN权限限制
  • SSL Mode:如果服务器pg_hba.conf里只有hostssl规则,这里必须选require;若选disable,哪怕IP匹配也会被拒
  • 密码:用md5认证时必须输对;用trust时Navicat里可以不填,但不建议线上用

最常漏掉的三件事

很多人卡在最后一步,其实问题早埋好了:

  • postgresql.conflisten_addresses还是'localhost',没改成'0.0.0.0'或具体网段,导致根本收不到局域网来的包
  • Linux防火墙(ufwfirewalld)或Windows防火墙拦了5432端口,Navicat连不上就超时,不报no pg_hba.conf entry,但容易误判
  • 云服务器(阿里云/腾讯云等)的安全组没开TCP:5432入方向,本地防火墙全放行也没用——安全组才是第一道门

查日志最准:tail -f /var/log/postgresql/postgresql-*.log,里面会明确写“connection rejected by pg_hba.conf”还是“connection timeout”,别光盯着Navicat弹窗。

相关文章

精彩推荐