通过服务器B构建SSH隧道,实现C连接A的MySQL服务
正确配置C连接A的MySQL的SSH隧道方案
你的场景核心是通过B作为中转节点打通C到A的MySQL连接,之前的隧道方向搞反了,我给你梳理下两步走的具体配置:
步骤1:在A上建立到B的反向端口转发
我们需要把A的MySQL 3306端口映射到B的一个空闲端口(比如选3337,避免和B上可能存在的服务冲突),并且允许C能访问B的这个端口。
在A上执行以下SSH命令:
ssh -R 0.0.0.0:3337:localhost:3306 b-user@B的IP地址
-R:表示反向端口转发,把本地(A)的localhost:3306映射到远程(B)的0.0.0.0:33370.0.0.0:让B的3337端口监听所有网卡,这样C才能从外部访问这个端口(默认只监听localhost,C连不上)
关键配置检查(在B上操作)
为了让B允许外部访问这个转发的端口,需要修改B的SSH服务配置:
- 编辑
/etc/ssh/sshd_config文件,找到GatewayPorts选项,改成:
GatewayPorts yes
- 重启B的SSH服务生效:
# 针对systemd系统(如Ubuntu、CentOS 7+) systemctl restart sshd # 针对SysVinit系统 service ssh restart
- 开放B的防火墙3337端口:
# 用ufw的Ubuntu/Debian ufw allow 3337/tcp ufw reload # 用firewalld的CentOS/RHEL firewall-cmd --add-port=3337/tcp --permanent firewall-cmd --reload
步骤2:在C上连接A的MySQL
现在C只需要连接B的3337端口,就等于直接访问A的3306端口了。在C上执行MySQL客户端命令:
mysql -h B的IP地址 -P 3337 -u 你的MySQL用户名 -p
输入MySQL密码后就能正常连接A上的数据库了。
补充说明
- 如果需要长期保持这个隧道连接,可以搭配
autossh工具,避免SSH连接断开后隧道失效。 - 确保A的MySQL配置允许localhost转发的请求(默认MySQL的
bind-address设为127.0.0.1也能支持这种隧道访问)。
内容的提问来源于stack exchange,提问作者Sim Sca
相关产品推荐
相关产品推荐

