通过隧道连接SQL Server时SSMS出现预登录握手错误求助
针对你遇到的「已成功与服务器建立连接,但在预登录握手期间发生错误。(provider: TCP Provider, error: 0 - 指定的网络名称不再可用。)」问题,结合你的排查背景,可尝试以下针对性解决方案:
验证隧道端口映射与本地端口占用
确认SSH隧道的端口转发规则准确(如本地端口1433映射到数据库服务器的IP+SQL端口),同时检查本地端口是否被其他进程占用:- Windows:执行命令
netstat -ano | findstr :<本地端口号> - Linux/macOS:执行命令
lsof -i :<本地端口号>
若端口被占用,更换未使用的本地端口重新建立隧道。
- Windows:执行命令
禁用TCP Nagle算法
在SSMS连接对话框中,点击「选项」→「连接属性」,勾选「禁用Nagle算法」。该算法会合并小数据包发送,隧道环境下的网络延迟可能导致预登录握手超时。调整SQL Server预登录超时设置
打开SQL Server配置管理器,依次进入「SQL Server网络配置」→「<目标实例名>的TCP/IP」→「属性」→「高级」,将「预登录超时」从默认30秒调整为60秒,适配隧道连接的网络延迟特性。检查本地防火墙规则
确认本地防火墙(如Windows Defender防火墙)未拦截SSMS或本地隧道端口的通信。可临时关闭防火墙测试,若连接恢复正常,添加允许SSMS或指定端口的入站/出站规则。更换隧道工具测试
若使用命令行SSH建立隧道,尝试换用PuTTY、mRemoteNG等可视化工具配置隧道,部分命令行客户端的隐性配置可能导致连接异常。通过ODBC数据源排查细节
创建ODBC数据源指向本地隧道端口,测试连接并查看ODBC日志。ODBC会输出更详细的连接阶段信息,帮助定位预登录握手时的具体故障点。检查跳板机的连接限制
确认跳板机未对目标SQL Server的连接设置速率限制或TCP连接数限制,部分跳板机的防火墙策略可能阻断高频或小数据包的预登录握手请求。
内容的提问来源于stack exchange,提问作者paddy101

