无法使用 sqlcmd 通过 SSH 隧道访问 SQL 数据库

Posted

技术标签:

【中文标题】无法使用 sqlcmd 通过 SSH 隧道访问 SQL 数据库【英文标题】:Unable to reach SQL database through SSH tunnel using sqlcmd 【发布时间】:2018-04-16 00:22:27 【问题描述】:

我需要通过跳转框 (Azure VM) 从本地计算机连接到 Azure SQL DB。我使用以下命令设置端口转发:

ssh -fN -L 41433:my-db.database.windows.net:1433 me@jump-box

我可以确认隧道已设置,因为在详细模式下我看到了消息

Local connections to LOCALHOST:41433 forwarded to remote address my-db.database.windows.net:1433

现在,当我跑步时

sqlcmd -S 127.0.0.1,41433 -U username -P password -d db 

我收到以下错误消息

Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : [Microsoft][ODBC Driver 13 for SQL Server]
[SQL Server]Cannot open server "127.0.0.1" requested by the login.  The login failed..

我确保/etc/ssh/sshd_configGatewayPorts yesAllowTcpForwarding yes

谁能帮我弄清楚我做错了什么?

【问题讨论】:

【参考方案1】:

Azure SQL 数据库需要知道您的用户名用于哪个数据库实例。这通常使用服务器名称来完成。如果您指定 127.0.0.1 作为服务器名称,Azure 无法知道您的实例。

最好的方法是在登录名中指定实例,例如用户名@my-db.database.windows.net。

sqlcmd -S 127.0.0.1,41433 -U username@yourdb.database.windows.net -P password -d db 

这样,您无需修改​​主机文件,并且可以通过相同的隧道同时连接到多个 Azure SQL 数据库实例。我希望这可以帮助您安全地连接到 Azure SQL 数据库。

【讨论】:

我知道这是 3 年后的事了……我已经完成了上面解释的所有事情。但现在我收到此错误 Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:无法打开登录请求的服务器“my-dev-sqlserver”。不允许 IP 地址为“xxx.xxx.xxx.xxx”的客户端访问服务器。要启用访问,请使用 Windows Azure 管理门户或在 master 数据库上运行 sp_set_firewall_rule 来为此 IP 地址或地址范围创建防火墙规则。此更改最多可能需要五分钟才能生效。 这应该仍然有效,3 年对于一个可靠的答案来说不算什么,即使在 SOF 中也是如此。我假设您的 ssh 隧道正在工作,但您的 Azure SQL 数据库防火墙存在问题。确保您的跳转框公共 IP 地址(评论中的“xxx.xxx.xxx.xxx”部分)在您的 SQL 数据库实例防火墙设置中列入白名单。如果可能的话,您还可以通过暂时允许更广泛的 db 流量来调试其他一切是否正常工作。 其实xxx.xxx.xxx.xxx是我的本地ip而不是跳箱ip:| 这几天我一直在发疯,终于弄明白了。由于这是 google 上的最高结果,因此答案如下:docs.microsoft.com/en-us/azure/azure-sql/database/… 我们正在连接到一个网关,该网关将我们的连接重定向到实际集群。这种重定向发生在我们的 ssh 隧道之外,它将我们的真实 IP 暴露给数据库服务器。最简单的解决方案是将连接策略更改为“代理”。 @Leonardo,谢谢。切换到代理解决了我的问题。【参考方案2】:

Azure 匹配登录过程中发送的服务器名称。因此,您的错误“无法打开登录请求的服务器“127.0.0.1”。”。

要解决此问题,请尝试将 IP 地址为 127.0.0.1 的 Azure 主机名添加到 HOSTS 文件,然后将相同的主机名提供给 sqlcmd,以便驱动程序解析主机名并连接到隧道入口,然后发送相同的主机名主机名,就好像它没有使用隧道一样。

【讨论】:

以上是关于无法使用 sqlcmd 通过 SSH 隧道访问 SQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 JDBC 连接通过 SSH 隧道连接到 Azure DB

mysql 无法连接 SSH 隧道 -> 拒绝访问“无”

无法通过 SSH 隧道克隆 git

通过 ssh 隧道使用套接字进行双向通信

通过 JSch 建立 SSH 隧道

通过 SSH 隧道的 mysqldump