我的新生产服务器只能通过 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_adress
MySQL)。 - 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 主机名:(当我们在localhost
localhost
上打开隧道时)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 连接。