好的,我有一个带有三个应用服务器的 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
我见过此类问题由以下两个原因之一引起:
- 连接到各个子网的路由表配置错误。
- 有一个网络 ACL 正在运行(不寻常)。
您无需为每个子网定义路由,它们隐含在表中。仔细检查您的 DNS 条目在其他可用区实例上解析到的 IP 地址将确保它位于 VPC 中。
网络 ACL 可以发挥作用,但您必须设置它们。默认情况下,它们是完全开放的。这就是我将其标记为不太可能的原因,但它可能会导致这样的问题。也就是说,“没有到主机的路由”错误表明这不是您的问题。