无法从外部VPC连接到RDS实例(错误2003(HY000)无法连接到MySQL Server)


12

我创建了一个VPC,并在其中创建了一个RDS实例。RDS实例是可公开访问的,其设置如下:

RDS设定

附加到RDS实例的安全组接受所有流量:

安全组设置

我所有的网络ACL都接受所有流量。但是,我无法从VPC之外的计算机访问实例。我收到以下错误:

    root@vps151014:~# mysql -h mysql1.xxxxxxxxxxxx.eu-west-1.rds.amazonaws.com -P 3306 -u skullberry -p
Enter password: 
ERROR 2003 (HY000): Can't connect to MySQL server on 'mysql1.xxxxxxxxxxxx.eu-west-1.rds.amazonaws.com' (110)

如果我从VPC内的EC2运行相同的命令,则可以连接。我尝试从多台计算机进行连接,所有这些计算机都没有防火墙(即打开了端口3306)。

我显然缺少了一些东西,但是一切似乎都已正确配置。可能是什么问题?


1
(110)错误消息的意思是“连接超时”,所以肯定这是一个IP连接问题。您的RDS实例显示与两个子网相关联。在VPC控制台中,这两个子网的默认路由是什么?是“ igw-xxxxxxxx”还是“ i-xxxxxxxx”?
Michael-sqlbot

两个子网都与VPC 的主路由表隐式关联。
dazedviper 2015年

1
将两个子网显式关联到一个自定义路由表,该表将所有出站流量路由到VPC的Internet网关,这没有任何区别。
dazedviper 2015年

1
好吧,这真是令人讨厌。到“ igw”的默认路由似乎是最有可能丢失的部分……并且在任何情况下都应该使它起作用。假设您在相应更改了子网配置后给了VPC足够的时间在后台重新配置自身,那么我就没主意了。
Michael-sqlbot

2
嗯,您需要所有IP地址的块是0.0.0.0/0。我将发布答案。
Michael-sqlbot

Answers:


20

为了使VPC中的RDS实例可以“公共”(Internet)访问,它所连接的所有子网都必须是VPC的“公共”子网(与“私有”相对)。

公共子网从本质上定义为具有Internet网关对象(igw-xxxxxxxx)作为其到“ Internet”或至少到您需要访问的任何Internet目的地的路由的子网。通常,这是的目标地址0.0.0.0/0。公共子网必须用于将具有关联的公共IP地址的实例(包括RDS),并且不应用于将不具有公共IP地址的实例,因为私有地址必须经过转换才能在Internet上正常工作。

相反,专用子网的路由表配置为通过另一个EC2实例(通常是NAT实例)到达Internet目的地。这在与该子网关联的VPC路由表中显示为i-xxxxxxxx,而不是“ igw”。该机器(其本身实际上将与其用作路由目的地的子网不在同一子网上)充当翻译器,从而允许仅专用IP实例使用NAT机器的公共网络透明地发出出站Internet请求IP满足其Internet需求。如果具有公共IP地址的实例连接到专用子网,则无法与Internet正确交互。

在特定情况下,此处与RDS实例关联的子网并未真正配置为可以简单地归类为私有或公共子网的东西,因为该子网根本没有默认路由。通过“ igw”对象添加默认路由,或者像OP那样,将静态路由添加到需要连接的Internet IP地址,到子网的VPC路由表中,可以解决连接问题。

但是...如果遇到类似的问题,则不能简单地更改路由表或构建新的路由表并将子网与它们相关联,除非您在子网上没有其他可用的方法,因为更改可能是合理的。预期会破坏现有的连接。在这种情况下,正确的做法是为不同子网中的实例提供正确的路由表条目。

设置VPC时,最好明确定义子网角色,并在首次调试VPC时完全配置必要的路由。同样重要的是要记住,整个VPC“ LAN”是一个软件定义的网络。与物理网络不同,在物理网络中,路由器可能会成为瓶颈,并且将具有高流量的机器放置在同一子网中通常是明智的……跨子网的流量在VPC上没有性能上的劣势。机器应放置在适合其IP地址需求的子网中-公共地址,公共子网;没有公共地址,私有子网。

有关VPC中专用/公用子网的物流的更多讨论,请参见“ 为什么我们需要VPC中的专用子网(在堆栈溢出处)”。


2

这已经有了一个很好的答案,但是当您选择“可公开访问”选项时,AWS会为您创建一个公共子网。相反,对我而言,问题是默认的VPC安全组。我正在查看网络ACL规则,而不是安全组。(在RDS中选择“可公开访问”选项会添加安全组,但不会自动添加入站规则。)

单击RDS并标识并单击安全组。然后在“入站规则”下添加端口3306并添加您的连接IPV4地址xxxx / 32(或0.0.0.0/32-如果您希望整个Internet连接-但要小心)。


0

还要检查以确保您连接到的网络没有阻止与端口3306上另一台服务器的连接。对于我来说,当连接到公司网络时就是这种情况。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.