无法从EC2实例连接到RDS实例

Mar*_*ust 42 mysql amazon-ec2 amazon-web-services amazon-rds

从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
Run Code Online (Sandbox Code Playgroud)

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

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

sap*_*nov 74

我有一个类似的问题,当我旋转一个新的EC2实例,但没有改变RDS安全组中允许连接到我的RDS实例的端口3306的入站IP地址的设置.

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

您真正需要的是转到RDS实例列表,单击您尝试连接的实例,然后单击中间选项卡,找到安全和网络部分,然后单击安全组的名称.

RDS仪表板的屏幕截图

这应该打开一个新的浏览器选项卡或窗口,其中包含安全组的详细信 找到底部的几个选项卡,选择Inbound选项卡,然后单击Edit按钮.

VPC安全组的屏幕截图

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

174.33.0.0/16

要获得此值,您可以ssh到您的实例并运行ifconfig或在浏览器中运行EC2 Manager并在您的实例详细信息中找到私有IP的值.

  • 谢谢,这工作完美!我想知道为什么仅仅创建一个新的安全组对我不起作用。我想我误解了安全组织的实际工作。 (2认同)
  • 对我来说,这里的关键是关于私有 IP 而不是公共 IP - 它在 VPC 内连接,而不是通过外部流量与公共 IP 进行连接。 (2认同)

ive*_*ves 30

尝试连接到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)通过建立套接字连接来确认网络连接.

像tracepath和traceroute这样的工具可能无济于事,因为RDS目前会丢弃ICMP流量.

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

telnet x.x.x.x 3306
nc -vz x.x.x.x 3306
Run Code Online (Sandbox Code Playgroud)

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

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

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

c)如果您的套接字连接测试成功,但您无法连接mysql客户端(CLI,工作台,应用程序等),请查看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
Run Code Online (Sandbox Code Playgroud)

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

如果它不起作用,请将您的MTU恢复为默认值,并聘请AWS支持人员进行进一步的故障排除.

  • 这是一个很棒的答案!谢谢! (2认同)

las*_*ase 11

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

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

将入站规则添加到我的RDS实例

这是一个相当明显的问题,但我一般都是AWS的新手,所以希望这对像我这样的人有用.


Mar*_*ust 5

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

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

  • 即使在 2019 年的今天,我也遇到了这个问题! (2认同)

小智 5

经过三天的努力,我终于找到了为什么我的无法连接......

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

例子:

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

因此,去编辑 sg.ec2 的出站规则,并在端口3306和目的地添加自定义 TCP0.0.0.0/0

然后,编辑sg.rds的入站规则,在端口3306添加入站规则,源为sg.ec2


Mar*_*ust 1

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