Usar redes e firewalls

No Google Cloud Platform (GCP), você conecta suas redes a instâncias de maneira recíproca e à Internet. Segmente suas redes, crie regras de firewall para conceder acesso a portas específicas nas instâncias e crie rotas estáticas para encaminhar o tráfego para destinos específicos.

Antes de começar

Redes

Toda instância de máquina virtual é criada como um membro de uma rede. Em uma rede legada, ela é membro de um único intervalo de IP global. Em uma rede de sub-rede, ela é membro de uma única sub-rede, que é membro de uma rede. As redes e sub-redes processam a comunicação entre instâncias e servem como um gateway entre instâncias e outras redes. Uma rede está restrita a um único projeto. Ela não pode abranger projetos. No entanto, um projeto pode ter várias redes.

Cada instância tem um endereço IP derivado do intervalo de IP da sub-rede ou rede na qual ela foi criada. Cada instância tem também um endereço IP externo, que pode ser roteado pela Internet. O endereço IP externo pode ser temporário ou estático. Os endereços temporários não podem se mover entre instâncias e duram até a instância associada ao endereço ser excluída. Os endereços estáticos existem como um recurso de sistema independente que você atribui a qualquer instância e que podem ser movidos quando necessário. Mantenha endereços estáticos enquanto desejar, mesmo que eles não estejam atribuídos a uma instância. Manter endereços IP reservados custa dinheiro. Todas as comunicações entre instâncias em redes diferentes, mesmo dentro do mesmo projeto, ocorrerão por meio de endereços IP externos.

Tipos de rede

Rede (não sub-rede) legada

Com o lançamento de Sub-redes para o Google Cloud, a maioria das redes é redes de sub-rede. Mas ainda crie redes legadas, se necessário.

Uma rede do Compute Engine legada tem um único intervalo de prefixos IPv4 da rede e um único endereço IP de gateway para toda a rede. A rede é global no escopo e abrange todas as regiões da nuvem.

Na rede legada, os endereços IP de instância não são agrupados por região nem zona. Um endereço IP pode aparecer em uma região e o endereço IP seguinte pode estar em outra região. Qualquer intervalo de IPs pode ser distribuído para todas as regiões, e os endereços IP de instâncias criadas em uma região não são necessariamente contíguos.

A figura abaixo mostra uma rede (não sub-rede) legada. O tráfego da Internet passa por uma função de comutação global na rede, mostrado no diagrama como uma chave virtual. Depois pelas instâncias individuais.

As instâncias de uma região podem ter endereços IP não agrupados. Como mostra o exemplo, as instâncias de 10.240.0.0/16 são aleatoriamente distribuídas nas regiões um e dois. Por exemplo, 10.240.1.4 está na região dois, 10.240.1.5 está na região um e 10.240.1.6 na região dois.

Diagrama de uma rede legada (clique para ampliar)
Diagrama de uma rede legada (clique para ampliar)

Rede de sub-rede

Uma rede de sub-rede divide sua rede global em sub-redes regionais, cada uma com seu próprio prefixo IPv4. As redes de sub-rede são regionais no escopo, ao contrário das redes legadas, que são globais no escopo. As sub-redes de uma rede não precisam ser contíguas. Por exemplo, uma sub-rede de uma rede pode ter um intervalo de 10.240.0.0/16 e a outra pode ter um intervalo de 192.168.0.0/16. Assim, não há nenhum intervalo de IP nem endereço de gateway em uma rede de sub-rede. Cada sub-rede tem um intervalo de IP e endereço de gateway. As sub-redes pertencentes a uma única rede precisam ter intervalos RFC1918 que não se sobreponham. Uma sub-rede pertence a apenas uma rede e cada instância pode pertencer a apenas uma sub-rede.

Uma rede de sub-rede pode ser de modo auto ou custom. Uma rede de modo automático tem uma sub-rede por região, cada uma com um intervalo de IP e gateway predeterminados. Essas sub-redes são criadas automaticamente quando você cria a rede no modo automático, e cada sub-rede de modo geral tem o mesmo nome da rede. Quando a rede de modo personalizado é criada, não são criadas sub-redes. Para criar uma instância em uma rede no modo personalizado, crie primeiro uma sub-rede nessa região e especifique o intervalo de IP. Uma rede de modo personalizado pode ter nenhuma, uma ou várias sub-redes por região.

A rede padrão de um novo projeto está em uma rede de sub-rede automático. Crie até quatro redes adicionais em um projeto. As redes adicionais podem ser redes de sub-rede automáticas, redes de sub-rede personalizadas ou redes legadas.

A cada instância criada na sub-rede é atribuído um endereço IPv4 do intervalo dessa sub-rede.

A figura abaixo mostra uma rede de sub-rede. Uma nova instância recebe seu endereço IP do prefixo de determinada sub-rede. A Sub-rede 1 está na região 1 e tem todos os IPs privados alocados de 10.240.0.0/24 (IPs de instância 10.240.0.1 e 10.240.0.2), e a Sub-rede 2 da região 2 tem todos os IPs privados alocados de 192.168.1.0/24 (IPs de instância 192.168.1.1 e 192.168.1.2). Veja também que a Sub-rede três cruza as zonas de uma região. As sub-redes não são restritas por zona, somente região. Opte por criar instâncias de uma sub-rede em uma zona e instâncias de outra sub-rede em uma zona separada, se desejar.

Diagrama de uma rede de sub-rede (clique para ampliar)
Diagrama de uma rede de sub-rede (clique para ampliar)

Propriedades da rede

Cotas e limites

Uma rede do GCP, seja uma rede de sub-rede ou rede legada, pode ter 7.000 instâncias de máquina virtual, no máximo. Esse número não pode ser aumentado. Não há limite máximo por sub-rede. Uma rede de sub-rede pode ter 7.000 instâncias distribuídas aleatoriamente para as sub-redes.

Para consultar uma lista de outros recursos e respectivas cotas, visite a página Cotas. Muitas dessas cotas podem ser aumentadas mediante solicitação por meio do botão Solicitar aumento dessa página.

Intervalos de IP

As redes de sub-rede automáticas têm uma sub-rede por região com os intervalos de IP e gateways mostrados a seguir. Todo projeto contém uma única rede chamada default, que é uma rede de sub-rede automática. Como default é uma rede de sub-rede automática, ela sempre tem estes intervalos:

Região Intervalo de IP Gateway padrão
us-west1 10.138.0.0/20 10.138.0.1
us-central1 10.128.0.0/20 10.128.0.1
us-east1 10.142.0.0/20 10.142.0.1
europe-west1 10.132.0.0/20 10.132.0.1
asia-east1 10.140.0.0/20 10.140.0.1
asia-northeast1 10.146.0.0/20 10.146.0.1

As redes de sub-rede personalizadas podem usar qualquer intervalo de IP RFC1918 válido. Os intervalos não precisam ser contíguos entre sub-redes. Por exemplo, algumas sub-redes podem usar intervalos de 10.0.0.0/8, enquanto outras usam intervalos do espaço 192.168.0.0/16. Os intervalos precisam ser únicos e não podem se sobrepor em uma rede. As sub-redes personalizadas precisam ter pelo menos um intervalo /29 IPv4.

As redes legadas têm apenas um intervalo RFC1918, que você especifica quando cria a rede.

Rotas da rede

Todas as redes têm rotas automaticamente criadas para a Internet (rota padrão) e para os intervalos de IP na rede. Os nomes das rotas são automaticamente gerados e serão diferentes a cada vez. As redes de sub-rede automáticas, incluindo a rede padrão, têm intervalos como estes:

gcloud compute routes list
NAME                           NETWORK   DEST_RANGE    NEXT_HOP                 PRIORITY
default-route-02a98b9a14f7edc4 default   10.128.0.0/20                          1000
default-route-081fa300345dd52a default   0.0.0.0/0     default-internet-gateway 1000
default-route-93a38d78c77eac66 default   10.132.0.0/20                          1000
default-route-999664b72dd247e7 default   10.140.0.0/20                          1000
default-route-a1f15d0858cd51e1 default   10.142.0.0/20                          1000

Uma rede de sub-rede personalizada tem uma rota padrão e mais uma rota para cada sub-rede que você cria.

As redes legadas começam com apenas duas rotas: a rota padrão e a rota para o intervalo de IP geral.

Com essas rotas, a rede consegue enviar tráfego para a Internet e para todas as instâncias que você cria. Mas, para o tráfego alcançar as instâncias, são necessárias regras de firewall apropriadas.

Regras de firewall

Cada rede tem seu próprio acesso às instâncias controlado por firewall.

Todo o tráfego para instâncias, mesmo de outras instâncias, é bloqueado pelo firewall, a menos que as regras de firewall sejam criadas para permitir isso.

A rede default tem regras de firewall criadas automaticamente, que estão mostradas abaixo. Redes criadas manualmente, de qualquer tipo, não têm regras de firewall criadas automaticamente. Crie as regras de firewall necessárias para todas as redes, exceto para a default.

As regras de firewall são apenas regras de "permissão". Não crie regras de "negação". Para restringir o tráfego de modo a não alcançar determinadas instâncias, crie regras que permitam tráfego para as outras instâncias e remova a regra de firewall que permite tráfego para todas as instâncias.

As regras de firewall criadas automaticamente para a rede default são estas:

default-allow-internal
Permite conexões de rede de qualquer protocolo e porta entre instâncias na rede.
default-allow-ssh
Permite conexões SSH de qualquer origem para qualquer instância na rede pela porta TCP 22.
default-allow-rdp
Permite conexões RDP de qualquer origem para qualquer instância na rede pela porta TCP 3389.
default-allow-icmp
Permite tráfego ICMP de qualquer origem para qualquer instância na rede.

DNS interno e resolv.conf

Um nome de domínio totalmente qualificado interno (FQDN, na sigla em inglês) de uma instância é parecido com este:

hostName.c.[PROJECT_ID].internal

Você sempre pode conectar-se de uma instância a outra usando esse FQDN. Para conectar-se a uma instância usando, por exemplo, apenas o hostName, serão necessárias informações do resolvedor DNS interno, que é fornecido como parte do Compute Engine. As instâncias do Compute Engine recebem informações da resolução DNS interna como parte das concessões de DHCP. Use qualquer resolvedor DNS nas suas instâncias, desde que ele seja compatível com o recurso Rotas de sub-rede local documentado no RFC3442.

Por padrão, diversas variantes de Linux armazenam informações DHCP em resolv.conf, assim, pressupõe-se que seja onde sua instância as armazene. As instâncias do Compute Engine são configuradas para renovar concessões de DHCP a cada 24 horas. A renovação de DHCP substituirá esse arquivo, desfazendo todas as alterações que tenham sido feitas.

Exemplo de resolv.conf com explicação

# Local domain name. Computed from your project name.
domain c.[PROJECT_ID].internal
# Search list for hostname lookup. Starting with entries that represent
# your project and ending with google.internal to facilitate metadata server requests.
# Note: Older projects might have a projectNumber.google.internal
# (eg. 1234.google.internal).
# Note: Compute Engine provides up to a maximum of 3 entries for the search path.
search c.[PROJECT_ID].internal google.internal.
# Address of the DNS server to resolve project specific, and global domain names.
nameserver 169.254.169.254
nameserver 10.128.0.1

Exemplo de dhcp.lease com explicação

lease {
  # What interface we are using for the network
 interface "eth0";
 fixed-address 10.128.0.3;
 option subnet-mask 255.255.255.255;
 option routers 10.128.0.1;
 # Lease timeout, older VM instances will have this value set to infinite.
 option dhcp-lease-time 86400;
 option dhcp-message-type 5;
 option domain-name-servers 169.254.169.254,10.128.0.1;
 option dhcp-server-identifier 169.254.169.254;
 option interface-mtu 1430;
 # Search path options that are copied into the resolv.conf
 option domain-search "c.[PROJECT_ID].internal.", "google.internal.";
 option ntp-servers 169.254.169.254;
 option rfc3442-classless-static-routes 32,10,128,0,1,0,0,0,0,0,10,128,0,1;
 option host-name "vm1.c.[PROJECT_ID].internal";
 option domain-name "c.[PROJECT_ID].internal.";
 renew 4 2016/02/25 04:38:57;
 rebind 4 2016/02/25 16:00:08;
 expire 4 2016/02/25 19:00:08;
}

Se for necessário modificar esse arquivo, observe o seguinte:

  • O caminho da pesquisa pode processar somente seis registros, três deles fornecidos pelo Compute Engine, por padrão. Se você adicionar entradas ao caminho da pesquisa e forem feitas mais de seis entradas no total, o sistema operacional não aplicará regras de pesquisa após a 6ª. Isso pode fazer com que a funcionalidade do Compute Engine, por exemplo, acesso a instâncias por meio dos nomes delas, pare de funcionar.
  • A edição manual de resolv.conf fará com que ele seja revertido para o DHCP padrão sempre que expirar a concessão de DHCP de 24 horas da instância. Para fazer modificações estáticas no resolv.conf da instância, nas várias variantes de Linux, os itens podem ser acrescentados ou anexados à política de DHCP. Por exemplo, dhclient.conf fornece essa funcionalidade no Debian.

Redes criadas pelo usuário

É possível criar até cinco redes por projeto, incluindo a rede default. Caso não queira a rede default, exclua-a e crie uma rede diferente. Se o projeto exigir mais do que cinco redes, solicite cota adicional.

Não crie uma rede cujo nome seja igual ao de qualquer sub-rede existente no mesmo projeto. Também não crie uma sub-rede cujo nome seja igual ao de uma rede existente no mesmo projeto, exceto quando cada rede tem uma sub-rede por região com o mesmo nome da rede pai.

Observe que não há como modificar uma rede existente. Adicione e remova as regras de firewall associadas a uma rede, bem como as rotas, mas não altere o intervalo de endereços ou de gateway de uma rede depois que a rede é criada.

Criar uma rede com intervalos de sub-redes criadas automaticamente

  1. Crie uma rede no projeto com sub-redes alocadas automaticamente. A sinalização --mode especifica auto, que indica que as sub-redes serão criadas automaticamente com blocos IP predefinidos. Como se trata de uma rede de sub-rede, não há nenhum intervalo IPv4 ou IP de gateway no nível de rede, por isso nada será exibido.

    gcloud compute networks create auto-network1 \
        --mode auto
    

    NAME          MODE IPV4_RANGE GATEWAY_IPV4
    auto-network1 auto

  2. Liste as novas sub-redes criadas automaticamente.

    gcloud compute networks subnets list
    

    NAME          REGION          NETWORK       RANGE
    auto-network1 asia-east1      auto-network1 10.140.0.0/20
    auto-network1 us-central1     auto-network1 10.128.0.0/20
    auto-network1 europe-west1    auto-network1 10.132.0.0/20

Nesse ponto, a rede tem rotas para a Internet e para as instâncias que você criou. No entanto, ela não tem regras de firewall que permitam acesso a instâncias, mesmo de outras instâncias. Crie regras de firewall para permitir acesso.

Criar uma rede com intervalos de sub-redes personalizadas

Na atribuição manual de intervalos de sub-redes, crie primeiro uma rede de sub-rede personalizada. Depois crie as sub-redes desejadas em uma região. Não é necessário especificar sub-redes para todas ou nenhuma região, mas não crie instâncias em regiões que não tenham uma sub-rede definida.

Quando você cria uma sub-rede, o nome precisa ser único nesse projeto para essa região, mesmo nas redes. O mesmo nome pode aparecer duas vezes em um projeto, desde que cada um esteja em uma região diferente.

Como se trata de uma rede de sub-rede, não há nenhum intervalo IPv4 ou IP de gateway no nível de rede, por isso nada será exibido.

  1. Crie uma rede de sub-rede personalizada em seu projeto.

    gcloud compute networks create custom-network1 \
        --mode custom
    

    NAME            MODE   IPV4_RANGE GATEWAY_IPV4
    custom-network1 custom

  2. Especifique o prefixo de sub-rede da primeira região. Neste exemplo, atribuímos 192.168.1.0/24 à região us-central1.

    gcloud compute networks subnets create subnet-us-central-192 \
       --network custom-network1 \
       --region us-central1 \
       --range 192.168.1.0/24
    

    NAME                  REGION      NETWORK         RANGE
    subnet-us-central-192 us-central1 custom-network1 192.168.1.0/24

  3. Especifique o prefixo de sub-rede da segunda região. Neste exemplo, atribuímos 192.168.5.0/24 à região europe-west1.

    gcloud compute networks subnets create subnet-europe-west-192 \
         --network custom-network1 \
         --region europe-west1 \
         --range 192.168.5.0/24
    

    NAME                   REGION       NETWORK         RANGE
    subnet-europe-west-192 europe-west1 custom-network1 192.168.5.0/24

  4. Especifique o prefixo de sub-rede da terceira região. Neste exemplo, atribuímos 192.168.7.0/24 à região asia-east1.

    gcloud compute networks subnets create subnet-asia-east-192 \
       --network custom-network1 \
       --region asia-east1 \
       --range 192.168.7.0/24
    

    NAME                 REGION     NETWORK         RANGE
    subnet-asia-east-192 asia-east1 custom-network1 192.168.7.0/24

  5. Liste as redes. Se você criou também uma rede de sub-rede automática na seção anterior, estas sub-redes estarão na lista.

    gcloud compute networks subnets list
    

    NAME                           REGION          NETWORK         RANGE
    subnet-europe-west-192         europe-west     custom-network1 192.168.5.0/24
    subnet-us-central-192          us-central1     custom-network1 192.168.1.0/24
    subnet-asia-east-192           asia-east1      custom-network1 192.168.7.0/24

Nesse ponto, a rede tem rotas para a Internet e para as instâncias que você criou. Mas ela não tem regras de firewall que permitam acesso a instâncias, mesmo de outras instâncias. Crie regras de firewall para permitir acesso.

Criar uma rede legada

Você ainda pode criar uma rede legada sem sub-redes. As redes legadas têm um único intervalo de IP global. Não crie sub-redes em uma rede legada nem alterne de legada para redes de sub-rede automática ou personalizada.

  1. Crie uma rede legada em seu projeto.

      gcloud compute networks create legacy-network1 \
          --mode legacy \
          --range 10.240.0.0/16
    

      Created
      [https://www.googleapis.com/compute/latest/projects/PROJECT_ID/global/networks/legacy-network1].
      NAME            MODE   IPV4_RANGE    GATEWAY_IPV4
      legacy-network1 legacy 10.240.0.0/16 10.240.0.1

Nesse ponto, a rede tem rotas para a Internet e para as instâncias que você criou. Mas ela não tem regras de firewall que permitam acesso a instâncias, mesmo de outras instâncias. Crie regras de firewall para permitir acesso.

Listagem de sub-redes existentes

Relacione todas as sub-redes de um projeto existente.

Liste os detalhes gerais sobre todas as sub-redes.

gcloud compute networks subnets list
NAME              REGION          NETWORK         RANGE
auto-network1     europe-west1    auto-network1   10.132.0.0/20
europe-west-192   europe-west     custom-network1 192.168.5.0/24
auto-network1     us-central1     auto-network1   10.128.0.0/20
us-central-192    us-central1     custom-network1 192.168.1.0/24
asia-east-192     asia-east1      custom-network1 192.168.7.0/24
auto-network1     asia-east1      auto-network1   10.140.0.0/20

Personalize a lista fornecendo parâmetros adicionais:

  • --regions REGION,[REGION,...]] – restringir a lista a sub-redes em regiões específicas.
  • --network NETWORK – restringir a lista a sub-redes apenas em uma determinada rede.

Descrever uma sub-rede existente

O comando describe fornece detalhes sobre a sub-rede indicada.

Veja os detalhes de uma sub-rede existente:

gcloud compute networks subnets describe subnet-asia-east-192 \
    --region asia-east1
creationTimestamp: '2015-10-21T15:58:35.271-07:00'
gatewayAddress: 192.168.7.1
id: '2048026325272602228'
ipCidrRange: 192.168.7.0/24
kind: compute#subnetwork
name: subnet-asia-east-192
network: https://www.googleapis.com/compute/latest/projects/PROJECT_ID/global/networks/custom-network1
region: https://www.googleapis.com/compute/latest/projects/PROJECT_ID/regions/asia-east1
selfLink: https://www.googleapis.com/compute/latest/projects/PROJECT_ID/regions/asia-east1/subnetworks/subnet-asia-east-192

Mudar uma rede de automática para personalizada

Altere uma rede de sub-rede de modo automático para a de modo personalizado.

Após a alteração, a rede de sub-rede de modo personalizado terá os mesmos nomes de sub-rede e intervalos de IP da rede de sub-rede de modo automático original.

Após a mudança, será possível adicionar novas sub-redes à rede de sub-rede de modo personalizado. Consulte a etapa 2 de Criar uma rede com intervalos de sub-redes personalizadas. Também exclua sub-redes da rede, inclusive as sub-redes automáticas originais.

gcloud compute networks switch-mode [NETWORK_NAME] --mode custom

Expandir uma sub-rede personalizada

Expanda o intervalo de IP de uma sub-rede em uma rede de sub-rede de modo personalizado, mas não o reduzir.

Para definir o tamanho da nova sub-rede, especifique a nova máscara de rede. Por exemplo, se o intervalo de IP original é 10.128.131.0/24 e você especifica --prefix-length 20, o novo intervalo é definido como 10.128.128.0/20. O novo intervalo da rede precisa ser maior que o original, ou seja, o valor do comprimento do prefixo precisa ser um número menor. A nova sub-rede não pode sobrepor outras sub-redes na mesma rede em qualquer região. A nova sub-rede precisa estar dentro dos espaços de endereço RFC1918.

Como as sub-redes são identificadas exclusivamente por região e nome, especifique-os no comando.

Dependendo do tamanho e da alocação de IP da rede existente, esse comando pode levar vários segundos e até vários minutos para ser executado. Não crie novas instâncias durante esse tempo, mas as instâncias atuais não são afetadas. Durante a expansão, as instâncias existentes podem ser acessadas e podem passar tráfego.

gcloud compute networks subnets expand-ip-range [SUBNET_NAME]
  --network [NETWORK_NAME]
  --region [REGION]
  --prefix-length [PREFIX_LENGTH]
  • --prefix-length – o novo comprimento do prefixo numérico da sub-rede. Ele precisa ser menor que o comprimento do prefixo existente. Por exemplo, se a sub-rede atual é /24, o novo comprimento do prefixo precisa ser 23 ou menor.

Excluir uma sub-rede ou rede

Exclua qualquer sub-rede do seu projeto e também uma rede inteira, mas não uma rede ou sub-rede que ainda tenha instâncias ou recursos.

Excluir uma sub-rede

Somente as sub-redes criadas manualmente podem ser excluídas. As sub-redes criadas automaticamente não podem ser excluídas de maneira individual. É necessário excluir a rede inteira.

Não exclua sub-redes quando ainda há instâncias ou outros recursos criados manualmente que as utilizam.

gcloud compute networks subnets delete subnet-asia-east-192 \
    --region asia-east1
The following subnetworks will be deleted:
 - [subnet-asia-east-192] in [asia-east1]
Do you want to continue (Y/n)?  y
Deleted [https://www.googleapis.com/compute/latest/projects/PROJECT_ID/regions/asia-east1/subnetworks/subnet-asia-east-192].

Excluir uma rede

No caso de rede legada, exclua explicitamente o recurso da rede somente se ele não é usado por outros recursos.

No caso de rede de sub-rede automática, exclua explicitamente o recurso da rede somente se estas duas condições são atendidas:

  • nenhuma sub-rede filho da rede é usada por outro recurso
  • o recurso da rede não é usado por outros recursos

Os exemplos de recursos que restringem a exclusão acima mencionada incluem: firewalls, rotas personalizadas, instâncias, gateways de VPN de destino e roteadores.

No caso de rede de sub-rede personalizada, ela só pode ser excluída se todas as sub-redes filhas são excluídas.

Para excluir a rede:

gcloud compute networks delete auto-network1
The following networks will be deleted:
 - [auto-network1]
Do you want to continue (Y/n)?  y
Deleted [https://www.googleapis.com/compute/latest/projects/PROJECT_ID/global/networks/auto-network1].

Medição de capacidade da rede

O tráfego de saída de uma máquina virtual está sujeito aos limites máximos de capacidade de saída da rede. Esses limites dependem do número de núcleos que uma instância de máquina virtual tem. Cada núcleo está sujeito a um limite de 2 Gbits/segundo (Gbps) de desempenho máximo. Saiba mais sobre limites de capacidade de saída.

Para medir o desempenho da capacidade de saída das suas instâncias em relação a esses limites, use o PerfKitBenchMarker.

Por exemplo, execute os comandos a seguir quando você estiver em um computador local. O comando cria uma instância e mede seu desempenho, onde:

  • [MACHINE_TYPE] é o tipo de máquina que você quer testar (por exemplo, n1-standard-32);
  • [ZONE] é a zona na qual será criada a instância;
  • [NUMBER_OF_CORES] é o número de núcleos da instância (por exemplo, 32 para o tipo de máquina n1-standard-32).

Para medir o desempenho de stream único:

./pkb.py --cloud=GCP --machine_type=[MACHINE_TYPE] --benchmarks=iperf --ip_addresses=INTERNAL --zones=[ZONE]

Para medir o desempenho de multistream:

./pkb.py --cloud=GCP --machine_type=[MACHINE_TYPE] --benchmarks=iperf --ip_addresses=INTERNAL --zones=[ZONE] --iperf_sending_thread_count=[NUMBER_OF_CORES]

Detalhes de rede avançada

Nesta seção, há alguns detalhes mais aprofundados não abordados nas seções anteriores. Não é necessário ler esta seção para uso típico, mas há nela mais informações sobre como a rede funciona no Compute Engine. No diagrama a seguir são apresentados detalhes mais aprofundados, com mais informações nas seções correspondentes.

Um diagrama mais detalhado da rede do Compute Engine

Rede

  • Armazena uma tabela de consulta que rastreia cada conexão ativa. Quando chega um pacote que faz parte de uma conexão ativa, ele é enviado ao destino sem consultar regras de firewall.
  • Armazena uma tabela de consulta que associa endereços IP externos a instâncias. Todos os pacotes para o IP externo são encaminhados para a rede, que procura o IP interno correspondente a esse endereço e os encaminha para a instância.
  • Faz consultas de endereços MAC (proxy ARP) para um determinado endereço IP.
  • Encaminha pacotes de e para instâncias na rede.
  • Encaminha pacotes externamente (envolve faturamento).

Firewalls

  • No Compute Engine, é usado um firewall que bloqueia pacotes em uma instância. Nele não são bloqueados pacotes que saem de uma instância. Para bloquear pacotes de saída das instâncias, configure outra tecnologia, como o iptables, em suas instâncias.
  • Quando uma conexão é feita, todos os pacotes de entrada e saída com os mesmos dois endereços IP, a mesma porta de instância e o mesmo protocolo são permitidos até essa conexão expirar, o que ocorre depois de aproximadamente 10 minutos de inatividade. No entanto, se é enviada uma resposta a uma porta de instância diferente (por exemplo, se uma solicitação FTP solicita uma resposta de outra porta), a resposta não é automaticamente permitida. É preciso que haja uma regra de firewall permitindo uma conexão na nova porta.

Instâncias

  • Cada instância tem um servidor de metadados que também atua como um resolvedor DNS para essa instância. As buscas DNS são feitas para os nomes de instância. O próprio servidor de metadados armazena todas as informações do DNS relativas à rede local e consulta nos servidores DNS públicos do Google endereços fora da rede local.
  • Não há informações nas instâncias sobre os endereços IP externos atribuídos a elas. A rede armazena uma tabela de consulta que corresponde os endereços IP externos aos endereços IP internos das instâncias pertinentes.

O que cada parte faz

Nos bastidores, diversos recursos de rede são processados por diferentes partes do sistema Compute Engine. Alguns são recursos de rede padrão que estão bem documentados e alguns são específicos do Compute Engine. Alguns recursos podem ser configurados e outros não. O Compute Engine usa o módulo de rede VIRTIO do Linux para modelar a funcionalidade do roteador e a placa Ethernet, porém os níveis mais elevados da pilha de rede, como buscas ARTP, são processados com o software de rede padrão.

Busca ARP
O kernel da instância emite solicitações ARP e a rede emite respostas ARP. O mapeamento entre endereços MAC e endereços IP é processado pelo kernel da instância.
Tabela de consulta MAC, tabela de consulta de IP, tabela de conexão ativa
Essas tabelas ficam hospedadas na rede subjacente e não podem ser inspecionadas nem configuradas.
Servidor DNS
O servidor de metadados de cada instância atua como um servidor DNS. Ele armazena as entradas de DNS de todos os endereços IP da rede na rede local e chama o servidor DNS público do Google para as entradas fora da rede. Não é possível configurar esse servidor DNS, mas é possível configurar seu próprio servidor DNS caso queira configurar suas instâncias para usá-lo, em vez de editar o arquivo /etc/resolv.conf.
Processamento de pacotes entre a rede e o lado externo
Os pacotes que entram ou saem da rede são processados pelo código da rede que os examina com regras de firewall, tabela de consulta de IP externo e tabela de conexão ativa. A rede também executa NAT nos pacotes que entram e saem da rede.
Pacotes recebidos por uma instância
Esses pacotes são recebidos e transformados em stream pelo kernel da instância de maneira padrão.
Pacotes enviados por uma instância
Os pacotes são enviados pelo kernel da instância de maneira padrão. A interface e a funcionalidade da rede são modeladas usando o módulo de rede VIRTIO.

Instruções detalhadas de conexão

Veja mais detalhes sobre o que acontece quando uma instância faz uma chamada de rede.

Uma instância faz uma chamada:

  1. Se o endereço de destino é um nome de instância ou um URL como www.google.com, a instância chama o serviço DNS em seu servidor de metadados e recebe o endereço IP correspondente. Configure a instância para consultar outro serviço DNS, embora não seja possível resolver nomes de instância.
  2. O endereço IP de destino é examinado em relação ao intervalo de endereços IP da sub-rede, que todas as instâncias reconhecem.

    1. Se o endereço IP está fora da rede:

      1. A instância envia o pacote para o endereço MAC do gateway da sub-rede com definição do destino final do pacote. Talvez a instância precise fazer uma solicitação ARP para resolver o endereço MAC do gateway.

      2. A rede reescreve o cabeçalho de IP para declarar o endereço IP externo da instância como a origem. Se a instância não tiver nenhum endereço IP externo, a chamada não será permitida e a rede descartará o pacote sem informar o remetente.

      3. A rede registra o pacote de saída e adiciona a origem e o destino à tabela de conexões ativas.

      4. A rede envia o pacote para seu destino.

      5. O destino recebe o pacote e responde, se for o caso.

      6. A rede recebe a resposta, consulta a tabela de conexões ativas e a permite. A rede consulta a tabela de consulta de IP externo/rede, substitui o endereço IP externo da instância pelo endereço de rede correspondente e envia o pacote para a instância de origem.

      7. A instância recebe o pacote.

    2. Se o endereço IP de destino está dentro da rede:

      1. A instância é configurada com um IP com máscara 255.255.255.255, para que a instância envie o pacote ao endereço MAC do gateway da sub-rede. Talvez a instância precise fazer uma solicitação ARP para resolver o endereço MAC do gateway.

      2. A rede, usando o Proxy ARP, responde com o endereço MAC da instância de destino.

      3. O gateway recebe o pacote e o encaminha para o IP de destino dentro da rede.

      4. A instância de destino recebe o pacote. A instância de destino verifica o firewall de entrada para determinar se o pacote está permitido. Se não está, o pacote é simplesmente descartado. Caso contrário, a instância processa o pacote.

Uma instância externa ou computador chama uma instância:

  1. O autor da chamada externa envia um pacote para um endereço IP externo de uma instância, que pertence à rede.

  2. A rede compara o pacote com a tabela de conexões ativas para verificar se essa é uma conexão existente:

    1. Se não é uma conexão existente, a rede procura uma regra de firewall para permitir a conexão.
    2. Se não há nenhuma regra de firewall, a rede descarta o pacote sem informar o remetente.
  3. Se é uma conexão existente ou há uma regra de firewall válida, a rede examina a tabela de consulta e substitui o IP externo pelo IP da rede correspondente no pacote, registra o pacote de entrada na tabela de conexões ativas e o envia para a instância de destino.

  4. A instância recebe o pacote e responde conforme descrito em Se o endereço IP está fora do intervalo de IP da rede quando envia um pacote fora do intervalo da rede.

  5. A rede recebe a resposta, encontra a solicitação recebida correspondente na tabela de conexões ativas e permite o pacote. Antes de enviar, ela modifica o endereço IP de origem substituindo o IP da rede da instância pelo IP externo correspondente da tabela de consulta.

Firewalls

Consulte Sub-redes e regras de firewall para mais informações sobre como usar regras de firewall para isolar sub-redes.

Cada rede tem um firewall que bloqueia todo o tráfego para instâncias, mas não bloqueia o tráfego enviado pelas instâncias. Para permitir a entrada de tráfego nas instâncias, crie regras de "permissão" para o firewall.

A rede default tem regras de firewall criadas automaticamente, mas as redes criadas pelo usuário não têm.

Cada regra de firewall especifica uma solicitação de conexão de entrada permitida, que é definida pela origem, destino, portas e protocolo. Quando uma solicitação é enviada para uma instância, seja internamente ou por outra rede ou Internet, o Compute Engine a permite se alguma regra no firewall permitir.

O firewall não restringe uma instância de enviar um pacote. Qualquer instância pode enviar pacotes para qualquer outra instância da rede. No entanto, se o pacote será aceito é determinado pelas regras de firewall associadas à instância de destino. Para controlar as solicitações de saída, use um outro sistema como o iptables.

Somente instâncias com endereço IP externo podem enviar pacotes para fora da rede, mas as instâncias em sub-redes diferentes da mesma rede podem interagir entre si sem usar endereços IP externos.

Somente instâncias com um endereço IP externo e uma regra de firewall de permissão podem ser processadas diretamente de fora da rede. Como alternativa, encaminhe pacotes para instâncias sem endereço IP externo por meio de um servidor proxy endereçável.

Você não pode compartilhar regras de firewall entre projetos ou entre redes do mesmo projeto.

O Compute Engine usa uma tabela de rastreamento de conexão para dar suporte à filtragem de firewall com estado. O número máximo de conexões na tabela depende do tipo de instância. O número máximo atual de conexões é:

Uma regra de firewall expõe as propriedades a seguir, que também podem ser definidas usando o comando gcloud compute firewall-rules create. Cada regra é composta por vários elementos, e a maioria deles precisa ser definida antes que a conexão seja permitida:

network
[Obrigatório] A rede à qual foi atribuída essa regra de firewall. Cada regra de firewall pode ser associada a uma e somente uma rede. Forneça uma rede quando fizer uma chamada de API para criar uma regra de firewall. No entanto, se você usa a ferramenta de linha de comando gcloud e não especifica uma rede, a regra é automaticamente atribuída à rede default.
sourceRanges

Identifica autores de chamada permitidos por uma lista de bloqueios de endereço IP expressos em notação CIDR. Se nem sourceRanges nem sourceTags for especificado, o padrão será 0.0.0.0/0, ou seja, a regra se aplicará a todas as conexões de entrada, de dentro ou de fora da rede. Se sourceRanges e sourceTags forem especificados, uma conexão de entrada será permitida se o intervalo da origem corresponder a sourceRanges ou a tag da origem corresponder a sourceTags. As regras de firewall não são compatíveis com IPv6.

"sourceRanges": [ "198.51.100.0/24", "203.0.113.0/25" ]
sourceTags

Se a origem estiver dentro da rede e associada a uma das tags especificadas, a conexão será aceita. Se nem sourceRanges nem sourceTags for especificado, sourceRanges assumirá como padrão 0.0.0.0/0, ou seja, a regra se aplicará a todas as conexões de entrada, de dentro ou de fora da rede. Se sourceRanges e sourceTags forem especificados, uma conexão de entrada será permitida se o intervalo da origem corresponder a sourceRanges ou a tag da origem corresponder a sourceTags.

"sourceTags": [ "management" ]
targetTags

[Opcional] Uma lista de tags de instância que indica quais instâncias na rede podem aceitar solicitações das origens especificadas. Se não houver especificação, a regra de firewall se aplicará a todas as instâncias dessa rede. Por exemplo:

"targetTags": [ "web", "database" ]
allowed

[Obrigatório] Uma série conexões permitidas por essa regra de firewall. Cada uma delas contém um protocolo IP e um intervalo opcional de portas (para tráfego TCP e UDP) que alcançarão as instâncias especificadas por targetTags.

IPProtocol
[Obrigatório] Os protocolos permitidos nessa conexão. Podem ser valores de string (diferencia maiúsculas de minúsculas) tcp, udp, icmp, esp, ah, sctp ou qualquer número de protocolo IP.
ports
[Opcional] Uma série de portas de destino permitidas para essa conexão. Aplicável somente a conexões TCP e UDP. Cada valor é uma string, que é uma porta única ou um intervalo de portas. Se não há especificação, todas as portas são permitidas. Exemplo: ["80", "160", "300-500"]

Por exemplo:

"allowed": [
  {
    "IPProtocol": "tcp",
    "ports": [ "22" ],
  },
  {
    "IPProtocol": "udp",
    "ports": [ "161" ],
  }
]
name

[Obrigatório] O nome do firewall. O nome precisa ser único nesse projeto, ter de 1 a 63 caracteres e corresponder à seguinte expressão regular: [a-z]([-a-z0-9]*[a-z0-9])? O primeiro caractere precisa ser uma letra minúscula e todos os seguintes precisam ser um traço, letra minúscula ou dígito. O último caractere não pode ser um traço.

A rede default em qualquer projeto começa com as regras de firewall padrão a seguir. Modifique ou exclua essas regras, além de adicionar, modificar e excluir outras regras.

default-allow-internal
Permite conexões de rede de qualquer protocolo e porta entre duas instâncias.
default-allow-ssh
Permite conexões TCP de qualquer origem externa ou interna para qualquer instância na rede pela porta 22. As instâncias sem endereços IP externos não poderão ser diretamente alcançadas por origens externas.
default-allow-icmp
Permite tráfego ICMP de qualquer origem para qualquer instância na rede.
default-allow-rdp
Permite tráfego de protocolo Remote Desktop Protocol (RDP, na sigla em inglês) na porta 3389.

As regras padrão acima não permitem tráfego HTTP ou HTTPS de origens externas. Em Configuração de conexão HTTP externa há instruções para permitir esse tráfego.

Exemplo

O exemplo a seguir descreve a regra de firewall default-allow-ssh. O CIDR de origem 0.0.0.0/0 significa que a conexão pode partir de qualquer lugar, dentro ou fora da rede.

gcloud compute firewall-rules describe default-allow-ssh
allowed:
- IPProtocol: tcp
  ports:
  - '22'
creationTimestamp: '2014-07-08T10:32:46.214-07:00'
description: Allow SSH from anywhere
id: '13715544083725015625'
kind: compute#firewall
name: default-allow-ssh
network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/default-allow-ssh
sourceRanges:
- 0.0.0.0/0

Comandos úteis da ferramenta de linha de comando gcloud:

Adicionar uma regra de firewall

Para adicionar uma regra de firewall, crie um recurso Regra de firewall descrevendo os intervalos de IP permitidos, tags de destino, portas de destino, tags de origem, protocolo e rede. Essa regra de firewall será aplicada a qualquer instância conectada à rede especificada. Use o comando firewall-rules create:

gcloud compute firewall-rules create [FIREWALL_RULE] \
    --allow [PROTOCOL][:[PORT][-[PORT]]],[[PROTOCOL][:[PORT][-[PORT]]],…] \
    [--network [NETWORK]; default="default"] \
    [--source-ranges [CIDR_RANGE],[[CIDR_RANGE],…]]

Exemplo

O exemplo a seguir adiciona um firewall que oferece suporte a conexões HTTP na porta 80 de qualquer origem para qualquer instância na rede que apresente um endereço IP externo.

gcloud compute firewall-rules create allow-http --description "Incoming http allowed." \
         --allow tcp:80 --format json
{
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "80"
      ]
    }
  ],
  "creationTimestamp": "1234-56-78T09:12:34.567",
  "description": "Incoming http allowed.",
  "id": "13AAA70BBBB5639CCCC9",
  "kind": "compute#firewall",
  "name": "allow-http",
  "network": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allowhttp",
  "sourceRanges": [
    "0.0.0.0/0"
  ]
}

Excluir uma regra de firewall

Para excluir uma regra de firewall, execute o comando firewall-rules delete:

gcloud compute firewall-rules delete [FIREWALL_RULE]

Rotas

As rotas são recursos globais conectados a uma única rede, mas não a recursos regionais. As rotas criadas pelo usuário se aplicam a todas as instâncias de uma rede. Isso significa que você adiciona uma rota que encaminhe o tráfego de uma instância para outra dentro da mesma rede e até mesmo entre sub-redes, sem a necessidade de endereços IP externos. Por padrão, existem rotas entre sub-redes. No entanto, a menos que a rede seja default, é preciso criar regras de firewall para permitir tráfego na rede.

Em algumas circunstâncias, crie rotas adicionais para encaminhar especificamente alguns pacotes para destinos alternativos. Por exemplo, todas as redes têm uma rota padrão que envia tráfego para fora da rede. No entanto, é possível criar uma rota diferente que especifique que os pacotes destinados a 0.0.0.0/0 sejam encaminhados para uma instância de máquina virtual executando um proxy.

Com as rotas, implemente funções de rede mais avançadas nas máquinas virtuais, como configuração de NAT muitos para um e proxies transparentes. Se não forem necessárias soluções avançadas de roteamento, as rotas padrão serão suficientes para atender grande parte do tráfego de saída.

Rotas criadas automaticamente

Algumas rotas são criadas quando você cria uma rede.

Para redes de sub-rede

São criadas as seguintes rotas:

  • É gerada uma rota padrão para tráfego da Internet (0/0) quando a rede é criada.
  • É gerada uma rota para cada sub-rede criada. Essas rotas são para o tráfego local da rede. As instâncias de VMs de qualquer sub-rede podem enviar tráfego para instâncias da mesma sub-rede ou de qualquer outra dessa rede. Essa rota é deduzida da cota geral de rotas. A cota de rotas para um projeto é de 100 e cada sub-rede criada usa uma rota da cota. Observe que as redes que você cria ainda não têm regras de firewall, por isso, embora haja rotas apontando para instâncias, o firewall impede o tráfego para instâncias até que essas regras sejam adicionadas.

Para redes legadas

Duas rotas são criadas no momento em que a rede é criada.

  • Uma rota padrão para tráfego da Internet (0/0) é criada quando a rede é criada.
  • Para o intervalo de IP de destino dentro do intervalo IPv4 da rede, é definida uma rota de rede virtual. Para a rede legada padrão, as regras de firewall padrão são também criadas, assim o tráfego entre instâncias é permitido desde o início. Para redes legadas criadas manualmente, é preciso criar regras de firewall que permitam tráfego de entrada para instâncias.

Consulte no comando gcloud compute routes create as instruções para criar outras rotas.

Tabelas de roteamento de instância

Cada rota da Coleção de rotas pode se aplicar a uma ou mais instâncias. Uma rota se aplica a uma instância quando as tags de rede e de instância corresponderem. Se a rede corresponde e não há tags de instância especificadas, a rota se aplica a todas as instâncias dessa rede. O Compute Engine usa a Coleção de rotas para criar tabelas de roteamento somente leitura individuais para cada instância.

Para ter uma boa noção disso, imagine um roteador virtual altamente escalável no núcleo de cada rede. Toda instância de máquina virtual da rede é diretamente conectada a esse roteador, e todos os pacotes enviados por uma instância de máquina virtual são processados primeiro nessa camada para depois serem encaminhados ao próximo salto. O roteador da rede virtual seleciona o próximo salto do pacote consultando a tabela de roteamento dessa instância. O diagrama abaixo descreve essa relação, em que as caixas verdes são instâncias de máquina virtual, o roteador está no centro e as tabelas de roteamento individuais estão indicadas pela caixas marrom-claros.

A Coleção de rotas da rede legada no diagrama seria assim:

NAME                           NETWORK DEST_RANGE    NEXT_HOP                 PRIORITY
default-route-68079898SAMPLEe7 default 0.0.0.0/0     default-internet-gateway   1000
default-route-78SAMPLEd2bc5762 default 10.100.0.0/16                            1000
vpngateway                     default 172.12.0.0/16 us-central1-a/instances/vpngateway  1000

Olhando com mais atenção a rota vpngateway, nota-se a tag vpn na rota:

gcloud compute routes describe vpngateway
creationTimestamp: '2014-07-28T15:26:27.023-07:00'
destRange: 172.12.0.0/16
id: '12304245498973864442'
kind: compute#route
name: vpngateway
network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
nextHopGateway: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-a/instances/vpngateway
priority: 1000
selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/routes/vpngateway
tags:
- vpn

A rota vpngateway garante que qualquer instância com a tag vpn tenha automaticamente uma tabela de roteamento que contém a rota vpngateway junto com as duas rotas padrão. No diagrama, vm1 e vm2 têm essas rotas em sua tabela de roteamento, e todo o tráfego de saída destinado ao intervalo de IP externo 172.12.0.0/16 é tratado pela instância vpngateway.

A tabela de roteamento de uma instância é uma entidade somente leitura. Não edite diretamente essas tabelas. Para adicionar, remover ou editar uma rota, use a Coleção de rotas.

Rotas individuais

Uma rota única é composta dos seguintes itens:

name
[Obrigatório] O nome amigável dessa rota. Por exemplo, internetroute para uma rota que permite acesso à Internet.
network
[Obrigatório] O nome da rede à qual se aplica essa rota. Por exemplo, a rede default.
destRange
[Obrigatório] O intervalo de IP de destino ao qual se aplica essa rota. Se o IP de destino de um pacote está dentro deste intervalo, ele corresponde a essa rota. Por exemplo, 0.0.0.0/0. Consulte a seção Seleção de rota para entender como todas as rotas correspondentes são usadas no Compute Engine para selecionar o próximo salto de um pacote. As rotas não oferecem suporte ao IPv6.
instanceTags
[Obrigatório] A lista de tags de instância às quais se aplica essa rota. Se ela estiver vazia, essa rota se aplicará a todas as instâncias da rede especificada. Na API, esse campo é obrigatório. Na ferramenta de linha de comando gcloud, este campo é opcional e o comando gcloud assumirá uma lista vazia se o campo não for especificado.

É necessária uma das seguintes especificações do próximo salto:

nextHopInstance

O URL totalmente qualificado da instância processará os pacotes correspondentes. É necessário que a instância já exista e tenha a opção Encaminhamento de IP ativada. Por exemplo:

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/<instance>

Se uma instância do próximo salto falha e é reiniciada pelo sistema, ou se você exclui uma instância e a recria com o mesmo nome na mesma zona, o Compute Engine continua encaminhando os pacotes correspondentes para a nova instância.

nextHopIp

O endereço IP de rede de uma instância processa os pacotes correspondentes. O endereço IP precisa estar dentro do espaço de endereço da rede. Por exemplo, se a rede é 10.240.0.0/16, você não pode especificar nextHopIp=1.1.1.1. É necessário que a instância já exista e tenha a opção Encaminhamento de IP ativada. Se a instância do próximo salto falha e é reiniciada pelo sistema com o mesmo endereço IP, ou se você exclui uma instância e a recria com o mesmo endereço IP, o Google Compute Engine continua encaminhando os pacotes correspondentes para a nova instância.

nextHopNetwork

[Somente leitura] O URL da rede local que processa os pacotes correspondentes. Está disponível somente para a rota local padrão. Não defina manualmente esse campo.

nextHopGateway

O URL de um gateway que processa os pacotes correspondentes. Só está disponível o gateway de Internet:

/projects/[PROJECT_ID]/global/gateways/default-internet-gateway
nextHopVpnTunnel

O URL de um Túnel VPN que processa os pacotes correspondentes.

priority

[Obrigatório] A prioridade dessa rota. A prioridade é usada para desfazer empates quando há mais de uma rota correspondente de comprimento máximo. Um valor mais baixo tem prioridade mais alta. Uma prioridade 100 é mais alta que a prioridade 200. Por exemplo, as rotas a seguir estão empatadas por terem o mesmo comprimento de prefixo e por estarem na mesma rede. A prioridade diferente desfaz o empate, de modo que vpnroute vence.

NAME                       NETWORK     DEST_RANGE         NEXT_HOP                            PRIORITY
vpnroute                   default     192.168.0.0/16     [ZONE]/instances/vpninstance          1000
vpnroute-backup            default     192.168.0.0/16     [ZONE]/instances/vpninstance-backup   2000

Com essa configuração, o tráfego de VPN seria normalmente tratado por vpninstance, mas retornaria para vpninstance-backup se vpnroute fosse excluído.

Na API, esse campo é obrigatório. Na ferramenta de linha de comando gcloud, esse campo é opcional e a ferramenta assume uma prioridade padrão 1000 se o campo não for especificado.

Seleção de rota

Quando um pacote de saída é enviado por uma instância de máquina virtual, o Compute Engine usa as seguintes etapas para decidir qual rota usar e para onde encaminhar o pacote:

  1. O Compute Engine descarta todas as rotas, menos as mais específicas que correspondem ao endereço de destino do pacote. Por exemplo, se for destinationRange=10.1.1.1 e houver uma rota para 10.1.1.0/24 e uma rota para 10.240.0.0/16, o Compute Engine selecionará a 10.1.1.0/24 por ser mais específica.

  2. Se há várias rotas com o mesmo comprimento de prefixo, o Compute Engine descarta todas, exceto aquela com o menor valor de prioridade. O menor valor de prioridade indica a prioridade mais alta. É possível que haja mais de uma rota nesse ponto.

  3. O Compute Engine calcula um valor de hash do campo de protocolo IP, os endereços IP de origem e de destino e as portas de origem e de destino. O Compute Engine usa esse valor de hash para selecionar o próximo salto nos empates restantes.

  4. Se houver um próximo salto, o Compute Engine encaminha o pacote. Se não houver um próximo salto, o pacote é descartado e o Compute Engine responde com um erro de rede ou destino ICMP inacessível.

É importante observar que o Compute Engine não considera a distância da rede na seleção do próximo salto. A instância ou o gateway do próximo salto pode estar em uma zona diferente da instância que envia o pacote, por isso, crie tabelas de roteamento para controlar localidades. Por exemplo, use tags de instância para direcionar pacotes das instâncias em zonas diferentes para um proxy transparente local ou gateway de VPN preferencial. Marque as instâncias por zona para assegurar que os pacotes da instância de uma zona só sejam enviados para o próximo salto na mesma zona.

Lista de rotas

Para consultar uma lista de rotas de um projeto usando a ferramenta de linha de comando gcloud, execute o comando routes list:

gcloud compute routes list

Por exemplo:

gcloud compute routes list
NAME                           NETWORK   DEST_RANGE    NEXT_HOP                 PRIORITY
default-route-02a98b9a14f7edc4 default   10.128.0.0/20                          1000
default-route-081fa300345dd52a default   0.0.0.0/0     default-internet-gateway 1000
default-route-0fcb41f96ba1b57d legacy1   0.0.0.0/0     default-internet-gateway 1000
default-route-907f4b8dbd772dc3 legacy1   10.240.0.0/16                          1000
default-route-93a38d78c77eac66 default   10.132.0.0/20                          1000
default-route-999664b72dd247e7 default   10.140.0.0/20                          1000
default-route-a1f15d0858cd51e1 default   10.142.0.0/20                          1000

Adicionar uma rota

Para adicionar uma rota à tabela de roteamento, use o comando routes create:

gcloud compute routes create ROUTE --destination-range DEST_RANGE --network NETWORK NEXT_HOP

Excluir uma rota

Para excluir uma rota, execute o comando routes delete:

gcloud compute routes delete [ROUTE]

Para excluir uma rota na API, faça uma solicitação HTTP DELETE para o seguinte URI, com o corpo de solicitação vazio:

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/routes/<route-name>

Consistência das operações de rota

Quando você faz alterações na Coleção de rotas, essas alterações ficam depois consistentes em todas as instâncias. Isso significa que depois que você atualizar, adicionar ou remover uma rota, as alterações só terão efeito em todas as instâncias aplicáveis quando a operação retornar o status DONE. Uma operação PENDING ou RUNNING significa que a alteração pode ter efeito em algumas instâncias, mas não em todas.

Se você fizer uma sequência de alterações, elas poderão ser aplicadas às instâncias em qualquer ordem. Não há garantias de que a ordem das solicitações feitas seja a mesma do processamento. Como as alterações de rota não têm efeito imediato, as instâncias podem apresentar alterações diferentes em momentos diferentes. No entanto, sua operação mudará para o estado DONE quando as alterações forem implementadas em todas as instâncias envolvidas.

Ativar o encaminhamento de IP para instâncias

Por padrão, as instâncias do Compute Engine são bloqueadas para não enviarem pacotes cujo endereço IP de origem não corresponda ao seu endereço IP. Do mesmo modo, o Compute Engine não entregará um pacote cujo endereço IP de destino seja diferente do endereço IP da instância que o receberá. No entanto, ambos os recursos serão necessários se você quiser usar instâncias para direcionar pacotes. Para desativar essa verificação de IP de origem e destino, ative o campo canIpForward, assim, uma instância poderá enviar e receber pacotes sem IPs de destino ou de origem correspondentes.

Para definir o campo canIpForward com a ferramenta de linha de comando gcloud, use a sinalização --can-ip-forward ao criar sua instância:

gcloud compute instances create ... --can-ip-forward

Na API, defina o campo canIpForward como true quando elaborar o corpo da solicitação para criar uma instância:

{
  "name": "myinstance",
  "description": "",
  "image": "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-8-jessie-vYYYYMMDD",
  "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/machineTypes/n1-standard-2",
  "networkInterfaces": [
      ...
  ],
  "canIpForward": true
}

Esse campo só pode ser definido no momento da criação da instância. Depois que a instância é criada, o campo passa a ser somente leitura.

Interação com regras de firewall

Apenas criar uma rota não garante que os pacotes sejam recebidos pelo próximo salto especificado. As regras de firewall ainda determinam se o tráfego de entrada é permitido na rede ou instância. Por exemplo, se você cria uma rota que envie pacotes por meio de várias instâncias, cada instância precisa ter uma regra de firewall associada para aceitar pacotes da instância anterior.

Para a correspondência de endereço IP, é usado somente o endereço IP de origem do pacote, que não é necessariamente o endereço IP da instância que envia o pacote. Se você tem uma regra de firewall especificando que somente pacotes de 10.240.0.3 sejam aceitos, todos os pacotes com esse endereço IP de origem são aceitos, independentemente do endereço IP da instância que enviou os pacotes.

  • Se a instância 10.240.0.3 tem o canIpForward ativado e falsifica o IP de origem do pacote para 10.240.0.4, o firewall recusa o pacote.
  • Se a instância 10.240.0.4 tem o canIpForward ativado e falsifica o IP de origem do pacote para 10.240.0.3, o firewall aceita o pacote.

As tags de origem são aliases dos IPs de origem dos pacotes, não dos IPs das instâncias que enviam os pacotes. Por exemplo, se uma tag de origem chamada mytag está atribuída a uma instância com IP 10.240.0.3, uma regra que permita tráfego de mytag aceita qualquer pacote com IP de origem 10.240.0.3, independentemente da instância que envia o pacote. Isso é importante porque uma instância com encaminhamento de IP ativado pode enviar um pacote com endereço IP de origem diferente do endereço IP da instância. Por outro lado, as tags de destino são aliases do IP da instância de recebimento somente, não há ambiguidade.

Futuramente, o Compute Engine mudará o modo como as regras de firewall processam as tags de origem.

Para mais informações, consulte Firewalls.

Roteamento de pacotes para a Internet

Atualmente, qualquer pacote enviado para a Internet precisa partir de uma instância que tenha um endereço IP externo. Se você cria uma rota que envia pacotes para a Internet a partir de uma instância específica, essa instância também precisa ter um IP externo. Se cria uma rota que envia pacotes para o gateway de Internet e a instância de origem não tem um endereço IP externo, o pacote é descartado.

Configurações especiais

Configurar um endereço IP interno estático

No Compute Engine, não é possível definir um endereço IP interno estático que persista além da vida útil da instância, mas você pode usar uma combinação de rotas e o recurso --can-ip-forward da instância para adicionar um endereço IP como um interno estático que possa ser usado por outras instâncias da mesma rede como um destino para sua instância de máquina virtual desejada. Além disso, modifique a própria instância para que envie tráfego a partir desse endereço IP.

Por exemplo, para atribuir 10.1.1.1 especificamente como um endereço IP interno a uma instância de máquina virtual, crie uma rota estática que envie tráfego de 10.1.1.1 para sua instância, mesmo que o endereço IP interno não seja 10.1.1.1. Se desejar, configure também a instância para enviar tráfego a partir de 10.1.1.1.

Use as seguintes instruções para:

Observe que as instruções a seguir se aplicam a projetos que usam a rede default.

Antes de configurar um endereço IP interno estático, observe que:

  • Atribua um endereço IP interno específico a uma instância durante a criação da instância, sem usar uma rota. Para mais informações, leia a documentação Especificar um endereço IP interno na criação da instância.
  • Também comunique-se com uma instância usando o nome dela. Mesmo que o IP interno da instância mude, o nome da instância permanece inalterado. Então, configure seus aplicativos para enviar pacotes para o nome da instância. Usar o nome da instância é um meio mais consistente do que configurar um endereço IP interno estático usando rotas.

Definir um endereço IP interno de destino estático usando rotas

Esta seção é somente para configurar a instância e a rede para receber pacotes enviados para o IP (de destino). Para configurar a instância para enviar pacotes com esse endereço IP (de origem), consulte Definir um endereço IP de origem estático.

Debian 8


  1. Escolha um endereço IP interno que não pertença a uma rede do seu projeto.

    Use um endereço de um intervalo privado como 10.x.x.x ou 192.168.x.x, mas não de um intervalo usado no projeto. Este exemplo usa 10.1.1.1.

  2. Crie uma instância de máquina virtual e ative o encaminhamento de IP.

    Por padrão, o Compute Engine não entregará um pacote cujo endereço IP de destino seja diferente do endereço IP da instância que o receberá. Para desabilitar essa verificação de IP de destino, ative o encaminhamento de IP para a instância.

    gcloud compute instances create my-configurable-instance --can-ip-forward
    
  3. Crie uma rota de rede estática para direcionar pacotes destinados ao 10.1.1.1 para a sua instância.

    O destino da rota estática precisa ser um endereço IP que não esteja nas redes do projeto.

    gcloud compute routes create ip-10-1-1-1 \
        --next-hop-instance my-configurable-instance \
        --next-hop-instance-zone us-central1-f \
        --destination-range 10.1.1.1/32
    
  4. Crie uma regra de firewall para permitir tráfego nesse IP.

    Nesse caso, a regra de firewall permite todo o tráfego por meio do intervalo de endereços IP 10.0.0.0/8. Adicione mais intervalos de IP ou limite o acesso, conforme necessário.

    gcloud compute firewall-rules create allow-internal \
      --allow icmp,udp,tcp --source-range 10.0.0.0/8
    
  5. Adicione uma nova interface virtual à instância.

    1. Conecte-se à sua instância com SSH.

      gcloud compute ssh my-configurable-instance
      
    2. Acrescente as seguintes linhas ao arquivo /etc/network/interfaces.

      # Change to root first
      user@my-configurable-instance:~$ sudo su -
      

      # Append the following lines
      root@my-configurable-instance:~# cat <<EOF >>/etc/network/interfaces
      auto eth0:0
      iface eth0:0 inet static
      address 10.1.1.1
      netmask 255.255.255.255
      EOF
      

    3. Reinicie a instância.

      root@my-configurable-instance:~# sudo reboot
      

  6. Verifique se a interface da instância de máquina virtual está ativa dando um ping em 10.1.1.1 de dentro da instância.

    user@my-configurable-instance:~$ ping 10.1.1.1
    

    Também dê um ping na interface a partir de outra instância do projeto.

Ubuntu 14.04


  1. Escolha um endereço IP interno que não pertença a uma rede do seu projeto.

    Use um endereço de um intervalo particular como 10.x.x.x ou 192.168.x.x, mas não de um intervalo usado no projeto. Este exemplo usa 10.1.1.1.

  2. Crie uma instância de máquina virtual e ative o encaminhamento de IP.

    Por padrão, o Compute Engine não entregará um pacote cujo endereço IP de destino seja diferente do endereço IP da instância que o receberá. Para desabilitar essa verificação de IP de destino, ative o encaminhamento de IP para a instância.

    gcloud compute instances create my-configurable-instance --can-ip-forward
    
  3. Crie uma rota de rede estática para direcionar pacotes destinados ao 10.1.1.1 para a sua instância.

    O destino da rota estática precisa ser um endereço IP que não esteja nas redes do projeto.

    gcloud compute routes create ip-10-1-1-1 \
        --next-hop-instance my-configurable-instance \
        --next-hop-instance-zone us-central1-f \
        --destination-range 10.1.1.1/32
    
  4. Crie uma regra de firewall para permitir tráfego nesse IP.

    Nesse caso, a regra de firewall permite todo o tráfego por meio do intervalo de endereços IP 10.0.0.0/8. Adicione mais intervalos de IP ou limite o acesso, conforme necessário.

    gcloud compute firewall-rules create allow-internal \
        --allow icmp,udp,tcp --source-range 10.0.0.0/8
    
  5. Adicione uma nova interface virtual à instância.

    1. Conecte-se à sua instância com SSH.

      gcloud compute ssh my-configurable-instance
      
    2. Acrescente as seguintes linhas ao arquivo /etc/network/interfaces:

      # Change to root first
      user@my-configurable-instance:~$ sudo su -
      

      # Append the following lines
      root@my-configurable-instance:~# cat <<EOF >>/etc/network/interfaces
      auto eth0:0
      iface eth0:0 inet static
      address 10.1.1.1
      netmask 255.255.255.255
      EOF
      

    3. Reinicie a instância.

      root@my-configurable-instance:~# sudo reboot
      

  6. Verifique se a interface da instância de máquina virtual está ativa dando um ping em 10.1.1.1 de dentro da instância.

    user@my-configurable-instance:~$ ping 10.1.1.1
    

    Também dê um ping na interface a partir de outra instância do projeto.

CentOS 6


  1. Escolha um endereço IP interno que não pertença a uma rede do seu projeto.

    Use um endereço de um intervalo particular como 10.x.x.x ou 192.168.x.x, mas não de um intervalo usado no projeto. Este exemplo usa 10.1.1.1.

  2. Crie uma instância de máquina virtual e ative o encaminhamento de IP.

    Por padrão, o Compute Engine não entregará um pacote cujo endereço IP de destino seja diferente do endereço IP da instância que o receberá. Para desabilitar essa verificação de IP de destino, ative o encaminhamento de IP para a instância.

    gcloud compute instances create my-configurable-instance --can-ip-forward
    
  3. Crie uma rota de rede estática para direcionar pacotes destinados ao 10.1.1.1 para a sua instância.

    O destino da rota estática precisa ser um endereço IP que não esteja nas redes do projeto.

    gcloud compute routes create ip-10-1-1-1 \
        --next-hop-instance my-configurable-instance \
        --next-hop-instance-zone us-central1-f \
        --destination-range 10.1.1.1/32
    
  4. Crie uma regra de firewall para permitir tráfego nesse IP.

    Nesse caso, a regra de firewall permite todo o tráfego por meio do intervalo de endereços IP 10.0.0.0/8. Adicione mais intervalos de IP ou limite o acesso, conforme necessário.

    gcloud compute firewall-rules create allow-internal \
      --allow icmp,udp,tcp --source-range 10.0.0.0/8
    
  5. Adicione uma nova interface virtual à instância.

    1. Conecte-se à sua instância com SSH.

      gcloud compute ssh my-configurable-instance
      
    2. Adicione as seguintes linhas ao novo arquivo chamado /etc/sysconfig/network-scripts/ifcfg-eth0:0:

      # Change to root first
      user@my-configurable-instance:~$ sudo su -
      

      # Add the following lines
      root@my-configurable-instance:~# cat <<EOF >>/etc/sysconfig/network-scripts/ifcfg-eth0:0
      DEVICE="eth0:0"
      BOOTPROTO="static"
      IPADDR=10.1.1.1
      NETMASK=255.255.255.255
      ONBOOT="yes"
      EOF
      

    3. Acesse sua nova interface.

      root@my-configurable-instance:~# ifup eth0:0
      

  6. Verifique se a interface da instância de máquina virtual está ativa dando um ping em 10.1.1.1 de dentro da instância.

    user@my-configurable-instance:~$ ping 10.1.1.1
    

    Também dê um ping na interface a partir de outra instância do projeto.

Definir um endereço IP de origem estático

Além de definir um IP interno de destino estático, configure a instância para usar o IP interno estático como seu IP de origem na comunicação com outras máquinas virtuais.

Esta seção é somente para configurar a instância para usar o IP como um endereço de origem (IP de origem). Para que a rede direcione pacotes com esse IP de destino para a instância, defina um endereço IP de destino estático também.

Para definir o IP de origem como o IP interno estático em uma instância do Linux:

# Change to root first
user@my-configurable-instance:~$ sudo su -
# Get the next hop route of your packets
root@my-configurable-instance:~# route -n
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.240.0.1      0.0.0.0         255.255.255.255 UH    0      0        0 eth0
# Add a route, where 10.0.0.0/16 is the address range the route applies;
# replace this range with an address range of your choice.
# This means that all instance in this range will see the source IP of your
# instance as 10.1.1.1
root@my-configurable-instance:~# ip route add 10.0.0.0/16 dev eth0:0 via 10.240.0.1 src 10.1.1.1

Para testar, use a instância para dar um ping em um endereço IP do intervalo de endereços 10.0.0.0/16 na mesma rede. Por exemplo, consulte o tcpdump de uma solicitação feita a partir de uma instância com IP interno estático 10.1.1.1 para 10.0.0.2:

root@my-configurable-instance-2:~# tcpdump -npi eth0 -vv icmp or arp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:59:05.374093 IP (tos 0x0, ttl 64, id 59993, offset 0, flags [DF], proto ICMP (1), length 84)
    10.1.1.1 > 10.0.0.2: ICMP echo request, id 4319, seq 1, length 64
17:59:05.374126 IP (tos 0x0, ttl 64, id 55671, offset 0, flags [none], proto ICMP (1), length 84)
    10.0.0.2 > 10.1.1.1: ICMP echo reply, id 4319, seq 1, length 64
17:59:06.375432 IP (tos 0x0, ttl 64, id 60166, offset 0, flags [DF], proto ICMP (1), length 84)
    10.1.1.1 > 10.0.0.2: ICMP echo request, id 4319, seq 2, length 64

Configurar um proxy de rede

Projete sua rede para que apenas uma instância tenha acesso externo e todas as outras usem essa instância como um servidor proxy para comunicação externa. Isto será útil para controlar o acesso de entrada ou saída da rede ou para reduzir o custo de pagamento de vários endereços IP externos.

Este exemplo específico trata da configuração de um proxy de rede nas instâncias do Compute Engine que usam uma imagem Debian. Ele usa uma instância de gateway como um servidor proxy Squid, mas este é apenas um modo de configurar um servidor proxy.

Para configurar um servidor proxy Squid:

  1. Configure uma instância com um endereço IP externo (estático ou temporário. Neste exemplo, o nome da sua instância é gateway-instance.
  2. Configure uma ou mais instâncias sem endereços IP externos, especificando gcloud compute instances create ... --no-address. Neste exemplo, o nome da instância é hidden-instance.
  3. Aprenda a conectar-se de uma instância à outra, visto que não é possível conectar-se diretamente às suas instâncias somente internas.
  4. Adicione um firewall para permitir o tráfego TCP na porta 3128:

    gcloud compute firewall-rules create FIREWALL_RULE --network NETWORK --allow tcp:3128
    
  5. Instale o Squid em gateway-instance e configure-o para permitir acesso a partir de qualquer máquina na rede interna compartilhada (espaços de IP RFC1918, RFC4193 e RFC4291). Isso pressupõe que gateway-instance e hidden-instance estejam conectadas à mesma rede, ou seja, podem se conectar uma à outra.

    user@gateway-instance:~$ sudo apt-get install squid3
    

    Ative todas as máquinas da rede local para usar o servidor Squid3. Os comandos sed a seguir removem comentários e ativam as entradas acl localnet src nos arquivos de configuração do Squid das máquinas e redes locais.

    user@gateway-instance:~$ sudo sed -i 's:#\(http_access allow localnet\):\1:' /etc/squid3/squid.conf
    

    user@gateway-instance:~$ sudo sed -i 's:#\(http_access deny to_localhost\):\1:' /etc/squid3/squid.conf
    

    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 10.0.0.0/8.*\):\1:' /etc/squid3/squid.conf
    

    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 172.16.0.0/12.*\):\1:' /etc/squid3/squid.conf
    

    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 192.168.0.0/16.*\):\1:' /etc/squid3/squid.conf
    

    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src fc00\:\:/7.*\):\1:' /etc/squid3/squid.conf
    

    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src fe80\:\:/10.*\):\1:' /etc/squid3/squid.conf
    

    # Prevent proxy access to metadata server
    user@gateway-instance:~$ sudo cat <<EOF >>/etc/squid3/squid.conf
    acl to_metadata dst 169.254.169.254
    http_access deny to_metadata
    EOF
    

    # Start Squid
    user@gateway:~$ sudo service squid3 start
    

  6. Configure a hidden-instance para usar a gateway-instance como seu proxy. Use SSH para conectar-se à hidden-instance e defina os endereços URL do proxy que apontem para gateway-instance na porta 3128 (configuração padrão do Squid), conforme mostrado aqui:

    user@gateway-instance:~$ ssh hidden-instance
    

    user@hidden-instance:~$ sudo -s
    

    root@hidden-instance:~# echo "export http_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    

    root@hidden-instance:~# echo "export https_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    

    root@hidden-instance:~# echo "export ftp_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    

    root@hidden-instance:~# echo "export no_proxy=169.254.169.254,metadata,metadata.google.internal" >> /etc/profile.d/proxy.sh
    

    Atualize o sudoers para transmitir estas variáveis env:

    root@hidden-instance:~# cp /etc/sudoers /tmp/sudoers.new
    

    root@hidden-instance:~# chmod 640 /tmp/sudoers.new
    

    root@hidden-instance:~# echo "Defaults env_keep += \"ftp_proxy http_proxy https_proxy no_proxy"\" >>/tmp/sudoers.new
    

    root@hidden-instance:~# chmod 440 /tmp/sudoers.new
    

    root@hidden-instance:~# visudo -c -f /tmp/sudoers.new && cp /tmp/sudoers.new /etc/sudoers
    

  7. Saia de sudo, carregue as variáveis e execute apt-get em hidden-instance. Agora, isso funcionará usando o gateway como um proxy. Se o gateway não estivesse servindo como um proxy, apt-get não funcionaria, porque hidden-instance não tem conexão direta com a Internet.

    root@hidden-instance:~# exit
    

    user@hidden-instance:~$ source ~/.profile
    

    user@hidden-instance:~$ sudo apt-get update
    

Configurar uma conexão HTTP externa

As regras de firewall padrão não permitem conexões HTTP ou HTTPS com suas instâncias. No entanto, é muito simples adicionar uma regra que as permita. Observe que uma instância precisa ter um endereço IP externo para receber tráfego de fora da rede.

Adicione uma regra de firewall para permitir conexões HTTP ou HTTPS usando a ferramenta de linha de comando gcloud ou o Console do Google Cloud Platform. Isso também pode ser feito por meio da API.

Console

Use o Console do Cloud Platform para criar uma regra de firewall para todas as instâncias da rede, ou conceda o acesso de instâncias individuais a conexões HTTP e HTTPS selecionando a respectiva opção na criação dessa instância. A última opção é descrita primeiro, porque ela fornece mais controle das instâncias individuais.

  1. No console do GCP, acesse a página "Instâncias da VM".

    Acessar a página "Instâncias da VM"

  2. Clique em Criar instância.
  3. Na seção Firewall, selecione Permitir tráfego HTTP e Permitir tráfego HTTPS.
  4. Clique em Criar para criar a instância.

Marque essas caixas de seleção e o Compute Engine criará automaticamente uma regra default-http ou default-https que se aplique a todas as instâncias com as tags http-server ou https-server. Sua nova instância também será marcada com a tag apropriada, de acordo com a caixa de seleção marcada.

Se você já tem regras de firewall default-http e default-https, pode aplicá-las às instâncias existentes, ativando as opções Permitir HTTP ou Permitir HTTPS na página de detalhes da instância.

  1. Acesse a página Instâncias de VMs.
  2. Clique no nome da instância desejada.
  3. Clique no botão Editar na parte superior da página.
  4. Role para baixo até a seção Firewalls.
  5. Marque as opções Permitir HTTP ou Permitir HTTPS abaixo da rede desejada.
  6. Clique em Salvar.

Da mesma maneira, desabilite o acesso externo HTTP ou HTTPS para uma instância desmarcando uma ou ambas as caixas de seleção.

Permita que instâncias específicas sejam marcadas para tráfegos HTTP e HTTPS, em vez de criar uma regra de firewall que se aplica a todas as instâncias. Assim, o Compute Engine pode limitar as possíveis consequências de segurança relacionadas à permissão de tráfego externo a todas as máquinas virtuais de um projeto. Mas, se quiser criar uma regra de firewall que permita tráfegos HTTP ou HTTPS em todas as instâncias de máquina virtual, crie sua própria regra de firewall:

  1. Acesse a página Redes.
  2. Selecione a rede à qual você aplicará a regra de firewall.
  3. Clique em Criar novo ao lado de Regras de firewall.
  4. Dê um nome à regra de firewall e adicione tcp:80 na caixa Protocolos e portas, ou tcp:443 para tráfego HTTPS.
  5. Clique em Criar.
Ferramenta de linha de comando "gcloud"

Para permitir tráfegos HTTP e HTTPS a todas as máquinas virtuais de um projeto, use o seguinte comando para criar uma regra de firewall que permite solicitações HTTP e HTTPS de entrada de qualquer lugar para qualquer instância conectada a essa rede.

gcloud compute firewall-rules create FIREWALL_RULE --allow tcp:80,tcp:443

**Exemplo**

gcloud compute firewall-rules create sample-http \
 --description "Incoming http and https allowed." \
 --allow tcp:80,tcp:443
gcloud compute firewall-rules describe sample-http
allowed:
- IPProtocol: tcp
  ports:
  - '80'
  - '443'
creationTimestamp: '2014-06-13T13:27:12.206-07:00'
id: '5057780722612413546'
kind: compute#firewall
name: sample-http
network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/samplehttp
sourceRanges:
- 0.0.0.0/0

Configurar um gateway de NAT

Veja neste exemplo a configuração do gateway em uma rede legada. Ajuste os intervalos exibidos da rede para usar uma sub-rede.

Crie cenários de rede mais complexos para fazer alterações na Coleção de rotas. Nesta seção, há informações sobre como configurar uma instância de gateway de conversão de endereços de rede (NAT, na sigla em inglês) que direcione o tráfego das instâncias de máquina virtual somente internas para a Internet. Use um só endereço IP externo para enviar tráfego de várias instâncias de máquina virtual, mas exponha somente uma máquina virtual na Internet.

  1. Para começar, crie uma rede do GCP para hospedar as instâncias de máquina virtual desse cenário. Neste exemplo, o intervalo da rede legada usado é 10.240.0.0/16 com um gateway 10.240.0.1. No entanto, selecione seu próprio intervalo IPv4 e o endereço de gateway. Também crie uma rede de sub-rede.

    gcloud compute networks create gce-network \
        --mode legacy \
        --range 10.240.0.0/16
    
  2. Crie regras de firewall para permitir conexões SSH na rede recém-criada.

    gcloud compute firewall-rules create gce-network-allow-ssh --allow tcp:22 --network gce-network
    gcloud compute firewall-rules create gce-network-allow-internal --allow tcp:1-65535,udp:1-65535,icmp \
        --source-ranges 10.240.0.0/16 --network gce-network
    
  3. Crie uma máquina virtual para atuar como um gateway de NAT na rede gce-network ou default.

    gcloud compute instances create nat-gateway --network gce-network --can-ip-forward \
        --zone us-central1-a \
        --image-family debian-8 \
        --image-project debian-cloud \
        --tags nat
    
  4. Marque todas as instâncias de máquina virtual sem endereço IP externo que usarão a instância de gateway com a tag no-ip, ou crie uma máquina virtual sem endereço IP externo e marque a instância com a tag no-ip.

    • Adicione tags a uma instância existente.

      gcloud compute instances add-tags existing-instance --tags no-ip
      
    • Como alternativa, crie uma máquina virtual sem endereço IP externo.

      gcloud compute instances create example-instance --network gce-network --no-address \
          --zone us-central1-a \
          --image-family debian-8 \
          --image-project debian-cloud \
          --tags no-ip
      
  5. Crie uma rota para enviar o tráfego destinado à Internet por meio da instância de gateway.

    gcloud compute routes create no-ip-internet-route --network gce-network \
        --destination-range 0.0.0.0/0 \
        --next-hop-instance nat-gateway \
        --next-hop-instance-zone us-central1-a \
        --tags no-ip --priority 800
    

    Defina a prioridade dessa rota para garantir que ela prevaleça quando há outras rotas conflitantes. A prioridade padrão é 1.000 e um valor menor que 1.000 terá precedência.

  6. Depois acesse a instância de gateway e configure o iptables como tráfego interno de NAT para a Internet.

    gcloud compute ssh nat-gateway --zone us-central1-a
    

    Na instância, configure o iptables:

    $ sudo sysctl -w net.ipv4.ip_forward=1
    

    $ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    

    O primeiro comando sudo indica ao kernel que é preciso permitir o encaminhamento de IP. O segundo comando sudo mascara os pacotes recebidos de instâncias internas como se fossem enviados da instância de gateway de NAT.

Configurar um gateway de VPN

Esta seção descreve a instalação do software de VPN strongSwan em uma das instâncias. Pressupõe-se uma rede legada. Quanto à VPN do Compute Engine, consulte VPN do Cloud.

Nesta seção é descrito um exemplo de cenário que conecta uma instância de gateway de VPN do Compute Engine a um gateway de VPN baseado em Debian na rede que não é do Cloud. Esse cenário é apenas um exemplo e talvez não seja adequado à sua rede. Para mais informações, consulte o administrador da rede.

  1. Para começar, crie uma rede do Compute Engine para conexão via VPN.

    gcloud compute networks create gce-network --range 10.120.0.0/16
    
  2. Crie uma máquina virtual de gateway de VPN em gce-network.

    gcloud compute instances create vpn-gateway --can-ip-forward \
        --network gce-network \
        --zone us-central1-a \
        --image debian-7 \
        --tags vpn
    
  3. Anote o endereço IP interno da máquina virtual que você criou executando o seguinte comando:

    gcloud compute instances describe --zone us-central1-a vpn-gateway
    

    Observe o endereço ao lado de networkIP (não natIP). Ele tem que começar com 10.120.x.x.

  4. Crie uma máquina virtual de gateway não VPN "básico" para comunicar-se com a rede local.

    gcloud compute instances create povm-1 --network gce-network --image debian-7 --tags vpn --zone us-central1-a
    
  5. Crie uma rota em gce-network para direcionar o tráfego por meio do vpn-gateway, caso o destino seja sua rede local.

    gcloud compute routes create gce-network-via-gateway --destination-range LOCAL_NETWORK_ADDRESS_SPACE \
        --next-hop-address VPN_GATEWAY_NETWORK_IP \
        --network gce-network \
        --tags vpn
    

    O valor de VPN_GATEWAY_NETWORK_IP precisa ser o networkIp que você anotou na etapa 3.

  6. Adicione as seguintes regras de firewall do Compute Engine para que sua rede do Compute Engine aceite o tráfego de entrada.

    gcloud compute firewall-rules create ssh --source-ranges 0.0.0.0/0 --allow tcp:22 --network gce-network
    
    gcloud compute firewall-rules create  allow-internal --source-ranges 10.120.0.0/16 --allow tcp:1-65535,udp:1-65535,icmp \
        --network gce-network --target-tags vpn
    
    gcloud compute firewall-rules create allow-ipsec-nat --source-ranges IP_LOCAL_VPN_GATEWAY/32 \
        --allow udp:4500,udp:500 --network gce-network --target-tags vpn
    
    gcloud compute firewall-rules create allow-all-peer --source-ranges LOCAL_NETWORK_ADDRESS_SPACE \
        --allow tcp:1-65535,udp:1-65535,icmp --network gce-network --target-tags vpn
    

    Também pode ser necessário definir configurações do firewall na rede local para aceitar o tráfego de entrada da rede do Compute Engine. Este processo pode variar, dependendo da rede.

  7. Instale o software de VPN e configure o sistema operacional convidado do gateway. Você precisará do endereço IP externo da máquina do gateway. Execute este comando:

    gcloud compute instances describe vpn-gateway
    

    Copie o endereço IP externo e crie um arquivo chamado ipsec.conf na instância de gateway da máquina virtual. Preencha-o com o seguinte conteúdo:

    conn myconn
      authby=psk
      auto=start
      dpdaction=hold
      esp=aes128-sha1!
      forceencaps=yes
      ike=aes128-sha1-modp2048!
      keyexchange=ikev2
      mobike=no
      type=tunnel
      left=%any
      leftid=<vpn-vm-gateway-external-address>
      leftsubnet=<internal-ip-subnet>
      leftauth=psk
      leftikeport=4500
      right=<public-ip-of-your-local-vpn-gateway-machine>
      rightsubnet=<your-local-network-address-space>
      rightauth=psk
      rightikeport=4500
    

    O valor de <internal-ip-subnet> precisa ser 10.120.0.0/16 ou 10.240.0.0/16, baseado no valor de internal-ip que você anotou na etapa 3.

    Agora, execute os seguintes comandos, substituindo <secret-key> por uma chave secreta de sua escolha:

    $ sudo apt-get update
    

    $ sudo apt-get install strongswan -y
    

    $ echo "%any : PSK \"<secret-key>\"" | sudo tee /etc/ipsec.secrets > /dev/null
    

    $ sudo sysctl -w net.ipv4.ip_forward=1
    

    $ sudo cp ipsec.conf /etc
    

    $ sudo ipsec restart
    

    $ sudo ipsec up myconn
    

    Desde que sua máquina de gateway local esteja executando um sistema operacional baseado em Debian, use as mesmas etapas para instalar a VPN na máquina local. Faça uma cópia do arquivo ipsec.conf com as seguintes alterações na máquina de gateway local:

    conn myconn
      authby=psk
      auto=start
      dpdaction=hold
      esp=aes128-sha1!
      forceencaps=yes
      ike=aes128-sha1-modp2048!
      keyexchange=ikev2
      mobike=no
      type=tunnel
      left=%any
      leftid=<public-ip-of-local-VPN-gateway-machine>
      leftsubnet=<your-local-network-address-space>
      leftauth=psk
      leftikeport=4500
      rightid=<vpn-vm-gateway-external-address>
      rightsubnet=10.120.0.0/16
      rightauth=psk
      rightikeport=4500
    

    Execute os mesmos comandos descritos acima na máquina de gateway de VPN local.

  8. Teste:

    gcloud compute ssh povm-1 --command 'ping -c 3 LOCAL_NETWORK_EXTERNAL_ADDRESS'
    

Solução de problemas

Se você tiver problemas com a configuração da VPN, mesmo seguindo as instruções acima, tente estas dicas para solucioná-los:

  1. Determine se os dois pontos de extremidade da VPN conseguem se comunicar.

    Use netcat para enviar o tráfego como VPN (UDP, porta 4500). Execute o seguinte comando no ponto de extremidade de VPN local:

    $ echo | nc -u  4500
    

    Execute tcpdump no ponto de recebimento para determinar se a instância do Compute Engine consegue receber o pacote na porta 4500:

    $ tcpdump -nn -n host  -i any
    

  2. Ative o registro mais detalhado adicionando as seguintes linhas aos arquivos ipsec.conf:

    config setup
      charondebug="ike 3, mgr 3, chd 3, net 3"
    
    conn myconn
      authby=psk
      auto=start
      ...
    

    Depois tente a conexão novamente. Se ainda houver falha na conexão, verifique o registro de erros. O arquivo de registros está localizado em /var/log/charon.log na instância do Compute Engine.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Compute Engine