通过Workbench可访问MySQL,但VB.NET经SSL隧道连接失败求助
VB.NET SSH隧道连接MySQL失败排查方案
问题概述
使用与Workbench完全一致的SSH(主机名、用户名、密码)及MySQL(主机名、端口、用户名、密码)连接信息,Workbench可正常访问外部MySQL服务器,但VB.NET代码连接时持续抛出权限拒绝错误:
MySql.Data.MySqlClient.MySqlException: 'Authentication to host 'localhost' for user 'myuser' using method 'mysql_native_password' failed with message: Access denied for user 'myuser'@'localhost' (using password: YES)'
或
MySqlConnector.MySqlException: Access denied for user 'myuser'@'localhost' (using password: YES)
已尝试MySql.Data.MySqlClient、MySqlConnector两个库,以及多种隧道端口配置和连接字符串写法,均未解决问题。
排查步骤与解决方案
1. 修正SSH隧道的目标MySQL地址
Workbench的SSH隧道配置中,MySQL主机名可能并非127.0.0.1——部分远程服务器的MySQL绑定内网IP而非回环地址,或需指定实际主机标识:
- 打开Workbench连接设置,查看
MySQL Hostname字段值(例如可能是远程服务器的内网IP192.168.1.100) - 调整VB.NET中的隧道目标地址,示例:
' 将原目标地址127.0.0.1替换为Workbench中配置的MySQL Hostname portFwld = New ForwardedPortLocal("127.0.0.1", 0, "192.168.1.100", 3306)
2. 验证MySQL用户的权限范围
MySQL权限基于用户名@来源IP规则,myuser@localhost与myuser@%是独立权限条目:
- 通过Workbench或远程SSH登录MySQL,执行以下命令查看用户权限:
SELECT user, host FROM mysql.user WHERE user = 'MyUserDB'; - 如果用户的
host仅为localhost,需确保隧道转发后的连接对MySQL来说属于本地来源;若权限不足,执行:
(生产环境建议最小权限,避免使用-- 授予本地访问权限 GRANT ALL PRIVILEGES ON MyDB.* TO 'MyUserDB'@'localhost'; FLUSH PRIVILEGES;%通配符)
3. 优化MySQL连接字符串细节
- 强制使用TCP连接:将
Data Source=localhost改为Data Source=127.0.0.1,避免MySQL优先使用socket/命名管道连接 - 明确指定SSL模式:根据服务器配置添加
SslMode=None或SslMode=Required - 动态端口验证:输出
portFwld.BoundPort确认端口正确,示例连接字符串:.ConnectionString = $"port={portFwld.BoundPort};Database=MyDB;Data Source=127.0.0.1;User Id=MyUserDB;Password=MyPassword;SslMode=None" - 检查用户名/密码大小写:Linux环境下MySQL用户名、密码可能区分大小写
4. 确认SSH隧道状态
- 在代码中添加状态校验:
client.Connect() If Not client.IsConnected Then MsgBox("SSH连接失败") Return End If portFwld.Start() If Not portFwld.IsStarted Then MsgBox("隧道端口启动失败") Return End If Debug.WriteLine($"绑定端口:{portFwld.BoundPort}") - 用工具测试本地端口连通性:
若无法连接,检查SSH用户名、密码、端口是否正确,以及远程服务器是否允许SSH连接。Test-NetConnection 127.0.0.1 -Port [输出的绑定端口号]
内容的提问来源于stack exchange,提问作者ElSherpa
相关产品推荐
相关产品推荐

