MySQL 通过 SSH 隧道连接 - 如何指定其他 MySQL 服务器?

Posted

技术标签:

【中文标题】MySQL 通过 SSH 隧道连接 - 如何指定其他 MySQL 服务器?【英文标题】:MySQL connection over SSH tunnel - how to specify other MySQL server? 【发布时间】:2013-08-24 18:22:54 【问题描述】:

我有大约 50 个数据库都设置在不同的主机名上,要求我通过 SSH 隧道连接到它们。

例如:

SSH 主机ssh.example.com

mysql 主机mysql1.example.com

我已经设法使用 autossh(运行 Debian 的网络服务器)创建了隧道,但我似乎无法弄清楚如何连接到 SSH 隧道“之外”的特定 MySQL 主机名。

输入 lsof -i -n | egrep '\<ssh\>' 确认隧道正在工作(将端口 3307 发送到 ssh.example.com 端口 3306)

所以当我尝试mysql -h 127.0.0.1 -P 3307 时,我得到连接被拒绝。不太奇怪,因为它不是 MySQL 服务器。

我的问题给你们:

如何在创建 SSH 隧道后指定 mysql1.example.com 主机?我试过到处搜索,但似乎无法弄清楚。

【问题讨论】:

我不熟悉“autossh”,但如果你有一个正在使用的 ssh 隧道,我会说只需将 127.0.0.1 替换为实际目标? @Nanne,感谢您的评论。但是触发隧道需要 127.0.0.1,否则它只会尝试直接连接到远程主机。 【参考方案1】:

解决了!问题是在创建隧道本身时连接到正确的服务器 - 应该已经看到了。

ssh -f user@ssh.example.com -L 3307:mysql1.example.com:3306 -N

然后mysql -h 127.0.0.1 -P 3307 按预期工作。 :)

【讨论】:

-N 选项有什么用? @abbood -N 选项是只创建隧道,之后仅此而已。 更具体地说,需要指定mysql服务器绑定的地址。在 my.cnf 文件中查找绑定地址。这就是两个冒号分隔符之间的内容。 请注意:在mysql 命令中使用127.0.0.1 很重要,因为如果您使用localhostP 参数将被忽略。我花了一些时间才弄清楚这一点。 谢谢!我看到的所有文档都让我觉得你不能,而且 Mysql Workbench 没有使用这样的 ssh 隧道。你(几乎)救了我的命【参考方案2】:

我有一篇关于如何使用 SSH 隧道连接到 MySQL 的不错的博客。很好解释here。

连接SSH隧道的命令:

ssh -L [listening port]:[REMOTE_MYSQL_HOST]:[REMOTE_MYSQL_PORT] [SSH_USER]@[SSH_HOST]

连接 MySQL 的命令:

localhost:[listening port]

【讨论】:

这是一个死链接 必须在-L之前添加-N参数【参考方案3】:

当您无法直接访问mysql-server 时,您可以使用jump-server

从您的机器上,您连接 (ssh) 到 jump-server,然后从那里连接到您的 mysql-server

这可以通过使用ssh- tunneling来避免。

假设你的

       jump server is `jump-ip`
       mysql server is `mysql-ip`
       your machine is `machine-ip`

只需打开 ssh 客户端(windows 中的 putty 或 linux/ios 中的终端)。

类型:

    ssh -L [local-port]:[mysql-ip]:[mysql-port] [jump-server-user]@[jump-ip]

之后,您可以使用您的localhostlocal-port 直接访问远程机器上的mysql-server。

例如。在这种情况下,您访问 mysql 数据库的 Jdbc url 将是

jdbc:mysql://localhost:[local-port]/[database-name]

对于 Windows 用户,使用 Putty 通过隧道连接到远程 MySQL 服务器

第 1 步:在会话选项卡中输入您的 Jump 服务器主机/IP

步骤 2:转到SSH 选项卡--> Tunnels:输入您的 MySQL 服务器主机名:端口作为目标,源端口作为您要通过该服务建立隧道的本地端口,然后单击 Add

第 3 步:返回会话选项卡并单击 Open 并输入您的凭据,如果它是基于用户名/密码的。

并使用与上述相同的凭据:

jdbc:mysql://localhost:[local-port]/[database-name]

【讨论】:

【参考方案4】:

我使用这个命令创建了一个到数据库的隧道

ssh  -L 10000:localhost:3306  user@<ip addess to connect DB> -N -f

-L 是本地主机端口它是用户定义你可以提供任何端口号

介于 0 到 65535 之间。保留 0 到 1023。

您是否应该使用基于密钥的服务器身份验证

像这样提及密钥。

ssh -i <path of the private key>  -L 10000:localhost:3306  user@<ip addess to connect DB> -N -f

【讨论】:

以上是关于MySQL 通过 SSH 隧道连接 - 如何指定其他 MySQL 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

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

通过 ssh 迁移工作台 - 如何设置隧道

通过 SSH 隧道的 MySQL 连接

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

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

EXCEL的VBA通过SSH连接MYSQL