PuTTY 反向隧道至 MySQL

PuTTY 反向隧道至 MySQL

我有:

  • Windows 10在端口上运行 MySQL Server 8.0.33 的本地PC 33060
  • Ubuntu 20.04.6 LTS在端口上运行 MySQL Server 8.0.33 的远程VPS 3306

我想在我的 Windows PC 上使用 PuTTY 创建一个反向隧道,以便我的 Ubuntu VPS 能够连接到在端口 33060 上运行的本地 MySQL 实例。

例如,我想通过以下命令连接:

username@localhost:~$ mysql -h localhost -P 33060 -u test -ptest

注意:我已经在 Windows PC 上创建了一个 MySQL 测试用户,其设置如下:

姓名 价值
登录名 测试
身份验证类型 缓存_sha2_密码
限制匹配的主机
密码 测试
账户限制 无限制 - 0/0/0/0
管理角色 全部权限 - 一切都经过检查

然而,尝试连接时会发生这种情况:

username@localhost:~$ mysql -h localhost -P 33060 -u test -ptest
ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: YES)
username@localhost:~$ mysql -h 127.0.0.1 -P 33060 -u test -ptest
ERROR 2007 (HY000): Protocol mismatch; server version = 11, client version = 10

注意:如果有什么不同,AllowTcpForwarding在我的 Ubuntu VPS 上启用了/etc/ssh/sshd_configOpenSSH 服务,并通过以下方式重新启动service ssh restart

这是我的PuTTY配置:

PuTTY 配置

我尝试了各种设置组合,但我的 Ubuntu VPS 无法连接到我的 Windows MySQL 服务器。

值得一提的是,我能够让我的 Ubuntu VPS 成功连接到在 Windows PC 上运行的 PHP 内置 Web 服务器,并且使用基本相同的 PuTTY 设置(只是端口不同):

PS C:\test> php -S localhost:9876
[Tue May 23 23:10:50 2023] PHP 8.0.8 Development Server (http://localhost:9876) started
[Tue May 23 23:11:01 2023] [::1]:64617 Accepted
[Tue May 23 23:11:01 2023] [::1]:64617 [200]: GET /
[Tue May 23 23:11:01 2023] [::1]:64617 Closing
username@localhost:~$ curl localhost:9876
Hello World

但回到 MySQL,这是 PuTTY 的配置问题、Windows 上的 MySQL 服务器的问题,还是其他什么问题?

答案1

最终解决问题的方法是将 PuTTY 设置更改为:

PuTTY 设置

显然,港口33060使用X 协议,不是经典的 MySQL 协议。

从我的测试来看,更改端口似乎会对 Ubuntu MySQL 客户端产生影响(即使 Windows MySQL 服务器端口完全相同并SELECT @@global.protocol_version;显示10)。

更改 PuTTY 设置后,我可以使用以下命令连接到我的 Ubuntu VPS:

mysql -h 127.0.0.1 -P 3307 -u test -ptest

localhost但是,如果用而不是来运行相同的命令,则会127.0.0.1出现Access Denied错误。经过一番挖掘,我发现这个帖子这解释了:

“在 MySQL 中,localhost 关键字保留用于使用 MySQL 套接字的连接,您应该使用 ip 地址 127.0.0.1 来与 127.0.0.1 上的 MySQL 网络端口建立 TCP 连接。”


等效ssh命令(内置于 Windows 并于 2018 年 4 月更新中启用)是:

ssh -R 3307:localhost:33060 username@your_ip -i "C:\path\to\your\id_rsa" -o "StrictHostKeyChecking=no"

要将持久反向隧道创建为 Windows 服务,请参阅这个 autossh 指南

但该指南中也存在一些疏忽和错误。

安装时cygwin,您需要安装以下软件包:

  • cygrunsrv
  • openssh
  • autossh

然后允许您的 Windows 帐户作为服务登录:

WinKey + R-> gpedit.msc

计算机配置->Windows 设置->安全设置->本地策略->用户权限分配->作为服务登录->添加您的用户名。

要在实例中测试您的autossh连接cygwin

autossh -M 20000 -R 3307:localhost:33060 username@your_ip -i "C:\path\to\your\id_rsa" -o "StrictHostKeyChecking=no"

如果有效,请以管理员身份打开 PowerShell(重要)并运行:

C:\cygwin64\bin\cygrunsrv.exe -I AutoSSH -p /usr/bin/autossh -a '-M 20000 -R 3307:localhost:33060 username@your_ip -i "C:\\path\\to\\your\\id_rsa" -o "StrictHostKeyChecking=no"' -e AUTOSSH_NTSERVICE=yes

注意双反斜杠。

稍后,如果服务没有启动并且您需要重试,请在管理 PowerShell 中运行此命令来删除该服务:

sc.exe delete AutoSSH

cygwin可以找到 AutoSSH 登录/var/log/AutoSSH.log来诊断错误。

相关内容