65

从 EC2 实例 i-78a8df00,我正在尝试连接到 RDS 实例 mysql.************.us-east-1.rds.amazonaws.com。他们都在美国东部地区。我将EC2实例的安全组(sg-********)添加到RDS安全组,但这没有帮助。这似乎是防火墙/DNS 问题,因为它在运行此命令时超时:

ubuntu@ip-10-195-189-237:~$ mysql -h mysql.************.us-east-1.rds.amazonaws.com

错误 2003 (HY000):无法连接到“mysql.************.us-east-1.rds.amazonaws.com”上的 MySQL 服务器 (110)

我可以使用与上面相同的行从本地计算机很好地连接到 RDS 实例。我尝试了各种论坛解决方案,但没有帮助。

4

8 回答 8

111

当我创建一个新的 EC2 实例时,我遇到了类似的问题,但没有更改 RDS 安全组中允许连接到我的 RDS 实例的端口 3306 的入站 IP 地址的设置。

令人困惑的是 RDS 仪表板中的一个选项,称为安全组。你不需要它来解决问题。

你真正需要的是:

  • 转到 RDS 实例列表
  • 单击您尝试连接的实例
  • 单击安全组规则部分

在此处输入图像描述

这应该会打开一个新的浏览器选项卡或窗口,其中包含安全组的详细信息。在底部找到几个选项卡,选择入站规则选项卡,然后单击编辑按钮。

在此处输入图像描述

将值更改为您的 EC2 实例或 IPv4 CIDR 块的 IP 地址,例如

174.33.0.0/16

要获取此值,您可以通过 ssh 进入您的实例并运行ip addr或在浏览器中运行 EC2 Manager 并在您的实例详细信息中找到私有 IP的值。

于 2016-10-17T03:33:18.927 回答
43

对于在尝试连接到 RDS 或 RedShift 时可能遇到类似问题的人的其他信息:

1)检查安全组

验证 RDS 实例的安全组是否允许从您的源服务器所属的安全组(或者如果在 AWS 外部,则直接添加其 IP)进行访问。您应该查看的安全组是在 RDS 控制台 UI 的 RDS 实例属性中指定的安全组(名为“安全组”)。

注意:数据库安全组可能与 AWS EC2 安全组不同。如果您的 RDS 实例在经典/公共 EC2 中,您应该检查 RDS UI 的“数据库安全组”部分。对于 VPC 用户,安全组将是一个普通的 VPC 安全组(名称 sg-xxx 将列在 RDS 实例的属性中)。

2) 确认 DNS 不是问题。

Amazon 使用拆分 DNS,因此 AWS 外部的 DNS 查找将返回公共 IP,而 AWS 内部的查找将返回私有 IP。如果您怀疑是 DNS 问题,您是否确认从不同的可用区返回不同的 IP?如果不同的 AZ 获得不同的 IP,您将需要联系 AWS 支持。

3) 通过建立套接字连接来确认网络连接。

由于 RDS 当前会丢弃 ICMP 流量,因此 tracepath 和 traceroute 之类的工具可能无济于事。

通过尝试在端口 3306(mysql 或 5432 用于 postgres)上建立与 RDS 实例的套接字连接来测试端口连接。首先查找 RDS 实例的 IP 并使用 telnet 或 nc:

telnet x.x.x.x 3306
nc -vz x.x.x.x 3306

a)如果您的连接尝试不成功并立即失败,则该端口可能被阻塞或远程主机未在该端口上运行服务。您可能需要与 AWS 支持联系以进一步排除故障。如果从 AWS 外部连接,请先尝试从 AWS 内部的另一个实例连接(因为您的防火墙可能会阻止这些连接)。

b)如果您的连接不成功并且超时,则数据包可能被防火墙丢弃/忽略,或者数据包正在返回不同的网络路径。您可以通过运行netstat -an | grep SYN(在运行时从不同的 CLI 窗口/会话并等待 telnet/nc 命令超时)来确认这一点。处于 SYN 状态的连接意味着您已发送连接请求,但尚未收到任何回复(SYN_ACK 或拒绝/阻止)。通常这意味着防火墙或安全组正在忽略或丢弃数据包。

检查以确保您没有在主机和 RDS 实例之间使用 iptables 或 NAT 网关。如果您在 VPC 中,还请确保您允许来自源主机的出口/出站流量。

c)如果你的socket连接测试成功了,但是不能连接mysql客户端(CLI、workbench、app等),看一下netstat的输出,看看连接处于什么状态(替换xxxx使用 RDS 实例的实际 IP 地址):

netstat -an | grep x.x.x.x

如果您在使用 telnet 或 NC 时建立了连接,但在使用 mysql 客户端时看到“SYN”状态,则您可能遇到了 MTU 问题。

在编写本文时,RDS 可能不支持用于 PMTUD 的 ICMP 数据包 ( https://en.wikipedia.org/wiki/Path_MTU_Discovery#Problems_with_PMTUD )。如果您尝试通过 ClassicLink 从经典 ec2 实例访问 VPC 中的 RDS 或 RedShift,这可能会出现问题。尝试使用以下方法降低 MTU,然后再次测试:

sudo ip link show
# take note of the current MTU (likely 1500 or 9001)
sudo ip link set dev eth0 mtu 1400

如果较低的 MTU 有效,请务必跟进 AWS 客户支持以寻求帮助,并提及您在尝试连接到 RDS 实例时遇到了 MTU 问题。如果 TCP 数据包使用隧道封装封装,则会发生这种情况,从而导致数据包数据/有效负载的可用 MTU 较低。降低源服务器上的 MTU 允许打包的数据包仍然适合限制。

如果它不起作用,请将您的 MTU 设置回默认值并联系 AWS 支持以进行进一步的故障排除。

于 2015-07-28T13:31:43.993 回答
13

虽然 Mark 的问题似乎与多可用区路由和 EC2 经典有关,但我今天遇到了同样的问题。

为了解决这个问题,我修改了使用我的 RDS 实例自动创建的安全组,方法是添加我的 EC2 实例中的两个私有 IP 地址。

向我的 RDS 实例添加入站规则

这是一个相当明显的问题,但总的来说我是 AWS 的新手,所以希望这对像我这样的其他人有用。

于 2016-01-28T16:12:37.937 回答
6

显然,多可用区搞砸了一切。由于默认的多可用区配置将我的数据库放置在区域 us-east-1d 中,并且我的 EC2 实例位于区域 us-east-1a 中,因此 DNS 路由不正确。我将 RDS 实例重新创建为非多可用区,并将其置于 us-east-1a 中,一切都很开心。

如果在 AWS 上具有 RDS、ELB 和多可用区功能的 DNS 路由方面有任何超级天才,那么知道如何做到这一点会非常棒,因为这在 Amazon Web Service 的文档中没有任何记录.

于 2013-05-30T20:30:28.887 回答
4

经过3天的努力,我终于找到了为什么我的连接不上...

在您的 EC2 实例上为端口 3306添加出站规则,在您的 RDS 服务器上在端口 3306 上添加入站规则。入站值应该是 EC2 实例的安全性

例子:

  • 您的 EC2 安全组是 - sg.ec2
  • RDS 安全组是 - sg.rds

所以去编辑 sg.ec2 的出站规则并在端口3306和目的地添加自定义 TCP 到0.0.0.0/0

然后,去编辑 sg.rds 的入站规则并在端口 3306 和源作为 sg.ec2 添加一个入站规则

于 2020-12-18T19:56:46.560 回答
2

今天我遇到了类似的问题,当时我的 EC2 实例突然无法访问 RDS 实例并且 Wordpress 停止工作。安全组是正确的,我什至可以从 EC2 实例上的控制台连接到 MySQL,但不能从 PHP。出于某种原因,重新启动 EC2 服务器帮助了我。

于 2017-03-21T08:39:20.090 回答
1

看起来在上次发布和本次发布之间的某个时间,亚马逊修复了 DNS 路由问题,因为现在对于多可用区 rds 一切正常......

于 2013-11-22T22:37:16.560 回答
-3

根据亚马逊文档,我们应该使用:

PROMPT> mysql -h <endpoint> -P 3306 -u <mymasteruser> -p

其中端点mymasteruser(用户名)来自您的 RDS 实例。

我直接使用IP公共地址(端点)而不是端点(****.us-east-1.rds.amazonaws.com)解决了这个问题。您可以使用“ping”命令获取IP公共地址( ping ****.us-east-1.rds.amazonaws.com)

于 2015-10-16T00:32:52.117 回答