Ir para o conteúdo

Como identificar, monitorar e otimizar meu uso de endereços IPv4 públicos da Amazon VPC?

7 minuto de leitura
0

Quero identificar, monitorar e otimizar meu uso de endereços IPv4 da Amazon Virtual Private Cloud (Amazon VPC).

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Todos os endereços IPv4 públicos incorrem em uma taxa de US$ 0,005 por cada endereço IP por hora, independentemente de estarem conectados a um serviço ou não. Se você for um cliente do nível gratuito da AWS para o Amazon Elastic Compute Cloud (Amazon EC2), receberá 750 horas gratuitas de uso. Esse uso gratuito é para quando você executa uma instância do Amazon EC2 com um endereço IPv4 público.

Ativar insights de IP público

É possível usar insights de IP público para monitorar, analisar e auditar os endereços IPv4 públicos que seus serviços usam atualmente nas regiões da AWS.

Para ativar os insights de IP público, crie um grupo do Gerenciador de endereços IP (IPAM) da Amazon VPC. Para identificar o uso de endereços IPv4 públicos, integre os insights de IP público do IPAM com uma única conta da AWS ou com suas contas do AWS Organizations.

Observação: não há custo para insights de IP público no nível gratuito. Para informações sobre preços do nível avançado, consulte a guia IPAM na página de preços da Amazon VPC. Ao integrar o IPAM ao Organizations, é possível usar insights de IP público para todas as regiões e contas da sua organização, mesmo no nível gratuito.

Para ver os resultados, use o console da Amazon VPC ou a AWS CLI.

Observação: depois de criar um grupo de IPAM, os insights de IP público geram um relatório para seus endereços IPv4 públicos. O tempo necessário para gerar o relatório é baseado no tamanho da sua organização.

Ativar o relatório de custo e uso

Seu relatório de custos e uso (CUR) da AWS inclui dados de uso de endereços IPv4 públicos em uso e não utilizados. Ao criar seu CUR, selecione Incluir IDs de recursos para obter uma análise detalhada a nível de recurso. Depois de criar seu CUR, a AWS atualiza os arquivos de relatório que contêm dados do mês até o momento pelo menos uma vez por dia. É possível usar os arquivos de relatório para analisar dados históricos de uso de endereços IPv4.

Observação: é possível acessar os relatórios de um bucket do Amazon Simple Storage Service (Amazon S3). A AWS pode levar até 24 horas para entregar relatórios ao seu bucket do Amazon S3.

Identificar imediatamente endereços IPv4 públicos

Observação: é uma prática recomendada usar CUR e insights de IP público para sua análise planejada do uso de endereços IPv4 públicos.

Para identificar imediatamente os serviços que usam endereços IPv4 públicos, use o console do Amazon EC2 ou a AWS CLI.

Console do Amazon EC2

Para analisar suas interfaces de rede para visualizar os serviços da AWS que usam endereços IPv4 públicos, conclua as seguintes etapas:

  1. Abra o console do Amazon EC2.
  2. No painel de navegação, em Rede e segurança, escolha Interfaces de rede.
  3. No filtro Endereços IPv4 públicos, insira <*> para identificar as interfaces de rede elástica que usam o endereço IPv4 público primário.
  4. Use a descrição da interface de rede e o tipo de interface para identificar o serviço que usa o endereço IPv4 público.
  5. Para mostrar todos os endereços IP públicos e secundários que têm interfaces de rede em uma região, execute o seguinte comando:
    aws ec2 describe-network-interfaces --region example-region --query 'NetworkInterfaces[*].PrivateIpAddresses[?Association.PublicIp].Association.PublicIp[]' --output table
    Observação: substitua example-region pela sua região.

Para endereços IPv4 públicos que a AWS Site-to-Site VPN usa, consulte Como faço para verificar o status atual do meu túnel VPN?

Para endereços IPv4 públicos que são o AWS Global Accelerator padrão e personalizado, consulte Visualizar seus aceleradores.

Para visualizar endereços IP elásticos ociosos ou associados, conclua as seguintes etapas:

  1. Abra o console do Amazon EC2.
  2. No painel de navegação, em Rede e Segurança, escolha IPs elásticos.
  3. Selecione um endereço IP elástico para visualizar os recursos que usam esse endereço IP elástico.
    Observação: para mais informações sobre o uso, consulte os campos Interface de rede ou Instância.

Não há cobrança para trazer seus próprios endereços IP (BYOIPs). A AWS fatura o Global Accelerator na região us-west-2.

AWS CLI

Pré-requisitos: execute o comando aws configure da AWS CLI para definir suas credenciais. Além disso, instale o Boto3. Para mais informações, consulte Instalar o Boto3 no site do Boto3.

Para identificar imediatamente os serviços que usam endereços IPv4 públicos, conclua as seguintes etapas em um ambiente AWS CloudShell ou Linux:

  1. Crie o seguinte arquivo:

    touch public_ipv4_recon.py
  2. Execute o comando a seguir para editar o arquivo:

    vim public_ipv4_recon.py
  3. Copie e cole o código a seguir no arquivo e salve-o:

    #!/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"]:
            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]:
      global_public_ipv4_lookup(aga)
      public_ipv4_lookup(
        ec2=profile.client('ec2', region_name=sys.argv[2])
        )
  4. Para verificar todas as regiões, execute o seguinte comando:

    python3 public_ipv4_recon.py example-cli-profile

    Observação: substitua example-cli-profile pelo nome do perfil configurado da AWS CLI ou por qualquer nome de perfil definido no arquivo .aws/credentials. Se você usa o Windows, substitua python3 por python.
    -ou-
    Para verificar uma região específica, execute o seguinte comando:

    python3 public_ipv4_recon.py example-cli-profile example-region

    Observação: substitua example-cli-profile pelo nome do perfil configurado da AWS CLI ou por qualquer nome de perfil definido no arquivo .aws/credentials. Substitua example-region pela região.

Se você não tiver autorização para executar a solicitação ou se a Região estiver desativada para sua conta, você poderá receber o seguinte erro:

“Error found: An error occurred (AuthFailure) when calling the <API> operation: AWS was not able to validate the provided access credentials...”

Otimizar o uso de endereços IPv4 públicos e adotar endereços IPv6

Para otimizar os custos, aprimore sua arquitetura atual para minimizar o uso de endereços IPv4 públicos. É uma prática recomendada migrar para o IPv6. Não há cobrança para endereços IPv6.

AWS OFICIALAtualizada há 5 meses