求助:通过SSH及私钥远程连接MySQL数据库的问题
我来帮你捋捋这个SSH隧道连接MySQL的事儿,你现在用的命令方向是对的,咱们一步步排查细节,确保能顺利连上:
先确认SSH隧道是否真的建立成功
- 先在你的Fedora笔记本上跑这个命令,看看本地端口有没有被SSH进程监听:
如果输出里能看到netstat -tulpn | grep 3306127.0.0.1:3306(这是最安全的监听方式),说明隧道已经正常起来了;要是没任何输出,那得先解决SSH本身的连接问题。 - 先试试不带隧道参数的基础SSH登录:
ssh -i <你的密钥文件路径> serveruser@服务器IP,看看能不能正常登进CentOS服务器。这里要注意,你的密钥文件权限必须是600,不然SSH会直接拒绝使用它,执行chmod 600 <你的密钥文件路径>就能修正权限。
再检查MySQL端的配置细节
- 你提到已经配置了绑定地址,要确保CentOS上的MySQL配置文件(一般是
/etc/my.cnf或者/etc/my.cnf.d/下的文件)里的bind-address参数:如果MySQL和SSH服务器是同一台机器,设成127.0.0.1就够;如果是另一台内网机器,就设成那台机器的内网IP,或者干脆设成0.0.0.0(允许所有IP访问,生产环境不建议这么干)。改完配置记得重启MySQL服务:systemctl restart mysqld。 - 核对MySQL用户的访问权限:你用来连接的MySQL用户,必须允许从隧道转发的来源访问。比如如果MySQL和SSH服务器是同一台,那用户权限得是
'你的MySQL用户名'@'localhost'或者'你的MySQL用户名'@'%'(后者权限太宽,测试用可以,生产别这么弄)。登录MySQL后执行这个命令查看权限:
要是权限不对,用这条命令调整(记得替换成你的实际信息):SELECT user, host FROM mysql.user;GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的MySQL用户名'@'localhost' IDENTIFIED BY '你的MySQL密码'; FLUSH PRIVILEGES;
本地连接MySQL的正确姿势
当隧道建立成功后,你在Fedora上用MySQL客户端连接时,要连本地的3306端口,而不是远程的MySQL_IP。比如用命令行客户端的话:
mysql -u 你的MySQL用户名 -p -h 127.0.0.1 -P 3306
这里-h 127.0.0.1一定要加,别写成远程的MySQL_IP,因为隧道已经把本地3306的请求转发到远程的<MySQL_IP>:3306了。
几个实用的排查小技巧
- 如果隧道建好了但连不上MySQL,在CentOS服务器上抓包看看有没有数据包过来:
然后本地发起连接,看看有没有数据包到达服务器的3306端口,这样就能判断是隧道转发的问题,还是MySQL本身的配置问题。tcpdump -i any port 3306 - 要是你的Fedora本地已经有MySQL/MariaDB服务占用了3306端口,隧道会启动失败。这时候可以把本地端口改成别的,比如3307:
然后本地连接的时候用ssh -i <你的密钥文件路径> serveruser@服务器IP -L 3307:<MySQL_IP>:3306 -N-P 3307就行。
内容的提问来源于stack exchange,提问作者user1884372




