我已经设置了两台服务器A和B之间的SSH隧道。 B有MySQL服务器,而这个工作:
mysql -h localhost -P 3306 -u user -p
虽然这并不:
mysql -h 127.0.0.1 -P 3306 -u user -p
虽然my.cnf中有几行:
bind-address = 127.0.0.1
# Next addr differs slightly, but anyway
bind-address = 99.99.99.99
现在关于隧道。 它连接了以下内容: (A) localhost(9989) -> (B) localhost(3306)
但是,当(A上,与转发端口)我做
mysql -v -h 127.0.0.1 -P 9989 -u user userdb -p
我得到ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
当我做
mysql -v -h localhost -P 9989 -u user userdb -p
我得到ERROR 1045 (28000): Access denied for user 'user'@'localhost' (using password: YES)
可能是什么原因? 我究竟做错了什么?
这里有三个问题。
1 - 忘掉SSH隧道现在
你不能绑定的MySQL超过一个特定的IP。 第一bind-address
子句是由第二个覆盖(因此,忽略)。 您的服务器只听99.99.99.99
。
为什么你可以用来连接的原因-h localhost
,但不能与-h 127.0.0.1
是,在第一种形式,你实际上并没有通过TCP / IP连接,而是通过当地的插座。
看在你my.cnf
的socket
条款。
除去一个冗余bind-address
子句。 您可能需要使用bind-address=0.0.0.0
,指示MySQL守护进程监听所有网络接口。
2 - 让我们设置你的SSH隧道
你错误的原因ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
不是很明显我。 我怀疑 SSH隧道实际上是建立了只有在接收到的连接请求(在你的情况,当你运行mysql
客户端)。 因为您的服务器不听127.0.0.1(见前段),该SSH隧道无法建立,连接失败,和你的客户将其解释为网络故障。
3 -为什么mysql -v -h localhost -P 9989 -u user userdb -p
失败
请张贴的输出
[编辑:刚刚添加...OR host LIKE 'localhost'
下面,因为这可能是相关的故障排除]
mysql > SELECT user, host FROM mysql.user WHERE user LIKE 'user' OR host LIKE 'localhost';
(替换'user'
,后LIKE
子句,实际用户名如果必要的话)
MySQL的访问控制检查二者的用户名/密码( user
)与连接(的原点host
)来识别用户。 你可能没有创建一个用户'user'@'localhost'
。
注:mysql.com是从我在这个时候位置不可达,我不能链接到相关的手册页。
我只是遇到了这个非常问题。
在我的情况下,MySQL服务器配置了bind-address: 192.168.4.4
。 我原本设置一个SSH隧道与常提到-L 3306:localhost:3306 user@server
字符串,并从我的电脑连接mysql -h 127.0.0.1
。
这不起作用,因为MySQL不再侦听0.0.0.0或甚至"localhost"
(又名127.0.0.1),只有192.168.4.4
。
正确的通道字符串应该是-L 3306:192.168.4.4:3306 user@server
。 这将告诉端tunnel使用IP MySQL的实际监听连接到MySQL。
STEP-BY-STEP SSH隧道
- - 服务器端 - -
在目标机器(可通过IP来addresed或域托管)有配置文件/etc/mysql/my.cnf具有线
bind-address = 127.0.0.1
与控制台确认
netstat -tapn | grep mysql
// tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 18469/mysqld
这意味着MySQL服务器将从本地主机只响应请求
- - 客户端 - -
你有一个帐户(eventualy一个SSH密钥)使用的cygwin,腻子或linux_shell登录
ssh user_name@host_name
建立SSH隧道
ssh -f -N -L 1000:127.0.0.1:3306 user_name@host_name
这意味着哎SSH创建端口1000的I型(客户端)的机器远程HOST_NAME上的永久连接:3306 .... 127.0.0.1意味着这里的远程(HOST_NAME),不应与本地主机词,因为这将被取代就UNIX(命名)插座没有IP连接...你将得到:/var/run/mysql.sock 'ERROR 2002(HY000)无法通过socket连接到本地MySQL服务器''(2)'当试图共同连接mysql
-f =走在后台-N =没有excution
既-f -N样nohoop的 - 你可以关闭控制台和隧道坚持
- - 服务器端 - -
netstat -tapn | grep ssh
// tcp 0 0 server_ip:22 clint_ip:port ESTABLISHED 24915/sshd: user_name
这意味着有通过SHH协议的永久连接
- - 客户端 - -
mysql -h 127.0.0.1 -P 1000 -u mysql_user -pmysql_pass
现在你(客户端)的MySQL客户端conected到远程MySQL服务器...这里127.0.0.1是客户机
同样的工作台,heidiSQL
怎么杀SSH隧道
ps fax | grep ssh
kill process_id
我也有同样的proble( "Lost connection..."
在Windows上)(同时通过腻子使用ssh隧道)。 我有2个问题在这里:
- 错误的端口使用,要仔细检查您是否正确设置它
- 我忘了让在
Putty: Connection > SSH > Tunnels > Local ports accept connections from other hosts
在我的情况下,在SSH服务的配置挡住隧道。 AllowTcpForwarding值为应该启用。
AllowTcpForwarding yes
工作对我来说一个简单的一步......我会分享这个,所以也许有些人也不能幸免头痛。
我的设置
在我的具体情况,我在Ubuntu上运行的Percona服务器,连接到MySQL工作台(在Windows VM)通过SSH; 服务器在处理查询随地吐痰错误10060前几天运行良好。
什么工作对我来说
我从Acquia.com,在某些情况下,工作台不会接受“127.0.0.1”作为主机的论坛发现,所以你必须将其更改为“localhost”的。 我做了,而且它的工作(奇怪的是,工作台要求的密码再次,即使他们已存储,但仍然工作)。