SSH隧道:本地=>网关=> MySQL服务器
Posted
技术标签:
【中文标题】SSH隧道:本地=>网关=> MySQL服务器【英文标题】:SSH tunnel: local => gateway => MySQL server 【发布时间】:2012-09-11 18:15:52 【问题描述】:我需要访问我实验室远程服务器上的 mysql 数据库。该服务器只有在我登录到远程网络上的网关服务器后才能访问:
local server => gateway server => MySQL server.
我可以使用 24222 端口 ssh 到网关。
我正在使用 PERL DBI 模块。这是我在实验室时用来连接的:
my $host="1.2.3.4";
my $database="dbname";
my $user="user";
my $pw="pass";
my $table="table";
我想我必须建立一条通过网关服务器到数据库服务器的隧道。我该怎么做呢?如果 MySQL 数据库在网关上,我可以像这样打开一个隧道:
$ ssh -f user@gateway -L 3307:127.0.0.1:3306 -N
如何修改它以通过网关上的开放端口 24222 通过隧道连接到 1.2.3.4 上的 MySQL 服务器?
更新:
使用@anttir 的回答我得到了它的工作如下。
设置隧道:
$ ssh -fN -p 24222 user1@11.12.13.14 -L 3307:1.2.3.4:3306
设置脚本变量:
my $host="127.0.0.1";
my $port = 3307;
【问题讨论】:
【参考方案1】:使用命令:
$ ssh -f user@gateway -L 3307:1.2.3.4:3306 -N
这表明所有到客户端 localhost 3307 的连接都将通过 SSH 隧道转发到网关,然后连接到主机 1.2.3.4 到端口 3306。
编辑:如果 SSH 在端口 24222 上,那么
$ ssh -f user@gateway -p 24222 -L 3307:1.2.3.4:3306 -N
【讨论】:
然后使用PERL DBI连接到localhost 3307 请查看更新后的问题。您给我的隧道命令不是将数据库服务器上的端口 3306 映射到网关上的端口 3307 吗?我不需要在某个时候引入我的本地主机吗? 没有。 -L 假定侦听端口在客户端计算机中。然后连接到 localhost,mysql 默认使用 mysql 套接字而不是 IP 到 localhost。使用 -h 127.0.0.1 (或 -h localhost ) -L 3307:1.2.3.4:3306 对应的是-R 3307:1.2.3.4:3306,它在SSH目标计算机中打开一个端口,通过SSH转发并打开一个连接从 SSH 客户端到 1.2.3.4。 SSH 无法在 SSH 目标计算机中打开端口并从那里建立连接。这很有意义,因为它不通过 SSH。您可以使用 tcpforward 或一些 netcats 来完成。【参考方案2】:如果您需要使用多个跃点来访问 MySQL 服务器,我首先建议创建 .ssh/config 文件并像这样使用 ProxyCommand:
Host gateway
HostName example.com
User foo
Port 22
IdentityFile ~/.ssh/id_rsa.pub
Host mysql_access_server
HostName example-web.com
Port 22
User foo
ProxyCommand ssh -A gateway nc %h %p
然后像这样转发端口:
ssh -f mysql_access_server -L 3309:sqlmaster.example.com:3306 -N
然后你可以像这样访问 MySQL 服务器:
mysql --user=root --host=127.0.0.1 --password=root --port=3309 some_db_name
【讨论】:
【参考方案3】:使用隧道:
ssh -f user@gateway -L 3307:1.2.3.4:3306 -N
您将能够连接到本地主机端口 3307 上的数据库
【讨论】:
以上是关于SSH隧道:本地=>网关=> MySQL服务器的主要内容,如果未能解决你的问题,请参考以下文章
无法设置到私有 AWS API 网关 API 的 SSH 隧道
我想简化 SSH 隧道以执行 MySQL 转储并将文件 SCP 到本地计算机