Como usar o encaminhamento de protocolos

Com o encaminhamento de protocolos do Compute Engine, é possível criar objetos de regra de encaminhamento que possibilitam o envio de pacotes para uma instância de destino sem NAT. Cada instância de destino contém uma única instância de máquina virtual (VM, na sigla em inglês) que recebe e processa o tráfego das regras de encaminhamento correspondentes.

O encaminhamento de protocolos pode ser usado em vários cenários, como os seguintes:

Para hospedagem virtual por IPs, redes privadas virtuais (VPN) e balanceamento de carga, o Compute Engine permite o encaminhamento dos seguintes protocolos:

Para VIPs privados, apenas TCP e UDP são aceitos:

A taxa cobrada pelo encaminhamento de protocolos é a mesma do serviço de balanceamento de carga. Para mais informações, leia a página de preços.

Antes de começar

Para mais informações, consulte Visão geral do controle de acesso.

Guia de início rápido

Neste guia de início rápido, consideramos que você esteja familiarizado com o bash.

Para criar uma regra de encaminhamento que envie tráfego para uma única instância:

  1. Crie uma instância de destino.

    Ela é uma instância de VM única, mas pode existir no momento em que você a cria ou pode ser criada posteriormente.

  2. Crie uma regra de encaminhamento.

    A instância de destino já precisa existir antes da criação de uma regra de encaminhamento. Se os pacotes de entrada corresponderem ao IP, ao protocolo e, se aplicável, ao intervalo de portas exibido pela regra de encaminhamento, essa regra direcionará o tráfego para a instância de destino.

Nas instruções a seguir, as etapas acima serão demonstradas com detalhes:

  1. Como configurar um servidor Apache em uma instância de VM.
  2. Como criar uma instância de destino e as regras de encaminhamento correspondentes.
  3. Enviar tráfego para uma única instância de destino.

Ao concluir este guia de início rápido, você terá condições de configurar o encaminhamento de protocolos de várias regras de encaminhamento para uma única instância de destino.

Configurar uma instância de VM e instalar o Apache

Para criar uma única instância de VM com o Apache instalado:

  1. Crie alguns scripts de inicialização para a nova instância.

    Dependendo do sistema operacional, o conteúdo do script de inicialização pode ser diferente.

    • Se você pretende usar uma imagem do Debian na instância, execute o seguinte comando:

      me@local:~$ echo "sudo apt update && sudo apt -y install apache2 && mkdir -p /var/www1 &&
      mkdir -p /var/www2 && mkdir -p /var/www3 && hostname > /var/www/html/index.html &&
      echo w1 > /var/www1/index.html && echo w2 > /var/www2/index.html && echo w3 > /var/www3/index.html" > 
      $HOME/pf_startup.sh

    • Se você pretende usar uma imagem do CentOS na instância, execute o seguinte comando:

      me@local:~$ echo "sudo yum -y install httpd && sudo service httpd restart && mkdir -p /var/www1 &&
      mkdir -p /var/www2 && mkdir /var/www3 && hostname > /var/www/html/index.html &&
      echo w1 > /var/www1/index.html && echo w2 > /var/www2/index.html && echo w3 > /var/www3/index.html" > 
      $HOME/pf_startup.sh

  2. Crie uma tag para a futura VM, a fim de ajudar a aplicar um firewall a ela posteriormente:

    me@local:~$ TAG="www-tag"
    
  3. Crie uma instância de VM para processar o tráfego das regras de encaminhamento:

    gcloud compute instances create pf-instance \
        --image-project debian-cloud --image-family debian-9 --tags $TAG \
        --metadata-from-file startup-script=$HOME/pf_startup.sh
    
  4. Crie uma regra de firewall a fim de permitir o tráfego externo para essa instância de VM:

    gcloud compute firewall-rules create www-firewall --target-tags $TAG --allow tcp
    

Você configurou uma instância de VM. Agora comece a configurar o encaminhamento de protocolos.

Criar uma instância de destino e as regras de encaminhamento correspondentes

  1. Crie uma instância de destino.

    As instâncias de destino incluem uma única instância de VM que recebe e processa o tráfego de uma regra de encaminhamento. Elas não têm uma política de NAT e, por isso, podem ser usadas para configurar as conexões VPN por meio dos protocolos IPsec (em inglês) diretamente.

    Crie uma instância de destino antes de um objeto de regra de encaminhamento. Esse tipo de regra precisa referir-se a um recurso de destino atual. Não é possível criar uma regra de encaminhamento que direcione o tráfego para um recurso de destino inexistente. Neste exemplo, crie uma instância de destino da seguinte maneira:

    gcloud compute target-instances create pf-target-instance --instance pf-instance
    
  2. Crie objetos de regra de encaminhamento.

    Em um objeto de regra de encaminhamento, o tráfego que corresponde ao protocolo IP e à porta é direcionado para uma instância de destino especificada. Para mais informações, consulte a documentação sobre regras de encaminhamento.

    Neste exemplo, os comandos a seguir criam três regras de encaminhamento, cada uma com um endereço IP temporário que encaminha o tráfego TCP para sua instância de destino. Se você preferir e tiver alguns endereços IP externos estáticos, use-os com essas regras de encaminhamento especificando a sinalização --address IP-ADDRESS.

    gcloud compute forwarding-rules create pf-rule1 --ip-protocol TCP \
        --ports 80 --target-instance pf-target-instance
    
    gcloud compute forwarding-rules create pf-rule2 --ip-protocol TCP \
        --ports 80 --target-instance pf-target-instance
    
    gcloud compute forwarding-rules create pf-rule3 --ip-protocol TCP \
        --ports 80 --target-instance pf-target-instance
    

Comece a enviar o tráfego para sua instância de destino.

Enviar o tráfego para a instância

  1. Receba os endereços IP externos das novas regras de encaminhamento.

    Execute gcloud compute forwarding-rules list para conseguir os endereços IP externos das suas regras de encaminhamento. Por exemplo, a tabela a seguir lista os endereços IP temporários alocados para as regras de encaminhamento que já foram criadas.

    Se você usar endereços IP reservados, eles serão listados aqui no lugar dos endereços IP temporários.

    gcloud compute forwarding-rules list
    
    NAME     REGION      IP_ADDRESS     IP_PROTOCOL TARGET
    pf-rule1 us-central1 [ADDRESS_1]    TCP         us-central1-a/targetInstances/pf-target-instance
    pf-rule2 us-central1 [ADDRESS_2]    TCP         us-central1-a/targetInstances/pf-target-instance
    pf-rule3 us-central1 [ADDRESS_3]    TCP         us-central1-a/targetInstances/pf-target-instance

    Anote os endereços IP para a próxima etapa.

  2. Configure os hosts virtuais Apache da instância de VM para exibir informações diferentes com base no URL de destino.

    Primeiramente, conecte-se à instância:

    gcloud compute ssh pf-instance
    

    Em seguida, edite o arquivo /etc/apache2/sites-enabled/000-default.conf e adicione as linhas a seguir. Para as linhas VirtualHostcd.., use os endereços IP que você viu quando executou a etapa anterior.

    <VirtualHost [ADDRESS_1]>
     DocumentRoot /var/www1
     <Directory /var/www1>
      Require all granted
     </Directory>
    </VirtualHost>
    <VirtualHost [ADDRESS_2]>
     DocumentRoot /var/www2
     <Directory /var/www2>
      Require all granted
     </Directory>
    </VirtualHost>
    <VirtualHost [ADDRESS_3]>
     DocumentRoot /var/www3
     <Directory /var/www3>
      Require all granted
     </Directory>
    </VirtualHost>
    

    Por fim, reinicie o Apache:

    user@myinst:~$ sudo /etc/init.d/apache2 restart
    
  3. Teste o envio de tráfego para sua instância.

    Na máquina local, faça uma solicitação para os endereços IP externos exibidos pelas regras de encaminhamento criadas.

    Use curl para enviar o tráfego para os endereços IP. A resposta retorna w1, w2 ou w3, dependendo do endereço IP.

    me@local:~$curl [ADDRESS_1]
    w1
    
    me@local:~$ curl [ADDRESS_2]
    w2
    
    me@local:~$ curl [ADDRESS_3]
    w3
    

    A configuração de encaminhamento de protocolos está pronta.

Regras de encaminhamento

As regras de encaminhamento funcionam em conjunto com pools e instâncias de destino para oferecer suporte a recursos de balanceamento de carga e encaminhamento de protocolo. Para usar o balanceamento de carga e o encaminhamento de protocolo, crie uma regra de encaminhamento que direcione o tráfego para pools de destino específicos, no caso do balanceamento de carga, ou instâncias de destino, no caso do encaminhamento de protocolo. Não é possível usar esses recursos sem uma regra de encaminhamento.

Os recursos de regra de encaminhamento fazem parte da coleção Regras de encaminhamento. Cada regra corresponde a um determinado endereço IP, protocolo e, opcionalmente, um intervalo de portas para um único pool ou instância de destino. Quando há envio de tráfego para um endereço IP externo veiculado por uma regra de encaminhamento, esse tráfego é direcionado para as instâncias ou pool de destino. Crie até 50 objetos de regra de encaminhamento por projeto.

Alguns pontos que precisam ser considerados ao trabalhar com regras de encaminhamento:

  • O nome de uma regra precisa ser exclusivo no projeto, ter de 1 a 63 caracteres e coincidir com a expressão regular [a-z]([-a-z0-9]*[a-z0-9])?. Isso significa que o primeiro caractere precisa ser uma letra minúscula, e todos os seguintes precisam ser hífen, letra minúscula ou dígito, exceto o último, que não pode ser um hífen.

  • Caso nenhum protocolo de regra de encaminhamento seja especificado, o padrão TCP será usado. Além disso, alguns protocolos só podem ser usados com pools ou instâncias de destino:

    • Se você usar ESP, AH, SCTP ou ICMP, especifique uma instância de destino. Não é possível especificar um pool de destino ao usar esses protocolos.
    • Se você usar TCP ou UDP, especifique um pool de destino ou uma instância de destino.
  • Intervalos de portas somente podem ser especificados nos protocolos TCP, UDP e SCTP.

Adicionar uma regra de encaminhamento

Para adicionar uma nova regra de encaminhamento, use o comando gcloud compute forwarding-rules create ou crie uma solicitação HTTP POST para o conjunto de regras de encaminhamento. Veja a seguir um exemplo de como criar uma regra de encaminhamento para uma instância de destino usando a ferramenta de linha de comando gcloud:

gcloud compute forwarding-rules create [FORWARDING_RULE] \
    --load-balancing-scheme internal | external \
    --region [REGION] \
    [--target-instance-zone [ZONE]] \
    --ip-protocol TCP --ports 80 \
    --target-instance [TARGET_INSTANCE]

Se você omitir a sinalização --target-instance-zone, a ferramenta de linha de comando gcloud solicitará que escolha uma zona se não tiver definido a propriedade compute/zone com gcloud config set compute/zone. Para mais informações, consulte Definir propriedades padrão.

O comando gcloud compute forwarding-rules create permite a configuração de uma instância de destino como destino quando o esquema de balanceamento de carga é interno.

No exemplo a seguir, mostramos a criação de uma regra de encaminhamento para um pool de destino:

gcloud compute forwarding-rules create [FORWARDING_RULE] \
    --target-pool [TARGET_POOL] \
    [--region [REGION]]

Se você omitir a sinalização --region, a ferramenta de linha de comando gcloud solicitará que escolha uma região se não tiver definido a propriedade compute/region com gcloud config set compute/region. Para mais informações, consulte Definir propriedades padrão.

Para ver a descrição completa das sinalizações que podem ser usadas, consulte o comando create (em inglês) ou o tipo gcloud compute forwarding-rules create --help das regras de encaminhamento.

Para adicionar uma regra de encaminhamento usando a API, faça uma solicitação HTTP POST para o seguinte URI:

https://compute.googleapis.com/compute/v1/projects/myproject/regions/us-central1/forwardingRules

O corpo da solicitação deve incluir os seguintes campos:

{
 "name": "example-forwarding-rule",
 "IPAddress": "`10.1.1.1",
 "IPProtocol": "TCP",
 "portRange": "80",
 "target": "zones/us-central1-f/targetInstances/example-target-instances"
}

Para informações sobre como listar regras de encaminhamento, acessar detalhes sobre uma regra específica e excluí-las, consulte as páginas de referência da API e do SDK da gcloud:

Instâncias de destino

Um recurso de instância de destino inclui uma instância de VM que processa o tráfego de uma ou mais regras de encaminhamento. Ele é ideal para encaminhar determinados tipos de tráfego de protocolo que devem ser gerenciados por uma única fonte (ex. ESP e AH), mas também é possível usar uma instância de destino para os protocolos TCP e UDP. As instâncias de destino não têm uma política de NAT aplicada a elas. Portanto, elas podem ser usadas para tráfego que exige tráfego IPsec sem NAT em redes privadas virtuais (VPN, na sigla em inglês).

As instâncias de destino precisam estar na mesma região que a regra de encaminhamento. Elas também precisam estar na mesma zona que a instância de VM. Por exemplo, se a regra de encaminhamento estiver em us-central1, e a instância que você quer usar estiver em us-central1-a, a instância de destino precisará estar em us-central1-a. Se a instância estiver em us-central1-b, a instância de destino também precisará estar em us-central1-b.

Adicionar uma instância de destino

Para adicionar uma nova instância de destino, use o comando gcloud compute target-instances ou crie uma solicitação HTTP POST para a coleção targetInstances. Não é possível criar recursos de instância de destino usando o Console do Cloud. No exemplo a seguir, você verá como criar uma instância de destino usando a ferramenta de linha de comando gcloud:

gcloud compute target-instances create [TARGET_INSTANCE] --instance INSTANCE

Se você omitir a sinalização --zone, a ferramenta de linha de comando gcloud solicitará que escolha uma zona se não tiver definido a propriedade compute/zone com gcloud config set compute/zone. Para mais informações, consulte Definir propriedades padrão.

Para ver a descrição completa das sinalizações que podem ser usadas, consulte o comando create (em inglês) ou tipo gcloud compute target-instances create --help.

Na API, faça uma solicitação HTTP POST para o seguinte URI:

https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/targetInstances

Use o seguinte corpo de solicitação:

body = {
  "name": "example-target-instance",
  "instance": "zones/us-central1-f/instances/example-instance"
}

Para informações sobre como listar instâncias de destino, acessar detalhes sobre uma instância específica e excluí-las, consulte as páginas de referência da API e do SDK da gcloud:

Encaminhamento de protocolos para VIPs privados

O encaminhamento de protocolo pode ser usado para regras de encaminhamento regional particular. Use esse recurso para configurar regras de encaminhamento particular que enviem tráfego TCP ou UDP para uma instância de destino na mesma região. Também é possível alternar facilmente as regras de encaminhamento regionais particulares usando instâncias de destino para serviços de back-end e vice-versa.

Uma instância de destino contém uma instância de back-end que processa o tráfego de uma ou mais regras de encaminhamento. Você só pode configurar uma regra de encaminhamento particular para apontar para cada instância de destino.

Regra de encaminhamento privada com uma instância de destino (clique para ampliar).
Regra de encaminhamento privada com uma instância de destino (clique para ampliar)

Use o encaminhamento de protocolos com regras de encaminhamento privadas nas situações a seguir.

  • Você quer implantar uma única instância de back-end para o serviço e gerenciar verificações de integridade e outros aspectos por conta própria.
  • Você quer preservar um endereço de IP particular de regra de encaminhamento e alterar a instância de destino para onde a regra de encaminhamento aponta.
  • Você quer manter sua implantação estável, tendo a capacidade de mudar facilmente para várias instâncias de back-end (serviço de back-end) de uma única instância (instância de destino) sem alterar o endereço IP da regra de encaminhamento particular.

Transição entre uma instância de destino e um serviço de back-end

É possível atualizar uma regra de encaminhamento particular de direcionar o tráfego para uma instância de destino com uma única instância de VM para direcionar o tráfego para um serviço de back-end ou o inverso. Quando a regra de encaminhamento privada é atualizada dessa maneira, o endereço IP dela é preservado. As conexões atuais podem ser interrompidas durante essa transição, porque a alteração ativa ou desativa o balanceamento de carga das instâncias do serviço de back-end.

Transição de um serviço de back-end para uma instância de destino (clique para ampliar).
Transição de um serviço de back-end para uma instância de destino (clique para ampliar)

Apenas é possível fazer a transição entre uma instância de destino e um serviço de back-end com regras de encaminhamento privadas. Não é possível fazer isso com encaminhamento de protocolos que usa regras de encaminhamento externas.

Como atualizar o destino de uma regra de encaminhamento privada

Se a regra de encaminhamento for particular, em vez de apontar para uma instância de destino, é possível apontar para um serviço de back-end:

    gcloud compute forwarding-rules set-target my-forwarding-rule
        --backend-service my-backend-service

Em seguida, é possível voltar para uma instância de destino:

    gcloud compute forwarding-rules set-target my-forwarding-rule
        --target-instance my-target-instance

Como aplicar configurações de encaminhamento de protocolo a um projeto, uma pasta ou uma organização

Use uma política da organização para restringir os tipos de encaminhamento de protocolo que podem ser criados na organização. Defina a seguinte restrição de política da organização:

constraints/compute.restrictProtocolForwardingCreationForTypes

Ao definir a restrição compute.restrictProtocolForwardingCreationForTypes, você especifica os tipos de encaminhamento de protocolo que não são permitidos. Para uma lista de tipos disponíveis, consulte Restringir a criação de encaminhamento de protocolo.

Como configurar uma política da organização

Console

Para definir uma política da organização de encaminhamento de protocolo no console, conclua as seguintes etapas:

  1. No Console do Google Cloud, acesse a página Políticas da organização.

    Acessar a página "Políticas da organização"

  2. No campo Filtro, digite protocol e selecione constraints/compute.restrictProtocolForwardingCreationForTypes.
  3. Clique em Restringir encaminhamento de protocolo com base no tipo de endereço IP.
  4. Clique em Editar para editar as restrições atuais da política de encaminhamento de protocolo.
  5. Para criar uma política personalizada, selecione Personalizar.
  6. Depois de fazer alterações, clique em Salvar para aplicar as configurações de restrição.

gcloud

Para definir uma política da organização de encaminhamento de protocolo, use o comando gcloud resource-manager org-policies enable-enforce.

  1. Encontre o ID da sua organização.

    gcloud organizations list
  2. Crie o arquivo de política, conforme mostrado nos exemplos a seguir.

    Listar os valores a serem negados

    {
      "constraint": "constraints/compute.restrictProtocolForwardingCreationForTypes",
       "listPolicy": {
         "deniedValues": [
           "INTERNAL",
           "EXTERNAL"
         ]
       }
     }
     

    Permitir regras de encaminhamento interno

    {
      "constraint": "constraints/compute.restrictProtocolForwardingCreationForTypes",
       "listPolicy": {
         "deniedValues": [
           "EXTERNAL"
         ]
       }
     }
     

    Negar todas as regras de encaminhamento

    {
      "constraint": "constraints/compute.restrictProtocolForwardingCreationForTypes",
      "listPolicy": {
        "allValues": "DENY"
      }
    }
    
  3. Defina a restrição na sua organização. Substitua ORGANIZATION_ID pelo ID da organização.

    gcloud resource-manager org-policies set-policy POLICY_FILE \
        --organization=ORGANIZATION_ID
    

    É possível também aplicar a política da organização de encaminhamento de protocolo a uma pasta ou um projeto com as sinalizações --folder ou --project e o ID da pasta e do projeto, respectivamente.

    Para pastas, execute o seguinte comando:

    gcloud resource-manager org-policies set-policy POLICY_FILE \
        --folder=FOLDER_ID
    

    Para projetos, execute o seguinte comando:

    gcloud resource-manager org-policies set-policy POLICY_FILE \
        --project=PROJECT_ID
    

    Substitua:

Depois de definir a política, ela será aplicada ao adicionar as respectivas regras de encaminhamento do Google Cloud.

A restrição não é aplicada às configurações de encaminhamento de protocolo atuais.

Se você tentar criar um encaminhamento de protocolo de um tipo que viole a restrição, a tentativa falhará, e uma mensagem de erro será gerada. A mensagem de erro tem o seguinte formato:

Constraint constraints/compute.restrictProtocolForwardingCreationForTypes
violated for projects/PROJECT_NAME. Forwarding Rule projects/PROJECT_NAME/region/REGION/forwardingRules/FORWARDING_RULE_NAME
of type SCHEME is not allowed.

Se você definir várias restrições restrictProtocolForwardingCreationForTypes em diferentes níveis de recursos e definir o campo inheritFromParent como true, as restrições serão aplicadas hierarquicamente.

Para saber mais sobre como definir políticas da organização, incluindo descrições das opções disponíveis, consulte Como criar e gerenciar políticas da organização e Como usar restrições.

Restrições

  • Quando você usa instâncias de destino com regras de encaminhamento particular, os únicos protocolos compatíveis são TCP e UDP.

Limites

  • É possível configurar 100 regras de encaminhamento particular apontando para instâncias de destino por rede.

  • É possível ter cinco portas por regra de encaminhamento privada.

A seguir