如何识别、监控和优化我的 VPC 公共 IPv4 使用情况?

4 分钟阅读
0

我想识别、监控和优化我的 Amazon Virtual Private Cloud (Amazon VPC) IPv4 使用情况。

解决方法

**注意:**自 2024 年 2 月 1 日起,所有公共 IPv4 地址无论是否连接到服务,每个 IP 地址每小时都要收取 0.005 美元的费用。如果您是 Amazon Elastic Compute Cloud (Amazon EC2) 的 AWS Free Tier 客户,您将获得 750 小时的免费使用时间。此免费使用时间适用于启动具有公共 IPv4 地址的 Amazon EC2 实例。

要识别、监控和优化您的 IPv4 使用情况,请完成以下操作:

开启公共 IP 洞察功能

使用公共 IP 洞察功能向您免费显示 AWS 区域的服务当前正在使用的所有公共 IPv4 地址。使用公共 IP 洞察功能监控、分析和审计您的公共 IPv4 地址的使用情况。

查看公共 IP 洞察功能,请在 Free Tier 下创建 IPAM 池。此外,设置公共 IP 洞察功能后,您可以通过 Amazon VPC IP 地址管理器对其进行访问。

注意: 创建 IPAM 池后,公共 IP 洞察功能可能需要一段时间才能显示与您的公共 IPv4 地址相关的报告。

开启您的成本和使用情况报告

您的 AWS 成本和使用情况报告 (CUR) 包括与正在使用或未使用的公共 IPv4 地址相关的使用数据。创建 CUR 时,可以选择 Include Resource IDs(包括资源 ID)以获得更详细的资源级分析。创建 CUR 后,AWS 至少每天更新一次包含当月数据的报告文件。这允许您分析 IPv4 的历史使用数据。此外,您还可以从 Amazon Simple Storage Service (Amazon S3) 存储桶访问报告。

**注意:**AWS 最多可能需要 24 小时才能向您的 Amazon S3 存储桶提交报告。

立即识别公共 IPv4 地址

**注意:**最佳做法是使用 CUR 和公共 IP 洞察功能来计划分析公共 IPv4 地址的使用情况。

要立即识别使用公共 IPv4 地址的服务,请使用 AWS 管理控制台或 AWS CLI。

AWS 管理控制台

要分析您的网络接口以检查使用公共 IPv4 地址的服务,请完成以下步骤:

  1. 打开 Amazon EC2 控制台,然后选择 Network Interfaces(网络接口)。
  2. 使用筛选器选择 Public IPv4 Addresses(公共 IPv4 地址)。输入 <*> 作为该值。此筛选器可识别所有使用主要公共 IPv4 地址的弹性网络接口。
  3. 使用弹性网络接口描述和接口类型来识别使用公共 IPv4 地址的服务。
  4. 要显示区域中具有弹性网络接口的所有公共和辅助 IP 地址,请运行以下命令:
    **注意:**将 example-region 替换为所需的区域。
    aws ec2 describe-network-interfaces --region example-region --query 'NetworkInterfaces[*].PrivateIpAddresses[?Association.PublicIp].Association.PublicIp[]' --output table

有关 Site-to-Site VPN 使用的公共 IPv4 地址,请参阅如何检查 VPN 隧道的当前状态?

有关标准和自定义 Global Accelerator 使用的公共 IPv4 地址,请参阅查看您的加速器

要查看空闲或关联的弹性 IP 地址,请完成以下步骤:

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格中,选择 Network & Security(网络和安全),然后选择 Elastic IPs(弹性 IP)以查看弹性 IP 地址。
  3. 要查看使用弹性 IP 地址的资源,请首先选择弹性 IP 地址。然后,查看网络接口或实例字段以获取更多信息。

注意:BYOIP 不收费。AWS Global Accelerator 按照 us-west-2 计费。

AWS CLI

**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

在开始之前,请完成以下操作:

完成以下步骤:

**注意:**您可以在 AWS CloudShell 或任何 Linux 环境中执行以下步骤。

  1. 创建以下文件:

    touch public_ipv4_recon.py
  2. 编辑文件:

    vim public_ipv4_recon.py
  3. 将以下代码复制并粘贴到文件中,然后保存该文件:

    #!/usr/bin/env python3
    import pprint
    import boto3, sys
    
    profile = boto3.Session(profile_name=sys.argv[1])
    aga = profile.client('globalaccelerator', region_name='us-west-2')
    ec2 = boto3.client('ec2')
    
    def global_public_ipv4_lookup(aga):
      try:
        # global accelerator
        next_token = None
        while True:
          if next_token:
            resource = aga.list_accelerators(
            NextToken = next_token
              )
          else:
            resource = aga.list_accelerators(
            )
          print('Describing world wide Global Accelerators...')
          print('Note: AWS Global Accelerators are billed in us-west-2....')
          print(f'Number of AGA: {len(resource["Accelerators"])}')
          print('-'*40)
          for item in resource["Accelerators"]:
            print(f'Name: {item["Name"]}')
            if 'IpSets' in item.keys():
              for ip in item["IpSets"][0]["IpAddresses"]:
                print(f'Public IPv4: {ip}')
            print(f'Status: {item["Status"]}')
            print()
          next_token = resource.get("NextToken")
          if next_token is None:
            break
        print()
        # custom_routing_accelerators
        next_token = None
        while True:
          if next_token:
            custom_routing = aga.list_custom_routing_accelerators(
              NextToken = next_token
            )
          else:
            custom_routing = aga.list_custom_routing_accelerators(
            )
          print('Describing world wide Custom Routing Accelerators...')
          print('Note: AWS Global Accelerators are billed in us-west-2....')
          print(f'Number of custom AGA: {len(custom_routing["Accelerators"])}')
          print('-'*40)
          for item in custom_routing["Accelerators"]:
            if 'IpSets' in item.keys():
              for ip in item["IpSets"][0]["IpAddresses"]:
                print(f'Public IPv4: {ip}')
            print(f'Status: {item["Status"]}')
            print()
          next_token = custom_routing.get("NextToken")
          if next_token is None:
            break
        print()
      except Exception as err:
        print(f'Error found: {err}...')
        pass
    
    def public_ipv4_lookup(ec2):
      try:
        # vpn
        next_token = None
        while True:
          if next_token:
            vpn = ec2.describe_vpn_connections(
                  NextToken = next_token
            )
          else:
            vpn = ec2.describe_vpn_connections(
            )
          print('Describing VPNs...')
          print(f'Number of Vpn connections: {len(vpn["VpnConnections"])}')
          print('-'*40)
          for item in vpn["VpnConnections"]:
            if 'VpnConnectionId' in item.keys():
              print(f'Vpn Id: {item["VpnConnectionId"]}')
              for ip in item["VgwTelemetry"]:
                print(f'Public ipv4: {ip["OutsideIpAddress"]}')
            print()
          next_token = vpn.get("NextToken")
          if next_token is None:
            break
        print()
        # elastic ip
        eip = ec2.describe_addresses(
        )
        print('Describing Elastic IPs...')
        print(f'Number of Elastic Ips: {len(eip["Addresses"])}')
        print('-'*40)
        for item in eip["Addresses"]:
          if 'AllocationId' in item.keys():
            print(f'Eip Id: {item["AllocationId"]}')
            print(f'Public ipv4: {item["PublicIp"]}')
            print()
        print()
        # network interfaces
        next_token = None
        while True:
          if next_token:
            interface = ec2.describe_network_interfaces(
            NextToken=next_token
              )
          else:
            interface = ec2.describe_network_interfaces(
            )
          print('Describing Network Interfaces...')
          print(f'Number of interfaces: {len(interface["NetworkInterfaces"])}')
          print('Only printing Interfaces with a public IPv4 address...')
          print('-'*40)
          for item in interface["NetworkInterfaces"]:
            #print(f'Private Ip: {item["PrivateIpAddress"]}')
            for ip in item["PrivateIpAddresses"]:
              if 'Association' not in ip.keys():
                pass
              else:
                print(f'Interface Id: {item["NetworkInterfaceId"]}')
                print(f'Description: {item["Description"]}')
                print(f'Status: {interface["NetworkInterfaces"][0]["Status"]}')
                print(f'Public Ip: {ip["Association"]["PublicIp"]}\n')
          next_token = interface.get("NextToken")
          if next_token is None:
            break
      except Exception as err:
        print(f'Error found: {err}...')
        pass
    
    # Run code
    if len(sys.argv) < 3 or not sys.argv[2]:
      global_public_ipv4_lookup(aga)
      regions_list = ec2.describe_regions(
          AllRegions=False
      )
      for region in regions_list['Regions']:
        if region["OptInStatus"] == 'opted-in' or 'opt-in-not-required':
          print(f'\n**********-[{region["RegionName"]}]-**********\n')
          public_ipv4_lookup(
            ec2=profile.client('ec2', region_name=region["RegionName"])
            )
    elif sys.argv[2]:
      #ec2 = profile.client('ec2', region_name=sys.argv[2])
      global_public_ipv4_lookup(aga)
      public_ipv4_lookup(
        ec2=profile.client('ec2', region_name=sys.argv[2])
        )
  4. 运行脚本: 
    **注意:**将 example-cli profile 替换为已配置的 AWS CLI 配置文件的名称或 .aws/credentials 文件中定义的任何配置文件名称。将 example-region 替换为所需的区域。
    要签入所有区域,请使用以下命令:

    # python3 public_ipv4_recon.py <example-cli-profile>

    要检查特定区域,请使用以下命令:

    # python3 public_ipv4_recon.py <example-cli-profile> <example-region>

**注意:**运行脚本时可能会收到以下错误。此错误表明您可能无权运行请求,或者您的账户的区域已关闭。

“Error found: An error occurred (AuthFailure) when calling the <API> operation: AWS was not able to validate the provided access credentials...(发现错误:调用操作时出错 (AuthFailure):AWS 无法验证提供的访问凭证...)”

优化公共 IPv4 地址的使用情况并采用 IPv6 地址

要优化成本,请增强您当前的架构,以最大限度地减少使用公共 IPv4 地址。此外,尽快迁移到 IPv6 也是一种最佳做法。迁移到 IPv6 是一种经济实惠的解决方案,IP 地址不收费。

AWS 官方
AWS 官方已更新 8 个月前