我在 VPC 中有一个相当标准的多层子网布局。有一个数据库层/子网、一个 Web 服务器层/子网和一个堡垒主机层/子网。我的问题是我无法在子网之间 ping 或 ssh。
具体来说,我希望从堡垒层/子网 ping 和 ssh 到 Web 服务器层/子网。
172.31.32.0/20 堡垒层 172.31.0.0/20 网络服务器层
两个子网位于同一可用区,并且两个子网都连接到同一张路由表。路由表如下所示:
172.31.0.0/16 本地 0.0.0.0/0 igw-xxxxxxxx
目前,Web 服务器层的网络 ACL 允许所有流量、所有协议、所有端口范围(从 172.31.32.0/20 开始,这是堡垒层)。出站/出站规则允许所有流量。安全组同样开放。以下是 Web 服务器层的网络 ACL。
规则编号 类型 协议 端口范围 源 允许/拒绝 100 全部流量 全部 全部 172.31.32.0/20 允许 200 HTTP (80) TCP (6) 80 0.0.0.0/0 允许 202 HTTP* (8080) TCP (6) 8080 0.0.0.0/0 允许 210 HTTPS (443) TCP (6) 443 0.0.0.0/0 允许 * 所有流量 全部 全部 0.0.0.0/0 拒绝
我尝试过跨子网 ping 和 ssh,两个子网都连接到默认/主路由表,并且我尝试过将 Web 服务器子网连接到其自己的路由表。当我打开这些子网中的任何一个以从我的笔记本电脑的 IP 地址进行流量时,我能够通过实例的公共 IP 地址成功 ssh 登录。
我在网上看到过一些信息,暗示 AWS VPC 中存在奇怪/错误的行为。例如,通过 VPC 控制台创建弹性 IP,但通过 EC2 控制台分配它们,然后流量消失得像进入黑洞一样。解决方案似乎是删除有缺陷的 EIP,然后完全通过 VPC 或 EC2 控制台重新创建并分配一个新 EIP。然而,这充其量只是对可能/一般 AWS 错误的间接看法,因为在我的例子中没有涉及 EIP。
我的下一个故障排除措施是重新开始使用新的 VPC,创建两个子网,在每个子网中启动一个服务器实例,然后在它们之间测试 ping 和 ssh。单一路由表,以及广泛开放的网络 acl 和安全组 - 再简单不过了。
在我看来,这似乎是一个基本设置,所以我怀疑我遗漏了一个基本解决方案。有什么想法吗?请提出来,谢谢!
答案1
您需要一个路由,并打开从 Web 服务器层子网到堡垒层子网的网络 ACL,否则您的响应数据包将永远不会返回到服务器。启用从 Web 服务器子网到堡垒的 ICMP(并确保您的 ping 客户端仅使用 ICMP——有些默认使用 UDP 数据包),并打开适当的临时 TCP 端口(范围通常取决于操作系统;请参阅http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html#VPC_ACLs_Ephemeral_Ports)从 Web 服务器层迁移到堡垒层。
如果您同时在 Web 服务器实例和堡垒实例上运行 tcpdump,您可能会看到 Web 服务器正在获取堡垒数据包并发送响应,但堡垒实例永远不会收到响应。
答案2
检查两个子网中实例的入口安全组规则。您需要允许特定子网的 CIDR,否则将默认安全组附加到它们。
“允许来自分配到同一安全组的实例的入站流量”
http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html#DefaultSecurityGroup