从不同可用区 (AZ) 中的 EC2 实例连接到 RDS

从不同可用区 (AZ) 中的 EC2 实例连接到 RDS

好的,我有一个带有三个应用服务器的 VPC 和一个 RDS 中的 Postgres 实例。

我有一个名为“rds-staging”的安全组,它允许来自名为“app-elb-staging”的安全组在端口 5432 上进行入站连接。

'app-elb-staging' 是应用于我的所有 EC2 实例的安全组,它允许传出流量流向任何地方。

RDS 实例位于 AZ us-east-1e。我可以从 us-east-1e (10.0.3.*) 中的 EC2 实例连接到它,但无法从 us-east-1a (10.0.1.*) 或 us-east-1c (10.0.2.*) 中的任何 EC2 实例连接到它:

deploy@ip-10-0-3-220:~$ nc -zv xxx.us-east-1.rds.amazonaws.com 5432
Connection to xxx.us-east-1.rds.amazonaws.com 5432 port [tcp/postgresql] succeeded!

deploy@ip-10-0-1-155:~$ nc -zv xxx.us-east-1.rds.amazonaws.com 5432
nc: connect to xxx.us-east-1.rds.amazonaws.com port 5432 (tcp) failed: No route to host

deploy@ip-10-0-2-90:~$ nc -zv xxx.us-east-1.rds.amazonaws.com 5432
nc: connect to xxx.us-east-1.rds.amazonaws.com port 5432 (tcp) failed: No route to host

有人见过这种情况吗?我检查了 DNS,每台机器都将主机名解析为相同的 IP(10.0.3.x)。

答案1

好的,终于找到了这个问题的根本原因。我使用的 AMI 正在创建一个桥接,由于它与我的子网的 IP 发生冲突,导致连接问题。sudo route -n受影响实例上的输出如下所示:

ubuntu@ip-10-0-1-92:~$ sudo route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.1.1        0.0.0.0         UG    0      0        0 eth0
10.0.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.0.2.0        0.0.0.0         255.255.255.0   U     0      0        0 lxcbr0

任何与 10.0.2.* 的连接都将失败:

deploy@ip-10-0-1-92:~$ nc -zv 10.0.2.53 22
nc: connect to 10.0.2.53 port 22 (tcp) failed: No route to host

移除桥接器可以sudo ifconfig lxcbr0 down解决问题,但使用首先不设置此桥接器的 AMI 可以纠正根问题。

答案2

我见过此类问题由以下两个原因之一引起:

  1. 连接到各个子网的路由表配置错误。
  2. 有一个网络 ACL 正在运行(不寻常)。

您无需为每个子网定义路由,它们隐含在表中。仔细检查您的 DNS 条目在其他可用区实例上解析到的 IP 地址将确保它位于 VPC 中。

网络 ACL 可以发挥作用,但您必须设置它们。默认情况下,它们是完全开放的。这就是我将其标记为不太可能的原因,但它可能会导致这样的问题。也就是说,“没有到主机的路由”错误表明这不是您的问题。

相关内容