出于安全原因,我们希望通过 ssh 连接到 EC2 上运行的 MySQL。我们在其他服务器上执行此操作没有任何问题,但由于某种原因,它在 EC2 上不起作用。该实例运行的是 Amazon Linux,MySQL 是 5.5.42。
我已经验证了 MySQL 用户具有适当的权限。我在 AWS 设置中打开了 3306,我能够使用用户和密码毫无问题地连接到 MySQL。显然,我们不希望在生产中防火墙出现这个漏洞。
我已经验证用户(当前使用 ec2-user 进行测试,将使用具有受限权限的用户进行生产)可以从 EC2 上的命令行运行 MySQL,并且使用私钥建立 SSH 连接没有任何问题。
这是我在 Mac 上建立隧道时使用的 ssh 命令:
ssh -nNT -L 3306:IPADDRESS:3306 -i /path-to/key.pem ec2-user@IPADDRESS
然后我尝试连接到 MySQL。它只是挂起。如果我关闭隧道,我会收到以下消息:
Lost connection to MySQL server at 'reading initial communication packet', system error: 0
如果我让它超时,我会得到同样的基本错误:
Lost connection to MySQL server at 'reading initial communication packet', system error: 35
ssh 命令报告:
channel 2: open failed: connect failed: Connection timed out
我应该注意,我使用这个基本命令(减去私钥)一直成功建立到非 EC2 服务的隧道。
如果我将 vvvv 添加到 ssh 命令中,当我尝试连接到 MySQL 时,到达超时 timeout 点,就会报告以下情况:
debug1: Connection to port 3306 forwarding to IPADDRESS port 3306 requested.
debug2: fd 7 setting TCP_NODELAY
debug3: fd 7 is O_NONBLOCK
debug3: fd 7 is O_NONBLOCK
debug1: channel 2: new [direct-tcpip]
channel 2: open failed: connect failed: Connection timed out
debug2: channel 2: zombie
debug2: channel 2: garbage collecting
debug1: channel 2: free: direct-tcpip: listening port 3306 for IPADDRESS port 3306, connect from 127.0.0.1 port 49316, nchannels 3
debug3: channel 2: status: The following connections are open:
我也尝试在 Windows 上使用名为 bitvise Tunnelier 的客户端并使用 MySQL ODBC 驱动程序进行测试,我得到了相同的结果 - 当我终止隧道时,我收到相同的错误消息,这让我得出结论,问题出在服务器上。
我尝试了一些我发现的建议,关于将 skip-networking 添加到 my.cnf 并将 mysqld:ALL:ALLOW 和 mysqld-max:ALL:ALLOW 添加到 /etc/hosts.allow,并对行为进行更改。
我现在完全不知所措。我不知道这是 MySQL 问题、SSH 问题还是其他 EC2 网络问题。
答案1
您不想尝试将隧道连接连接到 EC2 实例的端口 3306民众IP 地址,这似乎就是您正在做的事情。
在 EC2 中,机器私人的IP 地址绑定到其 IP 堆栈,AWS 网络硬件执行 1:1 NAT 来连接公共 IP。它不会将您 NAT 到您自己,因此会超时。
使用-L 3306:127.0.0.1:3306
。SSH 知道您指的不是本地回滚接口,而是远程系统的接口。或者,使用远程系统的私有 IP 地址,您可以在 AWS 控制台中找到该地址,也可以在ifconfig
实例本身上找到。
答案2
检查您的 EC2 安全组是否至少为您的 IP 开放了端口 3306。如果没有,请添加并重试。
单击实例,在描述中,您将看到“安全组”,单击安全组名称,然后单击入站> 编辑,您应该可以选择打开端口。