2

我有 s3 端点悲伤。当我的实例初始化时,它们无法安装 docker。细节:

我的 ASG 实例位于带有 pub 和私有子网的 VPC 中。适当的路由和 EIP/NAT 都被缝合了。私有子网中的实例有出站 0.0.0.0/0 路由到各自公有子网中的 NAT。公共子网的 NACL 允许 Internet 流量进出,私有子网周围的 NACL 允许来自公共子网的流量进出、出入 Internet 的流量(以及来自 s3 cidr 的流量进出)。我希望它完全锁定。

  • 我在我的 VPC 中启用了 DNS 和主机名
  • 我了解 NACL 是无状态的,并且已为临时端口范围上的 s3 amazon IP cidr 块启用了 IN 和 OUTBOUND 规则(是的,我还启用了 pub 和私有子网之间的流量)
  • 是的,我已经在我的私有路由表中检查了为我的 s3 端点配置的路由
  • 是的,我确定这是 s3 端点导致我悲伤,而不是另一个错误 -> 当我删除它并打开我的 NACL 时,我可以 yum 更新并安装 docker(如预期的那样)我不是在寻找需要打开我的建议的建议NACL,我正在使用 VPC 网关端点,因为我想将事物锁定在私有子网中。我提到这一点是因为类似的讨论似乎在说“我在所有端口上打开了 0.0.0.0/0,现在 x 可以工作”
  • 我应该烤一个安装了 docker 的 AMI 吗?如果我不能解决这个问题,我会这样做。我真的很想建立我的网络,所以一切都很好地锁定了,感觉使用端点应该很简单。在很大程度上,这是一个网络练习,所以我宁愿不这样做,因为它避免了解决和理解问题。
  • 我知道我的其他 VPC 端点运行良好 -> 自动缩放服务接口端点正在执行(我可以看到它根据策略缩减实例),SSM 接口端点允许我使用会话管理器,并且 ECR 端点正在运行结合 s3 网关端点(需要 s3 网关端点,因为图像层在 s3 中)-> 我知道这是可行的,因为如果我打开 NACLS 并删除我的 s3 端点并安装 docker,然后再次锁定所有内容,带回我的 s3 gatewayendpoint 我可以成功提取我的 ECR 图像。所以 s3 网关端点可以很好地访问 ecr 映像层,但不能访问 amazon-linux-extra 存储库。
  • 附加到实例的 SG 不是问题(实例具有默认出站规则)
  • 我已经尝试向我的 s3 端点添加越来越慷慨的策略,正如我在这个 7 岁的线程中看到的那样,并认为这必须解决问题(是的,我正确地替换了我的区域)
  • 我强烈认为解决方案在于该线程中讨论的 s3 网关策略,但是我越来越绝望的策略几乎没有运气。

Amazon EC2 实例无法更新或使用 yum

另一个 s3 与分辨率的斗争:

https://blog.saieva.com/2020/08/17/aws-s3-endpoint-gateway-access-for-linux-2-amis-resolving-http-403-forbidden-error/

我努力了:

  S3Endpoint:
Type: 'AWS::EC2::VPCEndpoint'
Properties:
  PolicyDocument:
    Version: 2012-10-17
    Statement:
      - Effect: Allow
        Principal: '*'
        Action:
          - 's3:GetObject'
        Resource: 
          - 'arn:aws:s3:::prod-ap-southeast-2-starport-layer-bucket/*'
          - 'arn:aws:s3:::packages.*.amazonaws.com/*'
          - 'arn:aws:s3:::repo.*.amazonaws.com/*'
          - 'arn:aws:s3:::amazonlinux-2-repos-ap-southeast-2.s3.ap-southeast-2.amazonaws.com/*'
          - 'arn:aws:s3:::amazonlinux.*.amazonaws.com/*'
          - 'arn:aws:s3:::*.amazonaws.com'
          - 'arn:aws:s3:::*.amazonaws.com/*'
          - 'arn:aws:s3:::*.ap-southeast-2.amazonaws.com/*'
          - 'arn:aws:s3:::*.ap-southeast-2.amazonaws.com/'
          - 'arn:aws:s3:::*repos.ap-southeast-2-.amazonaws.com'
          - 'arn:aws:s3:::*repos.ap-southeast-2.amazonaws.com/*'
          - 'arn:aws:s3:::repo.ap-southeast-2-.amazonaws.com'
          - 'arn:aws:s3:::repo.ap-southeast-2.amazonaws.com/*'
  RouteTableIds:
    - !Ref PrivateRouteTableA
    - !Ref PrivateRouteTableB   
  ServiceName: !Sub 'com.amazonaws.${AWS::Region}.s3'
  VpcId: !Ref BasicVpc
  VpcEndpointType: Gateway

(如您所见,非常绝望)第一个规则是 ECR 接口端点从 s3 拉图像层所必需的,所有其他规则都是尝试到达 amazon-linux-extras 存储库。

以下是我通过使用 SSM 端点连接会话管理器重新创建的初始化时发生的行为:

https://aws.amazon.com/premiumsupport/knowledge-center/connect-s3-vpc-endpoint/

我不能 yum 安装或更新

root@ip-10-0-3-120 bin]# yum install docker -y

加载的插件:extras_suggestions、langpacks、priorities、update-motd 无法检索镜像列表https://amazonlinux-2-repos-ap-southeast-2.s3.ap-southeast-2.amazonaws.com/2/core/latest/ x86_64/mirror.list错误为 14:HTTPS 错误 403 - 禁止

配置的存储库之一失败(未知),并且 yum 没有足够的缓存数据来继续。在这一点上,yum 能做的唯一安全的事情就是失败。有几种方法可以“解决”这个问题:

 1. Contact the upstream for the repository and get them to fix the problem.

 2. Reconfigure the baseurl/etc. for the repository, to point to a working
    upstream. This is most often useful if you are using a newer
    distribution release than is supported by the repository (and the
    packages for the previous distribution release still work).

 3. Run the command with the repository temporarily disabled
        yum --disablerepo=<repoid> ...

 4. Disable the repository permanently, so yum won't use it by default. Yum
    will then just ignore the repository until you permanently enable it
    again or use --enablerepo for temporary usage:

        yum-config-manager --disable <repoid>
    or
        subscription-manager repos --disable=<repoid>

 5. Configure the failing repository to be skipped, if it is unavailable.
    Note that yum will try to contact the repo. when it runs most commands,
    so will have to try and fail each time (and thus. yum will be be much
    slower). If it is a very temporary problem though, this is often a nice
    compromise:

        yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true

无法为 repo 找到有效的 baseurl:amzn2-core/2/x86_64

并且不能:

amazon-linux-extras install docker

Catalog is not reachable. Try again later.

目录https://amazonlinux-2-repos-ap-southeast-2.s3.ap-southeast-2.amazonaws.com/2/extras-catalog-x86_64-v2.json , https://amazonlinux-2- repos-ap-southeast-2.s3.ap-southeast-2.amazonaws.com/2/extras-catalog-x86_64.json 回溯(最后一次调用):文件“/usr/lib/python2.7/site-packages/amazon_linux_extras/software_catalog.py”,第 131 行,在 fetch_new_catalog 请求 = urlopen(url) 文件“/usr/lib64/python2. 7/urllib2.py",第 154 行,在 urlopen 返回 opener.open(url,数据,超时) 文件 "/usr/lib64/python2.7/urllib2.py",第 435 行,打开响应 = meth(req,响应)文件“/usr/lib64/python2.7/urllib2.py”,第 548 行,在 http_response 'http',请求,响应,代码,味精,hdrs)文件“/usr/lib64/python2.7/urllib2. py”,第 473 行,错误返回 self._call_chain(*args) 文件“/usr/lib64/python2.7/urllib2.py”,第 407 行,在 _call_chain 结果 = func(*args) 文件“/usr/lib64 /python2.7/urllib2.py”,第 556 行,在 http_error_default 中引发 HTTPError(req.get_full_url(), code, msg, hdrs,fp)HTTPError:HTTP错误403:禁止

我错过了什么陷阱?我很困在这里。我熟悉基本的 VPC 网络、NACL 和 VPC 端点(我至少使用过的那些),我已经完成了故障排除(尽管我已经按照概述进行了所有设置)。

我觉得 s3 政策是这里的问题或镜像列表。非常感谢您阅读所有内容!想法?

4

2 回答 2

2

从外观上看,您很清楚自己要达到的目标。即使您说这不是 NACL,我也会再检查一次,因为有时人们很容易忽略一些小问题。考虑以下摘自此 AWS 故障排除文章的片段,并确保您在相应区域的规则中具有正确的 S3 CIDR:

确保与您的 EC2 实例的子网关联的网络 ACL 允许以下内容:端口 80 (HTTP) 和 443 (HTTPS) 到区域 S3 服务的出口。来自区域 S3 服务的临时 TCP 端口的入口。临时端口是 1024-65535。区域 S3 服务是包含 S3 接口终端节点的子网的 CIDR。或者,如果您使用的是 S3 网关,则区域 S3 服务是 S3 服务的公共 IP CIDR。网络 ACL 不支持前缀列表。要将 S3 CIDR 添加到您的网络 ACL,请使用 0.0.0.0/0 作为 S3 CIDR。您还可以将实际的 S3 CIDR 添加到 ACL 中。但是,请记住,S3 CIDR 可以随时更改。

乍一看,您的 S3 端点策略对我来说看起来不错,但您是对的,一般来说,策略或端点配置很可能是原因,所以我也会再重新检查一次。

我之前观察到的另一件事是,根据您使用的 AMI 和您的 VPC 设置(DHCP 选项集、DNS 等),有时 EC2 实例无法在 yum 配置中正确设置其默认区域。请检查文件awsregion和目录中是否awsdomain存在/etc/yum/vars以及它们的内容是什么。在您的用例中, awsregion 应该具有:

$ cat /etc/yum/vars/awsregion
ap-southeast-2

您可以检查您的实例上的 DNS 解析是否正常工作:

dig amazonlinux.ap-southeast-2.amazonaws.com

如果 DNS 似乎工作正常,您可以比较输出中的 IP 是否位于您在 NACL 中允许的范围内。

编辑:

再看一遍后,这条线比它应该的要严格一些: arn:aws:s3:::amazonlinux-2-repos-ap-southeast-2.s3.ap-southeast-2.amazonaws.com/*

根据文档,它应该类似于:

arn:aws:s3:::amazonlinux-2-repos-ap-southeast-2/*

于 2021-09-18T21:40:17.597 回答
2

嗨@nick https://stackoverflow.com/users/9405602/nick --> 这些是写“答案”的极好建议,因为排除故障对其他人来说很有价值,加上评论中的字符限制。

问题肯定出在政策上。


sh-4.2$ cat /etc/yum/vars/awsregion
ap-southeast-2sh-4.2$

挖:


sh-4.2$ dig amazonlinux.ap-southeast-2.amazonaws.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> amazonlinux.ap-southeast-2.amazonaws.com ;; 全局选项:+cmd ;; 得到答案:;; ->>HEADER<<- 操作码:QUERY,状态:NOERROR,id:598 ;; 标志:qr rd ra;查询:1,答案:2,权限:0,附加:1

;; 选择伪部分:; EDNS:版本:0,标志:;UDP:4096;;问题部分:amazonlinux.ap-southeast-2.amazonaws.com。在一个

;; 答案部分:amazonlinux.ap-southeast-2.amazonaws.com。278 在 CNAME s3.dualstack.ap-southeast-2.amazonaws.com 中。s3.dualstack.ap-southeast-2.amazonaws.com。2 在 52.95.134.91

;; 查询时间:4毫秒;;服务器:10.0.0.2#53(10.0.0.2);; 时间:2021 年 9 月 20 日星期一 00:03:36 UTC ;; 味精大小 rcvd:112


让我们检查一下 NACL:

NACL OUTBOUND RULES说明: 100 所有流量 所有 所有 0.0.0.0/0
允许 101 所有流量 所有 所有 52.95.128.0/21
允许 150 所有流量 所有 所有 3.5.164.0/22
允许 200 所有流量 所有 所有 3.5.168.0/23
允许 250所有流量 所有 所有 3.26.88.0/28
允许 300 所有流量 所有 所有 3.26.88.16/28
允许 所有流量 所有 所有 0.0.0.0/0
拒绝

NACL INBOUND RULES入站规则说明:100 所有流量 All All 10.0.0.0/24 Allow 150 All tr​​affic All All 10.0.1.0/24 Allow 200 All tr​​affic All All 10.0.2.0/24 Allow 250 All tr​​affic All All 10.0.3.0/24允许 400 所有流量 所有 所有 52.95.128.0/21
允许 450 所有流量 所有 所有 3.5.164.0/22
允许 500 所有流量 所有 所有 3.5.168.0/23
允许 550 所有流量 所有 所有 3.26.88.0/28
允许 600 所有流量 所有 所有3.26.88.16/28
允许所有流量 全部 全部 0.0.0.0/0
拒绝

SO -----> '52.95.134.91' 被规则 101 出站和 400 入站捕获,因此 NACL 看起来不错。(未来的人解决问题,这是你应该寻找的)

同样关于这些 CIDR 块,部署脚本从当前列表中拉出那些,并使用 jq 为 ap-southeast-2 抓取 s3 块,并将它们作为参数传递给 CF 部署。

有关如何为他人执行此操作的文档: https ://docs.aws.amazon.com/general/latest/gr/aws-ip-ranges.html#aws-ip-download

另一个注意事项,您可能会注意到 out 0.0.0.0/0,我意识到(对于其他人来说,请注意)这使得其他规则变得多余,我只是在摆弄时将它放在“以防万一”中(并删除了 -> pub子网)。出站 0.0.0.0/0 的私有子网流量被路由到公共子网中的相应 NAT。我将为我的公共子网添加出站,并在某个时候删除此规则。

子网 atm 很简单:10.0.0.0/16 pub a:10.0.0.0/24 pub b:10.0.1.0/24 priv a:10.0.2.0/24 priv b:10.0.3.0/24

因此将重新引入 pub a 和 b 块的规则,以便我可以删除 0.0.0.0/0 上的允许


我现在确定这是政策。

我只是单击操作将控制台中的策略修改为“完全访问”以进行破解并取得了成功。

我的猜测是镜像列表很难确定明确允许的内容,因此即使我将网络广泛投放,我也没有捕获所需的存储桶。但我不太了解aws镜像的工作原理,所以这是一个猜测。

我可能不想要超级欺骗性政策,所以这并不是真正的解决方案,但它可以确认问题出在哪里。

于 2021-09-20T01:34:27.550 回答