通过 MySQL Workbench 的 SSH 隧道

通过 MySQL Workbench 的 SSH 隧道

我的新生产服务器只能通过 ssh 双隧道可见。我能到达目标主机通过 Ubuntu 14.04 控制台只需执行命令ssh targetHost,而不是在远程计算机上执行 mysql cli,但我想通过 gui Workbench 访问 MySQL db。如何在Workbench中配置连接来实现呢?

我的.ssh/配置

Host targetHost,  firewallHost
    User username
    IdentityFile /home/michalszulc/.ssh/id_rsa

Host targetHost
    proxycommand ssh -W %h:%p firewallHost

Host firewallHost
    hostname firewallHost.example.com
    port 2201
    passwordauthentication no
    controlmaster auto
    controlpath ~/

Host targetHost
    Hostname 123.123.123.123

答案1

过程很简单。创建新连接并选择连接方法 Standard TCP/IP over SSH。提供隧道的SSH服务器的值:

  • SSH主机名:建立SSH隧道的服务器地址(SSH服务器和MySQL可以是同一主机或同一网络地址,这取决于配置)。
  • SSH 用户名:SSH 服务器中的用户名。
  • SSH 密码:SSH 服务器中的用户密码(如果配置了模式密码验证)。
  • SSH 密钥文件:包含用于在服务器上进行身份验证的私钥的文件(如果您PasswordAuthentication在 SSH 服务器上启用了策略,则其值为no)。

连接 DBMS MySQL 的值。

  • MySQL 主机名:MySQL 运行服务的主机相对于 SSH 服务器的地址。如果 SSH 和 MySQL 服务运行在同一主机上,则东向值为 localhost 或 127.0.0.1,因为一旦建立通过隧道的连接,MySQL 服务就会侦听来自 localhost 的请求(取决于指令中设置的值)bind_adressMySQL)。
  • MySQL Server Port:连接MySQL的端口,一般为3306。
  • MySQL 用户名:连接MySQL 的用户名,即它必须是MySQL 的有效用户并被授权从隧道连接。
  • 默认架构:相当于 SQL USE。

答案2

如果我们的设置正确的话,还不清楚。所以我假设firewallhost主机可以从您的工作台访问。因此需要在此服务器上创建一个开放端口,以便可以访问防火墙后面的“真实”mysql 服务器。

如果您在firewallhost.这是这样完成的firewallhost

ssh -L localhost:33060:localhost:3306 someshelluser@databasehost

这会在端口 33060(或您在此处拥有的任何可用端口)上为 localhost(在任何网卡上都不是公开的)创建一个 openssh 隧道,firewallhost该隧道又通过该隧道与 3306 端口(同样在 localhost 上但在计算机上databasehost)连接,因为它已连接作为 someshelluser 上的databasehost.

现在您可以连接工作台:

  • SSH 主机名:firewallhost
  • SSH 用户名:某个有效用户firewallhost
  • SSH 密码:您某个有效用户的通行证
  • SSH 密钥文件:替代密钥文件

  • MySQL 主机名:(当我们在localhostlocalhost上打开隧道时)firewallhost

  • MySQL服务器端口:33060
  • MySQL用户名:你的mysql用户

要使 ssh 隧道持久存在,您可以使用密钥文件(用于访问)和通过屏幕的分离进程来firewallhost启动它,如下所示。databasehost这可以放入您的 rc.local 或任何您在 上使用的内容firewallhost

screen -d -m /usr/bin/ssh -v -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" -o "BatchMode=yes" -i /your/.ssh/ssh_host_dsa_key -q -L locahost:33060:localhost:3306 someshelluser@databasehost

您必须“想象”这样的 ssh 隧道可以通过在您创建该 ssh 隧道的计算机上打开一个“新”端口,将任何端口流从一台计算机“传输”到另一台计算机(此处firewallhost)。这甚至可以在 的公共网卡上完成firewallhost,但您希望它在本地主机上,因为您不想将您的 mysql 端口暴露给公众;)

更新:

好的,由于您无法直接访问firewallhost创建持久隧道,请尝试其他方法。您说您可以使用 proxycommand 连接。当您内联编写它而不是作为“-o”选项时,我假设您的 ssh_config 中有这个。

如果你的 ssh_config 看起来像这样:

Host server
    Hostname mysqlserver.example.org
    ProxyCommand ssh -W %h:%p firewallhost.example.org

然后你可以尝试以下操作'SSH 主机名' 在工作台中。有机会的话,你可以用它来提供 ssh 参数。我没有测试它,但应用程序将主机名字段的内容直接传递到 ssh 调用中并不罕见。

SSH 主机名:

-o ProxyCommand="ssh -W %h:%p firewallhost.example.org" mysqlserver.example.org

这应该会让你通过你的防火墙主机进入你的mysql服务器。从这里您可以使用 mysql 设置,就好像您将按照工作台的预期直接连接到 mysqlserver 一样。

更新2:

正如您所写,您位于同一台机器(Ubuntu 14)上,能够连接到后面的 mysql 数据库firewallhost,您应该只使用在控制台上使用的工作台中的值。如果您使用 .ssh/config 所用的同一用户调用工作台,则工作台将使用您的 .ssh/config。

最后:

SSH 主机名只是“targetHost”,其中 .ssh/config 中的代理命令将通过“firewallHost”将您传送到“targetHost”。 SSH 用户名是“用户名”(再次来自 .ssh/config)。

MySQL 主机名应该是 localhost 和端口 3306 - 这应该与您在问题中所写的通过 ssh 访问“targetHost”时所做的完全相同。因为工作台将在(!)之后使用这些值,它通过 ssh 连接。

相关内容