我有:
Windows 10
在端口上运行 MySQL Server 8.0.33 的本地PC33060
。Ubuntu 20.04.6 LTS
在端口上运行 MySQL Server 8.0.33 的远程VPS3306
。
我想在我的 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_config
OpenSSH 服务,并通过以下方式重新启动service ssh restart
。
这是我的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 设置更改为:
显然,港口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
来诊断错误。