Navicat 不支持 MongoDB 的内置 SSH 隧道连接,因其 MongoDB 连接界面无 SSH 配置项;必须借助 sshtunnel 工具建立本地动态端口映射,再让 Navicat 连接 127.0.0.1:{server.local_bind_port},同时确保跳板机启用 AllowTcpForwarding 且 MongoDB 绑定正确。
navicat 本身不支持直接用 ssh 隧道连接 mongodb —— 它只在“ssh”选项卡里提供隧道能力,但该功能仅对 mysql/postgresql 等传统 sql 数据库生效;mongodb 连接页面上压根没有 ssh 配置入口。想走 ssh 隧道连 mongodb,必须绕开 navicat 的原生连接逻辑,靠外部工具搭桥。
Navicat 的 MongoDB 连接页没有 SSH 选项
打开 Navicat → “连接” → “MongoDB”,你会发现:只有 Host、Port、Authentication、SSL 等字段,**完全没有 SSH 相关配置项**。这不是版本问题,也不是设置遗漏,而是 Navicat for MongoDB 从设计上就不支持内置 SSH 隧道。官方文档和实测均证实这一点(截至 2026 年最新版 Navicat Premium 17.x)。
常见误操作是以为勾选了“SSH 隧道”就能连 MongoDB —— 实际上那个开关只影响你当前连接类型为 MySQL 或 PostgreSQL 时的行为,切换到 MongoDB 后它自动消失。
必须用 sshtunnel + pymongo 做前置代理
真正可行的做法是:用 sshtunnel 在本地起一个动态端口转发,把远端 MongoDB 的 remote_bind_address(比如 ('127.0.0.1', 27017))映射到本机某个临时端口,再让 Navicat 连这个本地端口。
- 启动
sshtunnel.SSHTunnelForwarder,传入跳板机地址、私钥路径、远端 MongoDB 地址 -
关键点:调用
server.start()后立刻读取server.local_bind_port,这才是真实可用的端口号 - Navicat 中填的 Host 是
127.0.0.1,Port 就是上面拿到的server.local_bind_port - 认证信息(用户名/密码/数据库名)照常填,
authMechanism要匹配服务端,比如阿里云默认用SCRAM-SHA-1
示例片段(非完整脚本,仅示意流程):
from sshtunnel import SSHTunnelForwarder
server = SSHTunnelForwarder(
ssh_address_or_host=('jump-host.example.com', 22),
ssh_username='user',
ssh_pkey='/path/to/id_rsa',
remote_bind_address=('127.0.0.1', 27017)
)
server.start()
print("Local port:", server.local_bind_port) # 输出类似 49152
# 此时 Navicat 连 127.0.0.1:49152 即可跳板机必须开启 TCP 转发且 MongoDB 绑定正确
即使 Python 脚本跑通,Navicat 仍连不上,大概率卡在这两个地方:
- 跳板机的
/etc/ssh/sshd_config中AllowTcpForwarding被设为no—— 必须改为yes并sudo systemctl restart sshd - MongoDB 在跳板机上只监听
127.0.0.1:27017(安全默认),但sshtunnel的remote_bind_address指向的是跳板机自身,所以没问题;但如果 MongoDB 实际监听的是内网 IP(如10.0.1.5:27017),则remote_bind_address必须同步改成该 IP,不能硬写127.0.0.1 - 防火墙(如
ufw或云厂商安全组)需放行跳板机的 SSH 端口(22),但**不需要**放行 MongoDB 端口 —— 因为流量根本不经过外网
别信“HTTP 隧道连 MongoDB”的伪方案
网上有些教程说用 ngrok 或 cpolar 暴露 27017 端口,然后 Navicat 直连公网地址 —— 这要么失败,要么极度危险。
- ngrok/cpolar 默认只转发 HTTP 流量;MongoDB 是二进制 TCP 协议,直接塞进去会触发协议不匹配,连接立即断开
- 真要走公网暴露,必须用
mongo-express这类 Web 代理层,再用 HTTP 隧道暴露它;但此时 Navicat 连的已不是 MongoDB,而是 mongo-express 的 REST 接口,功能大幅受限(不支持聚合管道、事务等) - 直接暴露
27017到公网等于裸奔,哪怕加了密码,也极易被暴力扫描和利用
真正安全又实用的路径只有一条:用 sshtunnel 做本地端口映射,Navicat 连 127.0.0.1:{动态端口}。动态端口这件事最容易被忽略——很多人硬写 27017,结果连的是自己本机可能根本没启的 mongod 实例。


















