私有子网内EC2实例无法使用yum及网络连接问题排查求助
问题背景
我的AWS架构如下(架构图:[架构图]):
- 可以从公有子网内的EC2实例连接到私有子网内的EC2实例
- 尝试在私有子网实例上用yum安装软件包时失败,原因是yum无法联网
- 临时将私有子网的路由表修改为与公有子网一致后,仍然出现报错
报错信息
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Could not retrieve mirrorlist https://amazonlinux-2-repos-eu-central-1.s3.dualstack.eu-central-1.amazonaws.com/2/core/latest/x86_64/mirror.list error was
12: Timeout on https://amazonlinux-2-repos-eu-central-1.s3.dualstack.eu-central-1.amazonaws.com/2/core/latest/x86_64/mirror.list: (28, "Failed to connect to amazonlinux-2-repos-eu-central-1.s3.dualstack.eu-central-1.amazonaws.com port 443 after 2701 ms: Couldn't connect to server")其中一个配置的仓库连接失败(未知原因),yum没有足够的缓存数据继续执行。此时yum只能终止操作,以下是几种可行的解决思路:
1. 联系仓库上游提供商修复问题。 2. 重新配置仓库的baseurl等参数,指向可用的上游源。这种方法通常适用于你使用的发行版版本比仓库支持的版本新,但旧版本的软件包仍能正常使用的情况。 3. 临时禁用该仓库后执行命令: `yum --disablerepo=<repoid> ...` 4. 永久禁用该仓库,yum默认不会再使用它。之后可以通过`--enablerepo`参数临时启用,或者重新永久启用: `yum-config-manager --disable <repoid>` 或者 `subscription-manager repos --disable=<repoid>` 5. 配置仓库不可用时自动跳过。注意yum在执行大多数命令时仍会尝试连接该仓库,每次都会失败,导致yum运行变慢。但如果只是临时问题,这是一个不错的折中方案: `yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true`无法找到repo: amzn2-core/2/x86_64的有效baseurl
初步排查
- 执行
ping google.com时所有数据包均丢失,推测是网络连接问题 - 私有子网内实例的出站规则(截图:[出站规则])
排查与解决步骤
1. 确认路由表配置有效性
虽然你把私有子网路由表改成和公有子网一致,但要核对以下几点:
- 路由表是否包含指向**Internet Gateway(IGW)**的
0.0.0.0/0路由条目 - 该路由表是否已正确关联到目标私有子网
- 检查路由表的传播设置,确保没有冲突的路由策略覆盖了默认路由
2. 校验安全组出站规则
从你提供的出站规则截图来看,需要确认:
- 是否允许所有出站流量(
0.0.0.0/0),至少要允许HTTPS(443端口)和DNS(53端口,UDP/TCP协议)的出站访问 - 该安全组是否已经正确关联到私有子网的EC2实例
3. 检查网络访问控制列表(NACL)
NACL是子网级的防火墙,容易被忽略:
- 确认NACL的出站规则允许443、53端口的流量通过
- 确认NACL的入站规则允许临时端口范围(通常是1024-65535)的响应流量返回,否则请求发出去后收不到响应
4. 验证实例的公网访问属性
- 私有子网的EC2实例是否分配了弹性公网IP(EIP)?如果路由表指向IGW,但实例没有公网IP,依然无法直接访问互联网
- 检查实例的
Public IPv4 address是否存在,或者是否开启了Auto-assign public IPv4 address(临时测试可用)
5. 测试基础网络连通性
- 尝试
ping 8.8.8.8(谷歌公共DNS),如果能通说明是DNS解析问题,需要检查VPC的Enable DNS hostnames和Enable DNS support是否开启,实例是否使用VPC的DNS服务器 - 如果
ping 8.8.8.8也丢包,说明是路由或防火墙层面的问题,回到前几步重新排查
6. 临时替代方案
如果暂时无法修复公网访问,可以采用以下方式安装软件:
- 在公有子网的EC2实例上下载需要的rpm包,通过SCP复制到私有子网实例进行离线安装
- 配置VPC的S3 Gateway端点,这样私有子网实例可以直接访问S3上的Amazon Linux仓库,无需走公网
内容的提问来源于stack exchange,提问作者asfarasiknow

