好的,所以我有一台带有三台应用服务器的VPC和一台RDS的Postgres实例。
我有一个名为“rds-staging”的安全组,允许来自名为“app-elb-staging”的安全组的端口5432的入站连接。
“app-elb-staging”是应用于所有EC2实例的安全组,并且允许传出stream量到达任何位置。
RDS实例在AZ us-east-1e。 我可以从us-east-1e(10.0.3。*)中的EC2实例连接到它,但不能从us-east-1a(10.0.1。*)或us-east-1c(10.0 0.2 *):
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,并且每台机器都将主机名parsing为相同的IP(10.0.3.x)。
好了,终于想出了这个问题的根本原因。 我正在使用的AMI创build了一个桥梁,导致连接问题,因为它与我的子网的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在第一个地方纠正了根。
我看到这种问题是由以下两个原因造成的:
您不需要为每个子网定义路由,它们隐含在表中。 仔细检查您的DNS条目parsing到其他-AZ实例的IP地址将确保它在VPC中。
networkingACL可以发挥作用,但是你必须设置它们。 默认情况下,它们是开放的。 这就是为什么我把它标记为不太可能,但它可能会导致这样的问题。 也就是说,“没有路由到主机”的错误是暗示,这不是你的问题。