Use regras de firewall da VPC

Esta página descreve os comandos para trabalhar com regras da firewall da nuvem virtual privada (VPC) e oferece alguns exemplos de como as usar. As regras da firewall da VPC permitem-lhe autorizar ou negar tráfego para ou a partir de instâncias de máquinas virtuais (VMs) numa rede da VPC com base no número da porta, na etiqueta ou no protocolo.

Antes de começar

Para saber mais sobre as regras de firewall da VPC, como as regras implícitas e as regras geradas pelo sistema para redes predefinidas, consulte o artigo Regras de firewall da VPC.

Antes de configurar as regras da firewall, reveja os componentes das regras da firewall para se familiarizar com os componentes da firewall usados no Google Cloud.

Crie regras de firewall da VPC

As regras de firewall de VPC são definidas ao nível da rede e aplicam-se apenas à rede onde são criadas. No entanto, o nome que escolher para cada uma delas tem de ser exclusivo para o projeto.

Uma regra de firewall pode conter intervalos IPv4 ou IPv6, mas não ambos.

Quando cria uma regra de firewall, pode optar por ativar o registo das regras de firewall. Se ativar o registo, pode omitir campos de metadados para poupar custos de armazenamento. Para mais informações, consulte o artigo Usar o registo de regras da firewall.

Se quiser especificar várias contas de serviço para o campo de conta de serviço de destino ou de origem, use a CLI Google Cloud, a API ou as bibliotecas de cliente.

A rede predefinida fornece regras de firewall automáticas no momento da criação. As redes no modo personalizado e automático permitem-lhe criar facilmente firewalls semelhantes durante a criação da rede se estiver a usar a Google Cloud consola. Se estiver a usar a CLI gcloud ou a API e quiser criar regras de firewall semelhantes às que a rede predefinida oferece, consulte o artigo Configure regras de firewall para casos de utilização comuns.

Consola

  1. Na Google Cloud consola, aceda à página Políticas de firewall.

    Aceder a Políticas de firewall

  2. Clique em Criar regra de firewall.

  3. Introduza um nome para a regra de firewall.

    Este nome tem de ser exclusivo para o projeto.

  4. (Opcional) Pode ativar o registo de regras de firewall:

    • Clique em Registos > Ativar.
    • Para omitir metadados, clique em Mostrar detalhes dos registos e, de seguida, desmarque a caixa de verificação Incluir metadados.
  5. Especifique a rede para a regra de firewall.

  6. Especifique a Prioridade da regra.

    Quanto menor o número, maior a prioridade.

  7. Para a Direção do tráfego, escolha entrada ou saída.

  8. Para a Ação na correspondência, escolha permitir ou recusar.

  9. Especifique os alvos da regra.

    • Se quiser aplicar a regra a todas as instâncias na rede, escolha Todas as instâncias na rede.
    • Se quiser que a regra se aplique a instâncias selecionadas por etiquetas de segmentação (destino), escolha Etiquetas de segmentação especificadas e, de seguida, no campo Etiquetas de segmentação, escreva as etiquetas às quais a regra se deve aplicar.
    • Se quiser que a regra se aplique a instâncias selecionadas pela conta de serviço associada, escolha Conta de serviço especificada, indique se a conta de serviço está no projeto atual ou noutro em Âmbito da conta de serviço e, em seguida, no campo Conta de serviço de destino, escolha ou escreva o nome da conta de serviço.
  10. Para uma regra de entrada, especifique o filtro de origem:

    • Para filtrar o tráfego de entrada por intervalos IPv4 de origem, selecione Intervalos IPv4 e, de seguida, introduza os blocos CIDR no campo Intervalos IPv4 de origem. Use 0.0.0.0/0 para qualquer origem IPv4.
    • Para filtrar o tráfego de entrada por intervalos IPv6 de origem, selecione Intervalos IPv6 e, de seguida, introduza os blocos CIDR no campo Intervalos IPv6 de origem. Use ::/0 para qualquer origem IPv6.
    • Para filtrar o tráfego recebido por etiqueta de rede, escolha Etiquetas de origem e, de seguida, escreva as etiquetas de rede no campo Etiquetas de origem. Para ver o limite do número de etiquetas de origem, consulte os limites por rede. A filtragem por etiqueta de origem só está disponível se o destino não for especificado por uma conta de serviço.
    • Para filtrar o tráfego recebido por conta de serviço, escolha Conta de serviço, indique se a conta de serviço está no projeto atual ou noutro em Âmbito da conta de serviço e, em seguida, escolha ou escreva o nome da conta de serviço no campo Conta de serviço de origem. A filtragem por conta do serviço de origem só está disponível se o destino não for especificado pela etiqueta de rede.
    • Especifique um Filtro de segunda origem, se quiser. Os filtros de origem secundária não podem usar os mesmos critérios de filtragem que os da origem principal. Os intervalos de IPs de origem podem ser usados em conjunto com etiquetas de origem ou conta de serviço de origem. O conjunto de origens efetivo é a união dos endereços IP do intervalo de origens e das instâncias identificadas por etiquetas de rede ou contas de serviço. Ou seja, se o intervalo de IPs de origem ou as etiquetas de origem (ou as contas de serviço de origem) corresponderem aos critérios de filtro, a origem é incluída no conjunto de origens eficaz.
    • Não é possível usar etiquetas de origem e conta de serviço de origem em conjunto.

    Para mais informações sobre a utilização de uma conta de serviço e uma etiqueta de rede, consulte o artigo Filtrar por conta de serviço em comparação com etiqueta de rede.

  11. Para uma regra de entrada, especifique o Filtro de destino:

    • Para filtrar o tráfego de entrada por intervalos IPv4 de destino, selecione Intervalos IPv4 e introduza os blocos CIDR no campo Intervalos IPv4 de destino. Use 0.0.0.0/0 para qualquer destino IPv4.
    • Para filtrar o tráfego de entrada por intervalos IPv6 de destino, selecione Intervalos IPv6 e introduza os blocos CIDR no campo Intervalos IPv6 de destino. Use ::/0 para qualquer destino IPv6.

    Para mais informações, consulte o artigo Destino para regras de entrada.

  12. Para uma regra de saída, especifique o filtro de destino:

    • Para filtrar o tráfego de saída por intervalos IPv4 de destino, selecione Intervalos IPv4 e introduza os blocos CIDR no campo Intervalos IPv4 de destino. Use 0.0.0.0/0 para qualquer destino IPv4.
    • Para filtrar o tráfego de saída por intervalos IPv6 de destino, selecione Intervalos IPv6 e introduza os blocos CIDR no campo Intervalos IPv6 de destino. Use ::/0 para qualquer destino IPv6.

    Para mais informações, consulte o artigo Destino para regras de saída.

  13. Para uma regra de saída, especifique o filtro de origem:

    • Para filtrar o tráfego de saída por intervalos IPv4 de origem, selecione Intervalos IPv4 e introduza os blocos CIDR no campo Intervalos IPv4 de origem. Use 0.0.0.0/0 para qualquer origem IPv4.
    • Para filtrar o tráfego de saída por intervalos IPv6 de origem, selecione Intervalos IPv6 e introduza os blocos CIDR no campo Intervalos IPv6 de origem. Use ::/0 para qualquer destino IPv6.

    Para mais informações, consulte o artigo Origem das regras de saída.

  14. Defina os protocolos e as portas aos quais a regra se aplica:

    • Para que a regra se aplique a todos os protocolos e portas de destino, selecione Permitir tudo ou Recusar tudo, consoante a ação.
    • Para definir protocolos e portas de destino específicos, selecione Protocolos e portas especificados:
      • Selecione TCP para incluir o protocolo TCP e as portas de destino. Introduza all ou uma lista de portas de destino separadas por vírgulas, como 20-22, 80, 8080.
      • Selecione UDP para incluir o protocolo UDP e as portas de destino. Introduza all ou uma lista de portas de destino separadas por vírgulas, como 67-69, 123.
      • Selecione Outro para incluir protocolos como icmp, sctp ou um número de protocolo. Por exemplo, use icmp ou o número do protocolo 1 para IPv4 ICMP. Use o número do protocolo 58 para o ICMP IPv6.

    Para mais informações, consulte os protocolos e as portas de destino.

  15. (Opcional) Pode criar a regra de firewall, mas não aplicá-la, definindo o respetivo estado de aplicação como desativado. Clique em Desativar regra e, de seguida, selecione Desativado.

  16. Clique em Criar.

gcloud

Para criar uma regra de firewall de VPC, use o comando gcloud compute firewall-rules create:

gcloud compute firewall-rules create RULE_NAME \
    [--network NETWORK; default="default"] \
    [--priority PRIORITY;default=1000] \
    [--direction (ingress|egress|in|out); default="ingress"] \
    [--action (deny | allow )] \
    [--target-tags TAG[,TAG,...]] \
    [--target-service-accounts=IAM_SERVICE_ACCOUNT[,IAM_SERVICE_ACCOUNT,...]] \
    [--source-ranges CIDR_RANGE[,CIDR_RANGE,...]] \
    [--source-tags TAG[,TAG, ...]] \
    [--source-service-accounts=IAM_SERVICE_ACCOUNT[,IAM_SERVICE_ACCOUNT,...]] \
    [--destination-ranges CIDR_RANGE[,CIDR_RANGE,...]] \
    [--rules (PROTOCOL[:PORT[-PORT]],[PROTOCOL[:PORT[-PORT]],...]] | all ) \
    [--disabled | --no-disabled] \
    [--enable-logging | --no-enable-logging] \
    [--logging-metadata LOGGING_METADATA]

Use os parâmetros da seguinte forma. Estão disponíveis mais detalhes sobre cada um na documentação de referência do SDK.

  • --network A rede da regra. Se for omitido, a regra é criada na rede default. Se não tiver uma rede predefinida ou quiser criar a regra numa rede específica, tem de usar este campo.
  • --priority Um valor numérico que indica a prioridade da regra. Quanto menor o número, maior a prioridade.
  • --direction A direção do trânsito, INGRESS ou EGRESS.
  • --action A ação na correspondência, allow ou deny. Tem de ser usado com a flag --rules.
  • Especifique um alvo de uma das seguintes formas:
    • Omita --target-tags e --target-service-accounts se a regra se dever aplicar a todos os alvos na rede.
    • Use a flag --target-tags para definir alvos por etiquetas de rede.
    • Use a flag --target-service-accounts para definir targets por contas de serviço associadas.
  • Para a regra de entrada, para refinar ainda mais o destino, use --destination-ranges para especificar intervalos de endereços IPv4 ou IPv6 no formato CIDR. Se --destination-ranges for omitido, o destino de entrada é qualquer endereço IPv4, 0.0.0.0/0. Para mais informações, consulte os artigos Destinos para regras de entrada e Endereços IP e destinos para regras de entrada.

  • Para uma regra de entrada, especifique uma origem:

    • --source-ranges Use esta flag para especificar intervalos de endereços IPv4 ou IPv6 de origem no formato CIDR.
    • Se --source-ranges, source-tags e --source-service-accounts forem omitidos, a origem de entrada é qualquer endereço IPv4, 0.0.0.0/0.
    • --source-tags Use esta flag para especificar instâncias de origem por etiquetas de rede. A filtragem por etiqueta de origem só está disponível se o destino não for especificado pela conta de serviço. Para mais informações, consulte a secção Filtrar por conta de serviço vs. etiqueta de rede.
    • --source-ranges e --source-tags podem ser usados em conjunto. Se ambos forem especificados, o conjunto de origens efetivo é a união dos endereços IP do intervalo de origens e das instâncias identificadas por etiquetas de rede, mesmo que as instâncias etiquetadas não tenham IPs nos intervalos de origens.
    • --source-service-accounts Use esta flag para especificar instâncias pelas contas de serviço que usam. A filtragem por conta de serviço de origem só está disponível se o destino não for especificado pela etiqueta de rede. Para mais informações, consulte a secção Filtrar por conta de serviço em comparação com etiqueta de rede. --source-ranges e --source-service-accounts podem ser usados em conjunto. Se ambos forem especificados, o conjunto de origens eficaz é a união dos endereços IP do intervalo de origens e das instâncias identificadas pelas contas de serviço de origem, mesmo que as instâncias identificadas pelas contas de serviço de origem não tenham IPs nos intervalos de origens.
  • Para a regra de saída, para refinar ainda mais a origem, use --source-ranges para especificar intervalos de endereços IPv4 ou IPv6 no formato CIDR. Se --source-ranges for omitido, a origem de saída é qualquer endereço IPv4, 0.0.0.0/0. Para mais informações, consulte os artigos Fontes para regras de saída e Endereços IP e de destino para regras de saída.

  • Para uma regra de saída, especifique um destino:

    • --destination-ranges Use esta flag para especificar intervalos de endereços IPv4 ou IPv6 de destino no formato CIDR.
    • Se --destination-ranges for omitido, o destino de saída é qualquer endereço IPv4, 0.0.0.0/0.
  • --rules Uma lista de protocolos e portas de destino aos quais a regra se aplica. Use all para tornar a regra aplicável a todos os protocolos e a todas as portas de destino. Requer a flag --action.

  • Por predefinição, as regras de firewall são criadas e aplicadas automaticamente; no entanto, pode alterar este comportamento.

    • Se --disabled e --no-disabled forem omitidos, a regra de firewall é criada e aplicada.
    • --disabled Adicione esta flag para criar a regra de firewall, mas não a aplicar. A regra de firewall permanece desativada até que a atualize para a ativar.
    • --no-disabled Adicione esta flag para garantir que a regra de firewall é aplicada.
  • --enable-logging | --no-enable-logging Pode ativar o registo de regras de firewall para uma regra quando a cria ou atualiza. O registo de regras de firewall permite-lhe auditar, validar e analisar os efeitos das suas regras de firewall. Consulte o artigo Registo de regras de firewall para ver detalhes.

    • --logging-metadata Se ativar o registo, por predefinição, o registo de regras de firewall inclui campos básicos e de metadados. Pode omitir campos de metadados para poupar custos de armazenamento. Para mais informações, consulte o artigo Usar o registo de regras de firewall.

Terraform

Para criar uma regra de firewall, pode usar um recurso google_compute_firewall.

resource "google_compute_firewall" "rules" {
  name        = "my-firewall-rule"
  network     = "default"
  description = "Creates firewall rule targeting tagged instances"

  allow {
    protocol = "tcp"
    ports    = ["80", "443"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["web"]
}

Para saber como aplicar ou remover uma configuração do Terraform, consulte os comandos básicos do Terraform.

API

Crie uma regra de firewall da VPC.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
{
  "name": "RULE_NAME",
  "network": "projects/PROJECT-ID/global/networks/NETWORK",
  ... other fields
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto onde a rede VPC está localizada.
  • NETWORK: o nome da rede VPC onde a regra de firewall é criada.
  • RULE_NAME: o nome da regra de firewall.

  • Para uma regra de firewall de entrada, especifique a origem e o destino de entrada:

    • Use os campos sourceRanges, sourceTags ou sourceServiceAccounts para especificar a origem de entrada.

    • sourceRanges podem ser intervalos IPv4 ou IPv6, mas não uma combinação de ambos. Para usar o intervalo 0.0.0.0/0, não especifique nenhum campo.

    • Não pode usar os campos sourceTags e sourceServiceAccounts em conjunto. No entanto, pode usar sourceRanges com sourceTags ou sourceServiceAccounts. Se o fizer, a ligação só tem de corresponder a um ou outro para que a regra da firewall se aplique.

    • Para os campos de destino, se usar o campo sourceTags, não pode usar o campo targetServiceAccounts. Tem de usar o campo targetTags ou nenhum campo de destino. Da mesma forma, se usar o campo sourceServiceAccounts, não pode usar o campo targetTags. Se não especificar um campo de destino, a regra aplica-se a todos os destinos na rede.

    • Use o campo destinationRanges para especificar o destino de entrada. destinationRanges pode ser intervalos IPv4 ou IPv6, mas não uma combinação de ambos.
      Se não especificar um destino, Google Cloud usa 0.0.0.0/0. Para mais informações, consulte Destinos para regras de entrada e Endereços IP e de destino para regras de entrada.

  • Para uma regra de firewall de saída, especifique a origem e o destino de saída:

    • Use o campo sourceRanges para especificar a origem da saída. sourceRange podem ser intervalos IPv4 ou IPv6, mas não uma combinação de ambos.
      Se não especificar uma origem, Google Cloud usa 0.0.0.0/0. Para mais informações, consulte os artigos Fontes para regras de saída e Endereços IP e de destino para regras de saída.

    • Use o campo destinationRanges para especificar o destino. destinationRanges podem ser intervalos IPv4 ou IPv6, mas não uma combinação de ambos.
      Se não especificar um destino, Google Cloud usa 0.0.0.0/0. Use o campo targetTags ou targetServiceAccounts para especificar a que alvos a regra se aplica. Se não especificar um campo de segmentação, a regra aplica-se a todas as segmentações na rede.

Para mais informações e descrições de cada campo, consulte o método firewalls.insert.

C#


using Google.Cloud.Compute.V1;
using System.Threading.Tasks;

public class CreateFirewallRuleAsyncSample
{
    public async Task CreateFirewallRuleAsync(
        // TODO(developer): Set your own default values for these parameters or pass different values when calling this method.
        string projectId = "your-project-id",
        string firewallRuleName = "my-test-firewall-rule",
        // Name of the network the rule will be applied to. Some available name formats:
        // projects/{project_id}/global/networks/{network}
        // global/networks/{network}
        string networkName = "global/networks/default")
    {
        Firewall firewallRule = new Firewall
        {
            Name = firewallRuleName,
            Network = networkName,
            Direction = ComputeEnumConstants.Firewall.Direction.Ingress,
            Allowed =
            {
                new Allowed
                {
                    Ports = { "80", "443" },
                    IPProtocol = "tcp"
                }
            },
            TargetTags = { "web" },
            Description = "Allows TCP traffic on port 80 and 443 from anywhere."
        };

        // Note that the default value of priority for the firewall API is 1000.
        // If you check the value of firewallRule.Priority at this point it
        // will be equal to 0, however it is not treated as "set" by the library, and thus
        // the default will be applied to the new rule. If you want to create a rule that
        // has priority == 0, you'll need to explicitly set it: firewallRule.Priority = 0.
        // You can use the firewallRule.HasPriority property to check if the priority has been set.
        // You can use the firewallRule.ClearPriority() method to unset the priority.

        // Initialize client that will be used to send requests. This client only needs to be created
        // once, and can be reused for multiple requests.
        FirewallsClient client = await FirewallsClient.CreateAsync();

        // Create the firewall rule in the specified project.
        var firewallRuleCreation = await client.InsertAsync(projectId, firewallRule);

        // Wait for the operation to complete using client-side polling.
        await firewallRuleCreation.PollUntilCompletedAsync();
    }
}

Ir

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"google.golang.org/protobuf/proto"
)

// createFirewallRule creates a firewall rule allowing for incoming HTTP and HTTPS access from the entire Internet.
func createFirewallRule(w io.Writer, projectID, firewallRuleName, networkName string) error {
	// projectID := "your_project_id"
	// firewallRuleName := "europe-central2-b"
	// networkName := "global/networks/default"

	ctx := context.Background()
	firewallsClient, err := compute.NewFirewallsRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer firewallsClient.Close()

	firewallRule := &computepb.Firewall{
		Allowed: []*computepb.Allowed{
			{
				IPProtocol: proto.String("tcp"),
				Ports:      []string{"80", "443"},
			},
		},
		Direction: proto.String(computepb.Firewall_INGRESS.String()),
		Name:      &firewallRuleName,
		TargetTags: []string{
			"web",
		},
		Network:     &networkName,
		Description: proto.String("Allowing TCP traffic on port 80 and 443 from Internet."),
	}

	// Note that the default value of priority for the firewall API is 1000.
	// If you check the value of `firewallRule.GetPriority()` at this point it
	// will be equal to 0, however it is not treated as "set" by the library and thus
	// the default will be applied to the new rule. If you want to create a rule that
	// has priority == 0, you need to explicitly set it so:

	// firewallRule.Priority = proto.Int32(0)

	req := &computepb.InsertFirewallRequest{
		Project:          projectID,
		FirewallResource: firewallRule,
	}

	op, err := firewallsClient.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create firewall rule: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Firewall rule created\n")

	return nil
}

Java


import com.google.cloud.compute.v1.Allowed;
import com.google.cloud.compute.v1.Firewall;
import com.google.cloud.compute.v1.Firewall.Direction;
import com.google.cloud.compute.v1.FirewallsClient;
import com.google.cloud.compute.v1.InsertFirewallRequest;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateFirewallRule {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample
    /* project: project ID or project number of the Cloud project you want to use.
       firewallRuleName: name of the rule that is created.
       network: name of the network the rule will be applied to. Available name formats:
        * https://www.googleapis.com/compute/v1/projects/{project_id}/global/networks/{network}
        * projects/{project_id}/global/networks/{network}
        * global/networks/{network} */
    String project = "your-project-id";
    String firewallRuleName = "firewall-rule-name-" + UUID.randomUUID();
    String network = "global/networks/default";

    // The rule will be created with default priority of 1000.
    createFirewall(project, firewallRuleName, network);
  }

  // Creates a simple firewall rule allowing for incoming HTTP and 
  // HTTPS access from the entire Internet.
  public static void createFirewall(String project, String firewallRuleName, String network)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    /* Initialize client that will be used to send requests. This client only needs to be created
       once, and can be reused for multiple requests. After completing all of your requests, call
       the `firewallsClient.close()` method on the client to safely
       clean up any remaining background resources. */
    try (FirewallsClient firewallsClient = FirewallsClient.create()) {

      // The below firewall rule is created in the default network.
      Firewall firewallRule = Firewall.newBuilder()
          .setName(firewallRuleName)
          .setDirection(Direction.INGRESS.toString())
          .addAllowed(
              Allowed.newBuilder().addPorts("80").addPorts("443").setIPProtocol("tcp").build())
          .addSourceRanges("0.0.0.0/0")
          .setNetwork(network)
          .addTargetTags("web")
          .setDescription("Allowing TCP traffic on port 80 and 443 from Internet.")
          .build();

      /* Note that the default value of priority for the firewall API is 1000.
         If you check the value of `firewallRule.getPriority()` at this point it
         will be equal to 0, however it is not treated as "set" by the library and thus
         the default will be applied to the new rule. If you want to create a rule that
         has priority == 0, you'll need to explicitly set it so: setPriority(0) */

      InsertFirewallRequest insertFirewallRequest = InsertFirewallRequest.newBuilder()
          .setFirewallResource(firewallRule)
          .setProject(project).build();

      firewallsClient.insertAsync(insertFirewallRequest).get(3, TimeUnit.MINUTES);

      System.out.println("Firewall rule created successfully -> " + firewallRuleName);
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const firewallRuleName = 'YOUR_FIREWALL_RULE_NAME'
// const networkName = 'global/networks/default'

const compute = require('@google-cloud/compute');
const computeProtos = compute.protos.google.cloud.compute.v1;

async function createFirewallRule() {
  const firewallsClient = new compute.FirewallsClient();
  const operationsClient = new compute.GlobalOperationsClient();

  const firewallRule = new computeProtos.Firewall();
  firewallRule.name = firewallRuleName;
  firewallRule.direction = 'INGRESS';
  firewallRule.allowed = [
    {
      IPProtocol: 'tcp',
      ports: ['80', '443'],
    },
  ];
  firewallRule.targetTags = ['web'];
  firewallRule.