SSH隧道配置中,主机必须填跳板机IP(如10.19.37.240),而非数据库IP;常规标签页才填内网数据库真实地址(如10.19.37.100)和端口,且该地址须能被跳板机直接访问。

填SSH隧道参数时,主机必须填跳板机IP,不是数据库IP
很多人卡在第一步:新建连接 → 选 PostgreSQL → 切到 SSH 标签页,把内网数据库的 10.19.37.100 直接填进“主机”框。这是错的。SSH 隧道是分两跳的:本地 → 跳板机 → 数据库,Navicat 的 SSH 标签页只管第一跳。这里填的必须是跳板机的固定 IP(比如 10.19.37.240),端口填跳板机开放的 SSH 端口(默认 22),用户名和认证方式也全是对跳板机的。
容易踩的坑:
- 跳板机没开
AllowTcpForwarding yes(/etc/ssh/sshd_config),会导致隧道建立后无法转发流量 - 用密码登录跳板机时,勾了“保存密码”但 Navicat 17 某些绿色版会静默忽略,建议优先配 SSH 密钥
- 私钥格式必须是 OpenSSH(
-----BEGIN OPENSSH PRIVATE KEY-----),PuTTY 的.ppk会报错Invalid private key format
常规标签页里填的是内网数据库真实地址,不是 localhost
切回“常规”标签页,这里的 主机 填的是 PostgreSQL 实例在内网中的真实地址,比如 10.19.37.100 或 pg-prod.internal;端口 填 PostgreSQL 实际监听的端口(PostgreSQL 16 默认仍是 5432,除非改过);用户名 和 密码 是数据库账号,不是跳板机账号。
关键点:
- 这个地址必须能被跳板机直接访问——你得先 ssh 到跳板机,然后
psql -h 10.19.37.100 -U user -d dbname能通,Navicat 才可能通 - 不要填
localhost或127.0.0.1,那是指跳板机本机,不是你的目标数据库 - 如果 PostgreSQL 16 启用了
password_encryption = 'scram-sha-256'(默认),而 Navicat 17 旧 build 不支持,会报authentication failed: password authentication failed for user,需升级到 17.0.12+ 或临时改数据库配置
连接超时或拒绝时,优先验证 SSH 隧道是否真通
Navicat 报 Connection refused 或 Operation timed out,别急着重配界面参数。先手动建一条等效隧道确认链路:
ssh -L 5433:10.19.37.100:5432 user@10.19.37.240 -N
然后在本地用命令行连:
psql -h 127.0.0.1 -p 5433 -U your_db_user -d your_db_name
如果这条能通,说明网络、权限、认证都没问题,Navicat 配置一定有细节偏差;如果这条也不通,问题出在跳板机防火墙、PostgreSQL 的 pg_hba.conf(是否允许从跳板机 IP 访问)、或 SELinux/AppArmor 限制了端口转发。
常见干扰项:
- PostgreSQL 16 的
listen_addresses必须包含跳板机所在网段,不能只写localhost - 跳板机上运行
netstat -tuln | grep :22确认 SSH 服务确实在监听,且没被 fail2ban 封掉 IP - Navicat 17 在 macOS 上若启用了 Gatekeeper,首次运行可能静默阻止 SSH 进程启动,需去“系统设置 → 隐私与安全性”手动允许
字符集与 SSL 设置要匹配 PostgreSQL 16 实际配置
PostgreSQL 16 默认启用 ssl = on,但 Navicat 的 SSH 隧道本身已加密,再叠加 SSL 属于冗余且大概率失败。除非你明确在 PostgreSQL 侧强制要求 SSL(hostssl 规则),否则常规标签页里**不要勾选“使用SSL”**。
字符集方面,PostgreSQL 16 多数用 UTF8,Navicat 17 默认自动检测,但若遇到中文乱码或 invalid byte sequence 错误,手动在“高级”标签页把 字符集 设为 utf8(不是 utf8mb4,那是 MySQL 的)。
额外提醒:
- Navicat 17 连 PostgreSQL 16 时,若数据库启用了
row_security = on(行级安全策略),某些视图或表可能查不到数据,但连接本身不报错,容易误判为连通 - 跳板机若限制了并发 SSH 会话数(
MaxSessions),多人共用时可能触发session is down,需协调调高或分配独立账号


















