通过SSH隧道的MySQL连接

mad*_*end 24 mysql ssh ssh-tunnel

我在两台服务器AB之间建立了SSH隧道.B有MySQL服务器,这有效:

mysql -h localhost -P 3306 -u user -p
Run Code Online (Sandbox Code Playgroud)

虽然这不是:

mysql -h 127.0.0.1 -P 3306 -u user -p
Run Code Online (Sandbox Code Playgroud)

虽然my.cnf有以下几行:

bind-address        = 127.0.0.1
# Next addr differs slightly, but anyway
bind-address        = 99.99.99.99
Run Code Online (Sandbox Code Playgroud)

现在关于隧道.它连接以下内容:(A) localhost(9989) -> (B) localhost(3306) 但是当(在A上,端口转发)我这样做

mysql -v -h 127.0.0.1 -P 9989 -u user userdb -p
Run Code Online (Sandbox Code Playgroud)

我明白了 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
Run Code Online (Sandbox Code Playgroud)

我明白了 ERROR 1045 (28000): Access denied for user 'user'@'localhost' (using password: YES)

可能是什么原因?我究竟做错了什么?

Ran*_*eed 29

这里有三个问题.

1 - 暂时忘掉SSH隧道

您无法将MySQL绑定到多个特定IP.第一个bind-address子句被第二个子句覆盖(因此被忽略).您的服务器只收听99.99.99.99.

您可以连接-h localhost但不能与之连接的原因-h 127.0.0.1是,在第一种形式中,您实际上并不通过TCP/IP连接,而是通过本地套接字连接.

看看你my.cnfsocket条款.

删除一个冗余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';
Run Code Online (Sandbox Code Playgroud)

('user'LIKE条款之后,如果需要,用实际用户名替换)

MySQL访问控制检查用户名/密码(user)和连接的原点(host)以识别用户.您可能没有创建用户'user'@'localhost'.

注意:此时我的位置无法访问mysql.com,我无法链接到相关的手册页.

  • 本地套接字(又名Unix域套接字http://en.wikipedia.org/wiki/Unix_domain_socket)是IPC的许多可能性之一(进程间通信 - 在同一台机器上运行的两个进程之间的通信路径).它与共享内存相当.使用`mysql -hlocalhost`,客户端使用套接字.`mysql -h127.0.0.1`明确指示客户端使用TCP/IP.本地套接字更有效,因为它们绕过网络层. (3认同)

Mxx*_*Mxx 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.


bor*_*nac 7

逐步SSH隧道

- - 服务器端 - -

在目标机器(可以通过IP或托管的域添加)中,配置文件/etc/mysql/my.cnf包含一行

bind-address    = 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

通过控制台确认

netstat -tapn |  grep mysql
// tcp    0    0 127.0.0.1:3306     0.0.0.0:*    LISTEN      18469/mysqld
Run Code Online (Sandbox Code Playgroud)

这意味着mysql服务器将仅响应来自本地主机的请求

- - 客户端 - -

您有一个使用cygwin,putty或linux_shell登录的帐户(最终是ssh键)

ssh user_name@host_name
Run Code Online (Sandbox Code Playgroud)

创建SSH隧道

ssh -f -N -L 1000:127.0.0.1:3306    user_name@host_name
Run Code Online (Sandbox Code Playgroud)

这意味着ssh会从我键入的计算机上的端口1000(客户端)创建到远程host_name的永久连接:3306...。127.0.0.1表示此处是远程(host_name),因此不应替换为localhost字,因为这将通过IP而不是IP地址在unix(命名)套接字上建立连接...您将得到'ERROR 2002(HY000):无法通过套接字'/var/run/mysql.sock'(2)连接到本地MySQL服务器当尝试共同连接MySQL时

-f =进入后台-N =不执行

两者-f -N都没有-您可以关闭控制台并保持隧道

- - 服务器端 - -

netstat -tapn |  grep ssh
// tcp  0  0  server_ip:22   clint_ip:port  ESTABLISHED 24915/sshd: user_name
Run Code Online (Sandbox Code Playgroud)

这意味着通过shh协议存在永久连接

- - 客户端 - -

mysql -h 127.0.0.1 -P 1000 -u mysql_user -pmysql_pass
Run Code Online (Sandbox Code Playgroud)

现在您的(客户端)mysql客户端已连接到远程mysql服务器...这里127.0.0.1是客户端计算机

对于工作台,heidiSQL相同


如何杀死SSH隧道

ps fax | grep ssh
kill process_id
Run Code Online (Sandbox Code Playgroud)


小智 5

就我而言,SSH 守护程序中的配置阻止了隧道。应启用 AllowTcpForwarding。

AllowTcpForwarding yes
Run Code Online (Sandbox Code Playgroud)