通过 SSH 隧道访问 SQL Server

Posted

技术标签:

【中文标题】通过 SSH 隧道访问 SQL Server【英文标题】:Accessing SQL Server over an SSH tunnel 【发布时间】:2011-10-18 10:21:55 【问题描述】:

在我的开发车间,我们将代码部署在远程网络上的虚拟服务器上。

我们首先打开与网关服务器的 SSH 连接,然后通过本地端口对 RDP 进行 SSH 隧道连接,从而访问该网络上的机器。

我非常希望能够以相同的方式本地访问在这些服务器上运行的 SQL Server 实例。

我设置了一个本地端口 (3398) 以重定向到远程实例上的 SQL Server 端口 (L3398 -> remote.machine.com:1433)。

然后我可以通过 telnet 到 localhost 3398 来实际测试连接,我得到了一个连接:屏幕变清了,我可以在一些监听过程中输入字符。

但是当我尝试将 SSMS 连接到 localhost:3398 时,它会超时,然后声称该端口上没有 SQL Server 侦听:

Cannot connect to localhost:3398

Additional information:
A network-related or instance-specific error occurred while establishing a connection 
to SQL Server. The server was not found or was not accessible. Verify that the
instance name is correct and that SQL Server is configured to allow remote
connections. (...)

我确信服务器接受远程连接,因为我在通过 RDP 登录到远程网络中的另一台计算机时已远程连接到它。

我在 Google 上搜索过,知道这是可能的;有谁知道为什么这不起作用,或者我可以做些什么来诊断并希望解决问题?

谢谢!

【问题讨论】:

我假设你在哪里输入 3393 你的意思是 3398?我尝试对其进行编辑,但只有 2 个字符的拼写错误,要提交编辑,您必须进行至少 8 个字符的更改。不过,我很确定 OP 可以进行小的编辑。 将所有 3393 更新为 3398。 【参考方案1】:

而不是连接到 localhost:3398 使用 127.0.0.1,3398

【讨论】:

localhost,3398 也可以。重要的是端口和主机用逗号分隔,而不是冒号。 localhost 对我不起作用,但 127.0.0.1 很好。这应该是公认的答案。 只是补充一点:localhost 可能会解析为 IPv6 ::1,具体取决于您的网络设置等。默认 IPv6 支持取决于您的 mysql 版本:来自 MySQL 5.6 文档(dev.mysql.com/doc/refman/5.6/en/ipv6-support.html): “从 MySQL 5.6.6 开始,默认 MySQL 服务器配置除了允许 IPv4 连接外,还允许 IPv6 连接。在 5.6.6 之前,默认只允许 IPv4 连接。” 谢谢!刚刚完成了 2 小时的搜索来修复。【参考方案2】:

对于身份验证类型Azure Active Directory - Universal with MFA(多因素身份验证),除了正确指定端口(@98​​7654322@)外,我还必须将主机指向localhost

在 Windows 上,我必须编辑我的 hosts 文件以包含服务器主机:

127.0.0.1    server.example.com

然后,在 SSMS 中,我可以连接到 server.example.com,3398,这将正确执行 MFA。

我也可以在更高的 DNS 级别执行此重定向。

【讨论】:

我意识到这个问题已经接受了 8 年的答案,我不打算改变它。但是,此答案可以帮助遇到与 MFA 相同的问题的任何人。【参考方案3】:

问题可能是 SSMS 正在尝试访问 SQL Server Browser 服务,即 UDP 端口 1434。请查看http://technet.microsoft.com/en-us/library/cc646023.aspx,了解您可能需要转发以使其正常工作的其他端口的概述。

【讨论】:

The SQL Server Browser service listens for incoming connections to a named instance and provides the client the TCP port number that corresponds to that named instance. Normally the SQL Server Browser service is started whenever named instances of the Database Engine are used. The SQL Server Browser service does not have to be started if the client is configured to connect to the specific port of the named instance. 听起来这是一个“查找”服务,以防多个端口上运行多个实例。我只有一个实例在默认端口 1433 上运行。 嗯,没错,但是您是否配置了 SSMS 以连接到命名实例的特定端口?默认情况下,SSMS 将尝试浏览:我不确定是否有一种干净的方法可以禁用该行为。 在“服务器名称:”字段中,我指定了“localhost:3398”。由于我的本地端口 3398 映射到远程计算机上的端口 1433,所以 应该 构成指定远程实例的端口,对吧?无论如何,我不认为 SQL Server Browser 服务正在远程机器上运行。 指定端口号,格式为“hostname,portnum”。也就是说,用逗号分隔它们;你用了一个冒号。 知道这一点很有帮助(愚蠢的微软!)。可悲的是,它并没有解决我的问题。我很确定这是某种网络问题。【参考方案4】:

我很确定我确实找到了答案。

在远程网络(我们无法控制)上,出于安全考虑,数据库服务器似乎设置为忽略来自网关计算机的数据库请求。所以我想除了说服他们给我们完整的 *** 访问权限之外,没有什么好的解决方案。感谢大家的帮助。

【讨论】:

以上是关于通过 SSH 隧道访问 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

通过 SSH 隧道访问端点

原创Linux基础之SSH隧道/端口转发

SSH 通过隧道访问远程客户端

通过 SSH 隧道的 mySQL 连接字符串,无需密码

通过 SSH 隧道访问 Ezproxy

通过ssh隧道访问mysql时如何配置mybatis属性