KoZ*_*NoT 0 amazon-web-services network-interface
我正在编写一个 Powershell 脚本来定位所有具有公共 IP 的 EC2 实例。我知道如何在 NetworkInterfaces 中获取弹性 IP 和公共池 IP 关联。但是,当已为公共池 IP(不是 EIP)配置的 EC2 实例断电时,公共 IP 会被释放回池中,并且关联会从 NetworkInterface 中删除。我似乎无法在任何地方找到任何标志或其他配置,表明当 EC2 重新启动时,它会请求一个新的公共池 IP。我需要识别关闭的 EC2 实例,这些实例可能会提供公共 IP 以用于安全报告,而无需启动它们以进行查找。
例如,此 EC2 在启动时具有公共池 IP。但是,当它断电时,就像现在一样,关联对象已与 IP 一起删除。是不是某处有一些配置表明它会在通电时获得一个新的公共池 IP?
PS X:\projects\GACM\cloudsecurity> (get-ec2instance -instanceid i-99999999999999999 -region us-east-1).instances.networkinterfaces|select *
Association :
Attachment : Amazon.EC2.Model.InstanceNetworkInterfaceAttachment
Description : Primary network interface
Groups : {launch-wizard-4}
Ipv6Addresses : {}
...
Run Code Online (Sandbox Code Playgroud)
确定实例是否具有共用公共 IP 地址的唯一方法是分析 CloudTrail 日志。
创建实例时,会生成一个日志条目。日志中的 requestParameters 有一个名为 networkInterfaceSet 的 JSON 对象,它有一个项目数组,这些项目有一个键 associatePublicIpAddress,它要么是真要么是假。
目前,您无法确定 EC2 处于停止状态时是否具有公共 IP 地址。除非您已将弹性 IP 链接到实例。
当 EC2 实例启动时,它可以从子网设置继承公有 IP 地址的分配,也可以将其设置为启用或禁用公有 IP。这会记录在云跟踪日志中。
目前,除了云跟踪日志之外,无法更改该行为或查看该行为。
例如,如果子网启用了公有 IP,并且在启动 EC2 实例时您明确禁用它,那么您的实例获取公有 IP 地址的唯一方法是从快照重新创建实例,或分配弹性 IP。如果实例最初使用公共 IP 启动,则无法删除公共 IP。
describe-network-interfaces 或 describe-instances 都不提供与启用或禁用的公共 IP 地址有关的任何元数据,不包括弹性 IP。
正如您提到的,确定实例是否具有公共 IP 的唯一方法是启动实例并查看正在运行的实例元数据。
在Amazon EC2实例IP寻址文档状态:
您可以控制您的实例是否接收公共 IP 地址,如下所示:
修改子网的公共 IP 寻址属性。有关更多信息,请参阅 Amazon VPC 用户指南中的修改子网的公有 IPv4 寻址属性。
在启动期间启用或禁用公共 IP 寻址功能,这会覆盖子网的公共 IP 寻址属性。有关更多信息,请参阅在实例启动期间分配公有 IPv4 地址。
公有 IP 地址从 Amazon 的公有 IPv4 地址池分配给您的实例,并且与您的 AWS 账户无关。当公网 IP 地址与您的实例解除关联时,它会被释放回公有 IPv4 地址池,您无法重复使用它。
您无法手动将公有 IP 地址与您的实例关联或取消关联。相反,在某些情况下,我们会从您的实例中释放公共 IP 地址,或者为其分配一个新的 IP 地址:
- 当您的实例停止、休眠或终止时,我们会释放您的实例的公共 IP 地址。您停止或休眠的实例在启动时会收到一个新的公共 IP 地址。
当您将弹性 IP 地址与其关联时,我们会释放您的实例的公共 IP 地址。当您取消弹性 IP 地址与实例的关联时,它会收到一个新的公共 IP 地址。
如果您的实例在 VPC 中的公网 IP 地址已被释放,如果您的实例附加了多个网络接口,则该实例将不会收到新的 IP 地址。
如果您的实例的公有 IP 地址被释放,而它有一个与弹性 IP 地址关联的辅助私有 IP 地址,则该实例不会收到新的公有 IP 地址。
如果您需要一个可以根据需要与实例关联的持久公共 IP 地址,请改用弹性 IP 地址。
实验
我在启用了公共 IP 地址分配的子网中创建了一个 EC2 实例。我将 EC2 实例设置为在启动时分配公共 IP 地址。更改子网自动分配值没有影响。这次我重复了这个过程,允许使用子网设置创建 EC2 实例。我在子网内禁用了自动分配。该实例是按预期在没有公共 IP 的情况下创建的。然后我在子网上启用了自动分配,并停止并启动了实例。未分配公共 IP 地址。
因此基于上面的文档和我的实验。池化公共 IP 地址的分配在 EC2 实例启动时决定。这是无法改变的。我运行了 [describe-network-interfaces, describe-instances] CLI 命令来获取有关 ENI 的详细信息,并且没有元数据提供标志来指示在实例启动时将分配公共 IP 地址。我能找到任何信息的唯一地方是在 CloudTrail 日志中。
如果您使用 AWS 最佳实践,则应使用 CloudFormation 启动 EC2 实例。在这里,您将知道 EC2 实例是否具有公共 IP。
或者,您不允许使用服务控制策略或分配给用户的策略来分配共用公共 IP 地址。然后使用替代方法使用弹性 IP 地址或负载均衡器公开机器。
我认为重新审视您的用例很重要,以了解您想要实现的目标。
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |