我创建了一个 VPC,并在其中创建了一个 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
为了使 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 机器的公共 IP 透明地发出出站 Internet 请求以满足其 Internet 需求。如果连接到私有子网,具有公共 IP 地址的实例无法与 Internet 正常交互。
在特定情况下,与 RDS 实例关联的子网实际上并未配置为可以简单归类为私有子网或公共子网的东西,因为子网根本没有默认路由。通过“igw”对象添加默认路由,或者像 OP 所做的那样,将需要连接的 Internet IP 地址的静态路由添加到子网的 VPC 路由表中,可以解决连接问题。
但是...如果您遇到类似的问题,您不能简单地更改路由表或构建新的路由表并将子网与它们关联,除非您在子网上没有其他任何正常运行的东西,因为可以合理地预期这种更改会破坏现有的连接。在这种情况下,正确的做法是使用正确的路由表条目在不同的子网上配置实例。
设置 VPC 时,最好在首次启用 VPC 时明确定义子网角色,并为其提供必要的路由。还要记住,整个 VPC“LAN”都是软件定义的网络。与物理网络不同,在物理网络中,路由器可能成为瓶颈,将流量很大的机器放在同一个子网上通常是明智的做法……跨子网的流量对 VPC 没有任何性能影响。应将机器放在适合机器 IP 寻址需求的子网上——公共地址,公共子网;没有公共地址,私有子网。
有关 VPC 中私有/公共子网物流的更多讨论,请参阅为什么我们需要 VPC 中的私有子网(在 Stack Overflow)。
答案2
这已经有了一个很好的答案,但是当您选择“公开可访问”选项时,AWS 会为您创建一个公共子网。相反,对我来说,问题在于默认的 VPC 安全组。我当时正在查看网络 ACL规则 - 不是安全组(在 RDS 中选择“公开可访问”选项会添加安全组,但不会自动添加入站规则。)
单击 RDS 并识别并单击安全组。然后在“入站规则”下添加端口 3306 并添加您的连接 IPV4 地址 xxxx/32(或 0.0.0.0/32 - 如果您希望整个互联网连接 - 但要小心)。
答案3
还要检查确保您所连接的网络没有阻止与端口 3306 上的另一台服务器的连接。当我连接到公司网络时就出现了这种情况。