Navicat 16 Mac版SSH隧道空闲断连,根本原因是未同步配置客户端保活(ServerAliveInterval/ServerAliveCountMax)、服务端AllowTcpForwarding许可及数据库用户授权IP匹配跳板机内网地址,三者缺一不可。

Mac版Navicat 16用SSH隧道连内网数据库时,连接空闲2–3分钟就断开,不是Navicat“卡”,而是SSH隧道被中间设备静默回收了——必须同时配置客户端保活和服务器端转发许可,单靠Navicat的“保持连接间隔”没用。
为什么测试连接能过,但实际操作几分钟就断?
现象是:点【测试连接】弹出“连接成功”,双击进入后查几条数据也正常,但闲置一会儿(尤其在查询窗口写长SQL中途停顿),突然报 Lost connection to MySQL server 或卡在执行状态。这不是Navicat崩溃,而是底层SSH隧道链路已断,但Navicat没及时感知。
根本原因是:云厂商安全组、跳板机iptables或家用路由器会主动清理空闲TCP连接;而Navicat默认只在应用层发心跳(如SELECT 1),不干预SSH通道本身。
- 仅设置Navicat“高级”页的
保持连接间隔(比如60秒)只能维持MySQL协议层连接,对SSH隧道无效 - 未启用SSH层保活时,
ServerAliveInterval不生效,隧道在TCP空闲超时后直接中断 - Mac上Navicat 16使用的是内置SSH客户端,不读取系统
~/.ssh/config,必须在界面内显式配置
Mac版Navicat 16必须填的SSH保活参数
打开连接属性 → 切到【SSH】页 → 确保以下三项全部设实(缺一不可):
- 勾选
使用SSH隧道 -
认证方法选公钥(密码方式不支持保活参数,且安全性低) - 在
私钥路径后,点击右侧…按钮选择.ppk格式密钥(OpenSSH生成的id_rsa需用PuTTYgen转成.ppk,否则Mac版Navicat 16会静默忽略保活)
关键一步:在【SSH】页底部,找到高级区域(需向下滚动),填写:
-
ServerAliveInterval:填30(单位秒,建议30–60,太小增加负载) -
ServerAliveCountMax:填2(连续2次保活无响应才断连,避免误杀)
注意:ServerAliveInterval 是SSH协议层心跳,加密传输,能穿透NAT/防火墙;它和TCP层的TCPKeepAlive不同,后者可能被中间设备丢弃。
跳板机SSH服务端必须允许端口转发
即使Navicat配对了,如果跳板机/etc/ssh/sshd_config里AllowTcpForwarding被设为no,隧道建立会失败或中途断开。检查命令:
sudo grep AllowTcpForwarding /etc/ssh/sshd_config
若输出为AllowTcpForwarding no,需改为yes并重启服务:
sudo sed -i 's/AllowTcpForwarding no/AllowTcpForwarding yes/' /etc/ssh/sshd_config<br>sudo systemctl restart sshd
该配置必须由跳板机管理员操作,Navicat无法绕过。常见于企业云主机默认关闭TCP转发以限制风险。
数据库权限和主机名必须匹配隧道视角
连通后执行SQL报Access denied for user 'xxx'@'10.10.5.100'?说明SSH隧道通了,但MySQL拒绝认证。因为经隧道后,你的请求来源IP是跳板机的内网地址(如10.10.5.100),不是你本地Mac的IP。
- 不要授权
'user'@'localhost'或'user'@'%'——这两者都不匹配隧道流量 - 必须显式创建用户:
CREATE USER 'app'@'10.10.5.100' IDENTIFIED BY 'pwd'; - 再赋权:
GRANT SELECT ON db.* TO 'app'@'10.10.5.100'; FLUSH PRIVILEGES; - 若跳板机IP不固定,授权子网更稳妥:
'app'@'10.10.5.%'
另外,跳板机MySQL若启用了skip-name-resolve,禁止用主机名授权(如'app'@'jump-prod'),DNS解析失败会导致权限匹配失败。
真正稳定的SSH隧道连接,核心不在Navicat界面多点几次,而在于三层对齐:Navicat客户端的ServerAliveInterval参数、跳板机sshd_config的AllowTcpForwarding开关、数据库用户权限绑定的IP地址——这三处任一缺失,都会导致“看似连上,实则脆弱”的假象。


















