VPC Peering下跳板机SSH隧道接入MongoDB Atlas的方法
方案结论
可以通过MongoDB客户端自带的直连参数实现你的访问需求,但不存在Atlas侧需要单独开启的“直连模式”全局开关,仅靠简单端口转发配合原有mongodb+srv连接串无法跑通整个链路
之前配置失效的核心原因
问题根源来自mongodb+srv格式连接串的内置工作机制:
- 客户端拿到srv格式连接串后,会直接在当前运行客户端的本地工作站上发起DNS SRV、TXT记录查询,自动拉取整个副本集所有节点的主机名、端口、连接参数
- 完成解析后,客户端会绕过连接串里最初指定的入口地址,主动直连所有解析到的副本节点完成选主、同步元数据。你只转发单个27017端口的话,其余节点的连接流量根本没有走SSH隧道,自然无法建立有效连接
直连模式的实际逻辑
你提到的直连模式,本质是MongoDB客户端连接串支持的查询参数directConnection=true,不是需要在Atlas控制台手动开启的服务端配置:
- 加上这个参数后,客户端会跳过副本集多节点发现、自动寻址的逻辑,只和连接串中指定的单一主机:端口建立TCP连接,不会主动发起对其他副本节点的连接请求
- 仅加这个参数并不能自动适配隧道场景:如果还保留mongodb+srv格式的连接串,客户端依然会在本地VPC外的网络环境做DNS解析,拿到的节点地址要么是不在访问白名单的公网IP,要么是本地无路由权限的VPC私有域名,流量根本无法送达Atlas
可直接落地的配置步骤
- 在VPC内部的跳板机上执行DNS查询,拉取当前Atlas集群对应的VPC私有端点域名列表,拿到所有副本节点的私有主机名、对应端口(这类域名一般是只有VPC打通peering后,内部网络才能解析的
*.mongodb.net记录)。注意不要把本地工作站能解析到的公网节点域名作为转发目标,否则本地解析后建立的连接会直接走公网,根本不经过跳板机,过不了Atlas的网络访问白名单 - 建立SSH隧道时,把本地的27017端口,通过隧道映射到跳板机上可达的某一个副本节点的私有域名+对应端口,命令示例:
ssh -N -L 27017:atlas-shard-00-00-priv.example.mongodb.net:27017 跳板机用户@跳板机公网IP - 把本地MongoDB客户端的连接串从mongodb+srv格式替换成标准的mongodb://直连格式,不让客户端在本地做srv自动解析,连接串示例:
mongodb://你的Atlas用户名:你的密码@localhost:27017/认证数据库?directConnection=true&authSource=admin
方案注意事项
- 这套配置属于开发场景的临时访问方案,因为直连模式下客户端不会感知副本集的节点变化,一旦你当前转发连接的节点发生故障转移,客户端不会自动切换连接,需要手动调整隧道的目标节点地址
- 不要在生产流量链路中使用这套配置,生产场景如果要给VPC外的开发者开放访问,更推荐在VPC内部署反向代理统一转发Atlas流量,免去开发者手动建隧道、维护直连配置的操作
内容的提问来源于stack exchange,提问作者stimms
相关产品推荐
相关产品推荐

