我在两台服务器 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)
可能是什么原因?我做错了什么?
答案 0 :(得分:29)
这里有三个问题。
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'
。
N.B。:mysql.com目前无法从我的位置访问,我无法链接到相关的手册页。
答案 1 :(得分:10)
我刚遇到这个问题。
在我的情况下,MySQL服务器配置了bind-address: 192.168.4.4
。
我最初使用常用的-L 3306:localhost:3306 user@server
字符串设置SSH隧道,并从我的计算机连接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
。
这将告诉远程隧道端使用MySQL实际侦听的IP连接到MySQL。
答案 2 :(得分:6)
逐步SSH隧道
---服务器端----
在目标计算机中(可以通过IP或托管的域添加),配置文件 /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服务器将仅响应来自localhost的请求
---客户端----
你有一个帐户(最后是一个ssh-key)来使用cygwin,putty或linux_shell进行记录
ssh user_name@host_name
创建SSH TUNNEL
ssh -f -N -L 1000:127.0.0.1:3306 user_name@host_name
这意味着hey ssh从我键入的机器上的端口1000创建永久连接(客户端)到远程host_name:3306 .... 127.0.0.1在这里表示远程(host_name),不应该用localhost字替换因为这将使unix(命名)socket上的连接不是由IP ...你将得到'ERROR 2002(HY000):无法通过socket'/ var / run / mysql连接到本地MySQL服务器。尝试连接mysql时,sock'(2)'
-f =进入后台 -N =没有执行
-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客户端连接到远程mysql服务器......这里127.0.0.1是客户端机器
同样适用于workbench,heidiSQL
如何杀死ssh隧道
ps fax | grep ssh
kill process_id
答案 3 :(得分:1)
我确实在Windows上遇到了同样的问题("Lost connection..."
)(通过Putty使用ssh隧道)。我在这里遇到了两个问题:
Putty: Connection > SSH > Tunnels > Local ports accept connections from other hosts
答案 4 :(得分:1)
就我而言,SSH守护程序中的配置阻止了隧道。应启用AllowTcpForwarding。
AllowTcpForwarding yes
答案 5 :(得分:0)
一个简单的步骤对我有用......我会分享这个,所以也许你们中的一些人可以免于头痛。
我的设定
在我的特定情况下,我有一个在Ubuntu上运行的Percona服务器,通过SSH连接到MySQL Workbench(在Windows VM中);服务器在处理查询时吐出错误10060之前运行了好几天。
为我工作的是什么
我在Acquia.com的一个论坛中发现,在某些情况下,Workbench不会接受“127.0.0.1'作为主持人,因此您必须将其更改为' localhost'。我做到了,它工作了(奇怪的是,Workbench再次要求输入密码,即使它们已经存储,但仍在工作)。