通过SSH隧道经跳板机访问私有子网EC2上的MySQL失败求助
问题:通过SSH隧道访问私有子网EC2上的MySQL失败
环境配置
- 私有子网内的EC2实例,部署MySQL数据库
- 公有子网内的EC2实例,作为跳板机(bastion/jump host)
已成功通过跳板机SSH登录到私有子网EC2,但无法通过SSH隧道让本地工具(TablePlus、Tableau等)访问私有实例上的MySQL。
使用的SSH隧道命令
ssh -A ubuntu@ec2-xxx-xxx-xxx-xxx.us-west-2.compute.amazonaws.com -L 3307:ubuntu@xxx.xxx.xxx.xxx:3306 -N -f -v
本地测试结果
➜ ~ lsof -i4 -P | grep -i "listen" | grep 3307 ssh 95829 wild 8u IPv4 0x35f42fb5d0e0a22b 0t0 TCP localhost:3307 (LISTEN) ➜ ~ nc -zv 127.0.0.1 3307 Connection to 127.0.0.1 port 3307 [tcp/opsession-prxy] succeeded! ➜ ~ mysql -h 127.0.0.1 -P 3307 -u my-username -p ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
服务器端SSH调试日志
debug1: Connection to port 3307 forwarding to ubuntu@xxx.xxx.xxx.xxx port 3306 requested. debug1: channel 2: new [direct-tcpip] channel 2: open failed: connect failed: Name or service not known debug1: channel 2: free: direct-tcpip: listening port 3307 for ubuntu@xxx.xxx.xxx.xxx port 3306, connect from 127.0.0.1 port 59686 to 127.0.0.1 port 3307, nchannels 3
解决方案
1. 修正SSH隧道命令的目标地址格式
-L参数的正确格式是本地端口:目标主机IP:目标端口,不需要附加用户名。把命令里的ubuntu@xxx.xxx.xxx.xxx改成私有EC2的私有IP即可:
ssh -A ubuntu@ec2-xxx-xxx-xxx-xxx.us-west-2.compute.amazonaws.com -L 3307:xxx.xxx.xxx.xxx:3306 -N -f -v
2. 检查MySQL的绑定配置
修改MySQL配置文件(my.cnf或mysqld.cnf),确保bind-address设置为0.0.0.0或私有EC2的私有IP,允许跳板机访问。修改后重启MySQL服务:
sudo systemctl restart mysql
3. 验证私有EC2的安全组规则
确保私有EC2的安全组允许来自跳板机私有IP的3306端口入站流量。
4. 测试跳板机到私有EC2的MySQL连通性
在跳板机上执行以下命令,确认能直接访问私有EC2的MySQL:
mysql -h xxx.xxx.xxx.xxx -u my-username -p
内容的提问来源于stack exchange,提问作者Wild
相关产品推荐
相关产品推荐

