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 regras de firewall, reveja os componentes das regras de firewall para se familiarizar com os componentes de firewall usados no Trusted 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 Trusted 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 Trusted 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 rede (segmentação), 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 mais informações, consulte a secção sobre a filtragem por conta de serviço em comparação com a etiqueta de rede.
    • Para filtrar o tráfego de entrada 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. Para mais informações, consulte o artigo sobre a filtragem por conta de serviço em comparação com a 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.
  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.
  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 aplicar a regra 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 as 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, Trusted 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, Trusted 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, Trusted 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 destino, a regra aplica-se a todos os destinos 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();
    }
}

Go

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.network = networkName;
  firewallRule.description =
    '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.priority` at this point it
  // will be equal to null, 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 = 0

  const [response] = await firewallsClient.insert({
    project: projectId,
    firewallResource: firewallRule,
  });
  let operation = response.latestResponse;

  // Wait for the create operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
    });
  }

  console.log('Firewall rule created');
}

createFirewallRule();

PHP

use Google\Cloud\Compute\V1\Allowed;
use Google\Cloud\Compute\V1\Client\FirewallsClient;
use Google\Cloud\Compute\V1\Enums\Firewall\Direction;

/**
 * To correctly handle string enums in Cloud Compute library
 * use constants defined in the Enums subfolder.
 */
use Google\Cloud\Compute\V1\Firewall;
use Google\Cloud\Compute\V1\InsertFirewallRequest;

/**
 * Creates a simple firewall rule allowing incoming HTTP and HTTPS access from the entire internet.
 *
 * @param string $projectId Project ID or project number of the Cloud project you want to create a rule for.
 * @param string $firewallRuleName Name of the rule that is created.
 * @param string $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}
 *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */

function create_firewall_rule(string $projectId, string $firewallRuleName, string $network = 'global/networks/default')
{
    $firewallsClient = new FirewallsClient();
    $allowedPorts = (new Allowed())
      ->setIPProtocol('tcp')
      ->setPorts(['80', '443']);
    $firewallResource = (new Firewall())
      ->setName($firewallRuleName)
      ->setDirection(Direction::INGRESS)
      ->setAllowed([$allowedPorts])
      ->setSourceRanges(['0.0.0.0/0'])
      ->setTargetTags(['web'])
      ->setNetwork($network)
      ->setDescription('Allowing TCP traffic on ports 80 and 443 from Internet.');

    /**
    * Note that the default value of priority for the firewall API is 1000.
    * If you check the value of its 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 need to explicitly set it so:
    *
    *   $firewallResource->setPriority(0);
    */

    //Create the firewall rule using Firewalls Client.
    $request = (new InsertFirewallRequest())
        ->setFirewallResource($firewallResource)
        ->setProject($projectId);
    $operation = $firewallsClient->insert($request);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Created rule %s.' . PHP_EOL, $firewallRuleName);
    } else {
        $error = $operation->getError();
        printf('Firewall rule creation failed: %s' . PHP_EOL, $error?->getMessage());
    }
}

Python

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def create_firewall_rule(
    project_id: str, firewall_rule_name: str, network: str = "global/networks/default"
) -> compute_v1.Firewall:
    """
    Creates a simple firewall rule allowing for incoming HTTP and HTTPS access from the entire Internet.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        firewall_rule_name: 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}

    Returns:
        A Firewall object.
    """
    firewall_rule = compute_v1.Firewall()
    firewall_rule.name = firewall_rule_name
    firewall_rule.direction = "INGRESS"

    allowed_ports = compute_v1.Allowed()
    allowed_ports.I_p_protocol = "tcp"
    allowed_ports.ports = ["80", "443"]

    firewall_rule.allowed = [allowed_ports]
    firewall_rule.source_ranges = ["0.0.0.0/0"]
    firewall_rule.network = network
    firewall_rule.description = "Allowing TCP traffic on port 80 and 443 from Internet."

    firewall_rule.target_tags = ["web"]

    # Note that the default value of priority for the firewall API is 1000.
    # If you check the value of `firewall_rule.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 need to explicitly set it so:
    # TODO: Uncomment to set the priority to 0
    # firewall_rule.priority = 0

    firewall_client = compute_v1.FirewallsClient()
    operation = firewall_client.insert(
        project=project_id, firewall_resource=firewall_rule
    )

    wait_for_extended_operation(operation, "firewall rule creation")

    return firewall_client.get(project=project_id, firewall=firewall_rule_name)

Ruby


require "google/cloud/compute/v1"

# Creates a simple firewall rule allowing for incoming HTTP and HTTPS access from the entire Internet.
#
# @param [String] project project ID or project number of the Cloud project you want to use.
# @param [String] name: name of the rule that is created.
# @param 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}
def create_firewall_rule project:, name:, network: "global/networks/default"
  rule = {
    name: name,
    direction: "INGRESS",
    allowed: [{
      I_p_protocol: "tcp",
      ports: ["80", "443"]
    }],
    source_ranges: ["0.0.0.0/0"],
    network: network,
    description: "Allowing TCP traffic on port 80 and 443 from Internet.",
    target_tags: ["web"]
  }

  # Note that the default value of priority for the firewall API is 1000.
  # If you want to create a rule that has priority == 0, you need to explicitly set it:
  #   rule[:priority] = 0
  # Use `rule.has_key? :priority` to check if the priority has been set.
  # Use `rule.delete :priority` method to unset the priority.

  request = {
    firewall_resource: rule,
    project: project
  }

  client = ::Google::Cloud::Compute::V1::Firewalls::Rest::Client.new
  operation = client.insert request

  wait_until_done operation: operation
end

Atualize as regras de firewall da VPC

Pode modificar alguns componentes de uma regra de firewall da VPC, como os protocolos especificados e as portas de destino para a condição de correspondência. Não pode modificar o nome, a rede, a ação em caso de correspondência e a direção do tráfego de uma regra da firewall.

Se precisar de alterar o nome, a rede ou o componente de ação ou direção, tem de eliminar a regra e criar uma nova.

Se quiser adicionar ou remover várias contas de serviço, use a CLI gcloud, a API ou as bibliotecas cliente. Não pode usar a consola para especificar várias contas de serviço de destino ou contas de serviço de origem. Trusted Cloud

Consola

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

    Aceder a Políticas de firewall

  2. Clique na regra de firewall que quer modificar.

  3. Clique em Edit.

  4. Modifique qualquer um dos componentes editáveis para satisfazer as suas necessidades.

  5. Clique em Guardar.

gcloud

Para atualizar as regras de firewall da VPC, use o comando gcloud compute firewall-rules update:

gcloud compute firewall-rules update RULE_NAME \
    [--priority=PRIORITY] \
    [--description=DESCRIPTION] \
    [--target-tags=TAG,...] \
    [--target-service-accounts=IAM_SERVICE_ACCOUNT,_] \
    [--source-ranges=CIDR_RANGE,...] \
    [--source-tags=TAG,...] \
    [--source-service-accounts=IAM_SERVICE_ACCOUNT,_] \
    [--destination-ranges=CIDR_RANGE,...] \
    [--rules=[PROTOCOL[:PORT[-PORT]],…]] \
    [--disabled | --no-disabled] \
    [--enable-logging | --no-enable-logging]

As descrições de cada flag são as mesmas que para a criação de regras de firewall, e estão disponíveis mais detalhes sobre cada uma na documentação de referência do SDK.

API

Use PATCH para atualizar os seguintes campos: allowed, description, sourceRanges, sourceTags ou targetTags. Use PUT ou POST para todos os outros campos.

(PATCH|(POST|PUT)) https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/RULE_NAME
{
  "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 se encontra a regra de firewall.
  • RULE_NAME: o nome da regra de firewall a atualizar.

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

C#


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

public class PatchFirewallRuleAsyncSample
{
    public async Task PatchFirewallRuleAsync(
        // 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",
        int newPriority = 10)
    {
        // The patch operation doesn't require the full definition of a Firewall object.
        // It will only update the values that were set in it,
        // in this case it will only change the priority.
        Firewall firewallRule = new Firewall
        {
            Priority = newPriority
        };

        // 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();

        // Patch the firewall rule in the specified project.
        var firewallRulePatching = await client.PatchAsync(projectId, firewallRuleName, firewallRule);

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

Go

import (
	"context"
	"fmt"
	"io"

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

// patchFirewallPriority modifies the priority of a given firewall rule.
func patchFirewallPriority(w io.Writer, projectID, firewallRuleName string, priority int32) error {
	// projectID := "your_project_id"
	// firewallRuleName := "europe-central2-b"
	// priority := 10

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

	firewallRule := &computepb.Firewall{
		Priority: proto.Int32(priority),
	}

	req := &computepb.PatchFirewallRequest{
		Project:          projectID,
		Firewall:         firewallRuleName,
		FirewallResource: firewallRule,
	}

	// The patch operation doesn't require the full definition of a Firewall interface. It will only update
	// the values that were set in it, in this case it will only change the priority.
	op, err := firewallsClient.Patch(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to patch 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 updated\n")

	return nil
}

Java


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.compute.v1.Firewall;
import com.google.cloud.compute.v1.FirewallsClient;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.PatchFirewallRequest;
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 PatchFirewallRule {

  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 you want to modify.
    // priority: the new priority to be set for the rule.
    String project = "your-project-id";
    String firewallRuleName = "firewall-rule-name-" + UUID.randomUUID();
    int priority = 10;

    patchFirewallPriority(project, firewallRuleName, priority);
  }

  // Modifies the priority of a given firewall rule.
  public static void patchFirewallPriority(String project, String firewallRuleName, int priority)
      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 patch operation doesn't require the full definition of a Firewall object. It will only 
         update the values that were set in it, in this case it will only change the priority. */
      Firewall firewall = Firewall.newBuilder()
          .setPriority(priority).build();

      PatchFirewallRequest patchFirewallRequest = PatchFirewallRequest.newBuilder()
          .setProject(project)
          .setFirewall(firewallRuleName)
          .setFirewallResource(firewall).build();

      OperationFuture<Operation, Operation> operation = firewallsClient.patchAsync(
          patchFirewallRequest);
      operation.get(3, TimeUnit.MINUTES);
      System.out.println("Firewall Patch applied successfully ! ");
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const firewallRuleName = 'FIREWALL_RULE_NAME';
// const priority = 10;

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

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

  const firewallRule = new computeProtos.Firewall();
  firewallRule.priority = priority;

  // The patch operation doesn't require the full definition of a Firewall object. It will only update
  // the values that were set in it, in this case it will only change the priority.
  const [response] = await firewallsClient.patch({
    project: projectId,
    firewall: firewallRuleName,
    firewallResource: firewallRule,
  });
  let operation = response.latestResponse;

  // Wait for the create operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
    });
  }

  console.log('Firewall rule updated');
}

patchFirewallPriority();

PHP

use Google\Cloud\Compute\V1\Client\FirewallsClient;
use Google\Cloud\Compute\V1\Firewall;
use Google\Cloud\Compute\V1\PatchFirewallRequest;

/**
 * Modifies the priority of a given firewall rule.
 *
 * @param string $projectId Project ID or project number of the Cloud project you want to patch a rule from.
 * @param string $firewallRuleName Name of the rule that you want to modify.
 * @param int $priority The new priority to be set for the rule.
 *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function patch_firewall_priority(string $projectId, string $firewallRuleName, int $priority)
{
    $firewallsClient = new FirewallsClient();
    $firewallResource = (new Firewall())->setPriority($priority);

    // The patch operation doesn't require the full definition of a Firewall object. It will only update
    // the values that were set in it, in this case it will only change the priority.
    $request = (new PatchFirewallRequest())
        ->setFirewall($firewallRuleName)
        ->setFirewallResource($firewallResource)
        ->setProject($projectId);
    $operation = $firewallsClient->patch($request);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Patched %s priority to %d.' . PHP_EOL, $firewallRuleName, $priority);
    } else {
        $error = $operation->getError();
        printf('Patching failed: %s' . PHP_EOL, $error?->getMessage());
    }
}

Python

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def patch_firewall_priority(
    project_id: str, firewall_rule_name: str, priority: int
) -> None:
    """
    Modifies the priority of a given firewall rule.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        firewall_rule_name: name of the rule you want to modify.
        priority: the new priority to be set for the rule.
    """
    firewall_rule = compute_v1.Firewall()
    firewall_rule.priority = priority

    # The patch operation doesn't require the full definition of a Firewall object. It will only update
    # the values that were set in it, in this case it will only change the priority.
    firewall_client = compute_v1.FirewallsClient()
    operation = firewall_client.patch(
        project=project_id, firewall=firewall_rule_name, firewall_resource=firewall_rule
    )

    wait_for_extended_operation(operation, "firewall rule patching")

Ruby


require "google/cloud/compute/v1"

# Modifies the priority of a given firewall rule.
#
# @param [String] project project ID or project number of the Cloud project you want to use.
# @param [String] name name of the rule you want to modify.
# @param [Google::Protobuf::RepeatedField] allowed the repeated instances of the Allowed field in the rule.
#         Compute errors out if allowed is empty.
# @param [Integer] priority the new priority to be set for the rule.
def patch_firewall_priority project:, name:, allowed:, priority:
  allowed_arr = allowed.map do |instance|
    {
      I_p_protocol: instance.I_p_protocol,
      ports: instance.ports.to_a
    }
  end.to_a

  rule = {
    priority: priority,
    allowed: allowed_arr
  }

  request = {
    project: project,
    firewall: name,
    firewall_resource: rule
  }

  # The patch operation doesn't require the full definition of a Firewall object. It will only update
  # the values that were set in it, in this case it will only change the priority.
  client = ::Google::Cloud::Compute::V1::Firewalls::Rest::Client.new
  operation = client.patch request

  wait_until_done operation: operation
end

Indique as regras de firewall de VPC para uma rede de VPC

Pode listar todas as regras de firewall da VPC para o seu projeto ou para uma rede VPC específica. Para cada regra de firewall, Trusted Cloud mostra detalhes como o tipo, os alvos e os filtros da regra.

Se ativar o Registo de regras de firewall, as Estatísticas da firewall podem fornecer estatísticas sobre as regras de firewall para ajudar a compreender e otimizar em segurança as respetivas configurações. Por exemplo, pode ver que allowregras não foram usadas nas últimas seis semanas. Para mais informações, consulte o ecrã de detalhes das regras da firewall na documentação do Firewall Insights.

Consola

Para mostrar todas as regras de firewall da VPC para todas as redes no seu projeto:

Para mostrar as regras de firewall da VPC numa rede específica:

  1. Na Trusted Cloud consola, aceda à página Redes VPC.

    Aceda a redes de VPC

  2. Clique no Nome de uma rede de VPC para aceder à respetiva página de detalhes.

  3. Na página de detalhes da rede, clique no separador Firewalls.

  4. Expanda vpc-firewall-rules.

gcloud

Para produzir uma lista ordenada de regras de firewall da VPC para uma determinada rede, use o comando gcloud compute firewall-rules list:

gcloud compute firewall-rules list --filter network=NETWORK \
    --sort-by priority \
    --format="table(
        name,
        network,
        direction,
        priority,
        sourceRanges.list():label=SRC_RANGES,
        destinationRanges.list():label=DEST_RANGES,
        allowed[].map().firewall_rule().list():label=ALLOW,
        denied[].map().firewall_rule().list():label=DENY,
        sourceTags.list():label=SRC_TAGS,
        targetTags.list():label=TARGET_TAGS
        )"

Substitua NETWORK pelo nome da rede para listar as regras da firewall.

API

Indique todas as regras de firewall da VPC para uma determinada rede.

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/?filter=network="NETWORK

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto onde a rede VPC está localizada.
  • NETWORK: o nome da rede de VPC que contém as regras de firewall a listar.

Para mais informações, consulte o método firewalls.list.

C#


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

public class ListFirewallRulesAsyncSample
{
    public async Task ListFirewallRulesAsync(
        // TODO(developer): Set your own default values for these parameters or pass different values when calling this method.
        string projectId = "your-project-id")
    {
        // 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();

        // Make the request to list all firewall rules.
        await foreach (var firewallRule in client.ListAsync(projectId))
        {
            // The result is a Firewall sequence that you can iterate over.
            Console.WriteLine($"Firewal Rule: {firewallRule.Name}");
        }
    }
}

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"google.golang.org/api/iterator"
)

// listFirewallRules prints the list of firewall names and their descriptions in specified project
func listFirewallRules(w io.Writer, projectID string) error {
	// projectID := "your_project_id"

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

	req := &computepb.ListFirewallsRequest{
		Project: projectID,
	}

	it := firewallsClient.List(ctx, req)
	for {
		firewallRule, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return err
		}
		fmt.Fprintf(w, "- %s: %s\n", firewallRule.GetName(), firewallRule.GetDescription())
	}

	return nil
}

Java


import com.google.cloud.compute.v1.Firewall;
import com.google.cloud.compute.v1.FirewallsClient;
import com.google.cloud.compute.v1.FirewallsClient.ListPagedResponse;
import java.io.IOException;

public class ListFirewallRules {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample
    // project: project ID or project number of the Cloud project you want to use.
    String project = "your-project-id";
    listFirewallRules(project);
  }

  // Return a list of all the firewall rules in specified project.
  // Also prints the list of firewall names and their descriptions.
  public static ListPagedResponse listFirewallRules(String project)
      throws IOException {
    /* 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()) {
      ListPagedResponse firewallResponse = firewallsClient.list(project);
      for (Firewall firewall : firewallResponse.iterateAll()) {
        System.out.println(firewall.getName());
      }
      return firewallResponse;
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';

const compute = require('@google-cloud/compute');

async function listFirewallRules() {
  const firewallsClient = new compute.FirewallsClient();

  const [firewallRules] = await firewallsClient.list({
    project: projectId,
  });

  for (const rule of firewallRules) {
    console.log(` - ${rule.name}: ${rule.description}`);
  }
}

listFirewallRules();

PHP

use Google\Cloud\Compute\V1\Client\FirewallsClient;
use Google\Cloud\Compute\V1\ListFirewallsRequest;

/**
 * Return a list of all the firewall rules in specified project. Also prints the
 * list of firewall names and their descriptions.
 *
 * @param string $projectId Project ID or project number of the Cloud project you want to list rules from.
 *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 */
function list_firewall_rules(string $projectId)
{
    // List all firewall rules defined for the project using Firewalls Client.
    $firewallClient = new FirewallsClient();
    $request = (new ListFirewallsRequest())
        ->setProject($projectId);
    $firewallList = $firewallClient->list($request);

    print('--- Firewall Rules ---' . PHP_EOL);
    foreach ($firewallList->iterateAllElements() as $firewall) {
        printf(' -  %s : %s : %s' . PHP_EOL, $firewall->getName(), $firewall->getDescription(), $firewall->getNetwork());
    }
}

Python

from __future__ import annotations

from collections.abc import Iterable

from google.cloud import compute_v1


def list_firewall_rules(project_id: str) -> Iterable[compute_v1.Firewall]:
    """
    Return a list of all the firewall rules in specified project. Also prints the
    list of firewall names and their descriptions.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.

    Returns:
        A flat list of all firewall rules defined for given project.
    """
    firewall_client = compute_v1.FirewallsClient()
    firewalls_list = firewall_client.list(project=project_id)

    for firewall in firewalls_list:
        print(f" - {firewall.name}: {firewall.description}")

    return firewalls_list

Ruby


require "google/cloud/compute/v1"

# Return a list of all the firewall rules in specified project. Also prints the
# list of firewall names and their descriptions.
#
# @param [String] project project ID or project number of the project you want to use.
# @return [Array<::Google::Cloud::Compute::V1::Firewall>]
#     A list of all firewall rules defined for the given project.
def list_firewall_rules project:
  client = ::Google::Cloud::Compute::V1::Firewalls::Rest::Client.new
  firewalls = client.list project: project

  firewall_list = []
  firewalls.each do |firewall|
    puts " - #{firewall.name}: #{firewall.description}"
    firewall_list << firewall
  end

  firewall_list
end

Apresente as regras de firewall da VPC para uma interface de rede de uma instância de VM

Para cada interface de rede, a Trusted Cloud consola lista todas as regras de firewall da VPC que se aplicam à interface e as regras que estão a ser usadas pela interface. As regras de firewall podem ocultar outras regras, pelo que nem todas as regras que se aplicam a uma interface podem ser usadas pela interface.

As regras de firewall são associadas e aplicadas a instâncias de VM através do parâmetro de destino de uma regra. Ao ver todas as regras aplicadas, pode verificar se uma regra específica está a ser aplicada a uma interface.

Se ativar o Registo de regras de firewall, as Estatísticas da firewall podem fornecer estatísticas sobre as regras de firewall para ajudar a compreender e otimizar em segurança as respetivas configurações. Por exemplo, pode ver que regras numa interface foram acionadas nas últimas seis semanas. Para mais informações, consulte o ecrã de detalhes da interface de rede da VM na documentação do Firewall Insights.

Consola

Para ver as regras de VPC que se aplicam a uma interface de rede específica de uma instância de VM:

  1. Na Trusted Cloud consola, aceda à página Instâncias de VM.

    Aceder às instâncias de VM

  2. Encontre a instância que quer ver.

  3. No menu Mais ações () da instância, selecione Ver detalhes da rede.

  4. Se uma instância tiver várias interfaces de rede, selecione a interface de rede para ver no campo Interface de rede selecionada.

  5. Na secção Detalhes da firewall e das rotas, selecione o separador Firewalls.

  6. Expanda vpc-firewall-rules.

  7. Veja a tabela para determinar se o tráfego para ou a partir de um endereço IP específico é permitido.

Veja os detalhes das regras de firewall da VPC

Pode inspecionar uma regra da firewall de VPC para ver o respetivo nome, rede aplicável e componentes, incluindo se a regra está ativada ou desativada.

Consola

  1. Liste as suas regras de firewall. Pode ver uma lista de todas as regras ou apenas as de uma rede específica.
  2. Clique na regra para a ver.

gcloud

O comando seguinte descreve uma regra de firewall de VPC individual. Uma vez que os nomes das regras de firewall são exclusivos do projeto, não tem de especificar uma rede quando descreve uma regra de firewall existente.

gcloud compute firewall-rules describe RULE_NAME

Substitua RULE_NAME pelo nome da regra de firewall.

API

Descrever uma determinada regra de firewall da VPC.

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/RULE_NAME

Substitua os marcadores de posição por valores válidos:

  • PROJECT_ID: o ID do projeto onde a regra de firewall está localizada.
  • RULE_NAME: o nome da regra de firewall a descrever.

Para mais informações, consulte o método firewalls.get.

Elimine regras de firewall da VPC

Consola

  1. Liste as regras de firewall da VPC. Pode ver uma lista de todas as regras ou apenas as de uma determinada rede.
  2. Clique na regra a eliminar.
  3. Clique em Eliminar.
  4. Clique novamente em Eliminar para confirmar.

gcloud

Para eliminar uma regra de firewall da VPC, use o comando gcloud compute firewall-rules delete:

gcloud compute firewall-rules delete RULE_NAME

Substitua RULE_NAME pelo nome da regra a eliminar.

API

Elimine uma regra de firewall da VPC.

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/RULE_NAME

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto onde a regra de firewall está localizada.
  • RULE_NAME: o nome da regra de firewall a eliminar.

Para mais informações, consulte o método firewalls.delete.

C#


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

public class DeleteFirewallRuleAsyncSample
{
    public async Task DeleteFirewallRuleAsync(
        // 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")
    {

        // 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();

        // Make the request to delete the firewall rule.
        var firewallRuleDeletion = await client.DeleteAsync(projectId, firewallRuleName);

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

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
)

// deleteFirewallRule deletes a firewall rule from the project.
func deleteFirewallRule(w io.Writer, projectID, firewallRuleName string) error {
	// projectID := "your_project_id"
	// firewallRuleName := "europe-central2-b"

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

	req := &computepb.DeleteFirewallRequest{
		Project:  projectID,
		Firewall: firewallRuleName,
	}

	op, err := firewallsClient.Delete(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to delete 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 deleted\n")

	return nil
}

Java


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.compute.v1.FirewallsClient;
import com.google.cloud.compute.v1.Operation;
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 DeleteFirewallRule {

  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 firewall rule you want to delete.
    String project = "your-project-id";
    String firewallRuleName = "firewall-rule-name-" + UUID.randomUUID();
    deleteFirewallRule(project, firewallRuleName);
  }


  // Deletes a firewall rule from the project.
  public static void deleteFirewallRule(String project, String firewallRuleName)
      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()) {

      OperationFuture<Operation, Operation> operation = firewallsClient.deleteAsync(project,
          firewallRuleName);
      operation.get(3, TimeUnit.MINUTES);

      System.out.println("Deleted firewall rule -> " + firewallRuleName);
    }
  }
}

Node.js

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

const compute = require('@google-cloud/compute');

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

  const [response] = await firewallsClient.delete({
    project: projectId,
    firewall: firewallRuleName,
  });
  let operation = response.latestResponse;

  // Wait for the create operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
    });
  }

  console.log('Firewall rule deleted');
}

deleteFirewallRule();

PHP

use Google\Cloud\Compute\V1\Client\FirewallsClient;
use Google\Cloud\Compute\V1\DeleteFirewallRequest;

/**
 * Delete a firewall rule from the specified project.
 *
 * @param string $projectId Project ID or project number of the Cloud project you want to delete a rule for.
 * @param string $firewallRuleName Name of the rule that is deleted.
 *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function delete_firewall_rule(string $projectId, string $firewallRuleName)
{
    $firewallsClient = new FirewallsClient();

    // Delete the firewall rule using Firewalls Client.
    $request = (new DeleteFirewallRequest())
        ->setFirewall($firewallRuleName)
        ->setProject($projectId);
    $operation = $firewallsClient->delete($request);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Rule %s deleted successfully!' . PHP_EOL, $firewallRuleName);
    } else {
        $error = $operation->getError();
        printf('Failed to delete firewall rule: %s' . PHP_EOL, $error?->getMessage());
    }
}

Python

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def delete_firewall_rule(project_id: str, firewall_rule_name: str) -> None:
    """
    Deletes a firewall rule from the project.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        firewall_rule_name: name of the firewall rule you want to delete.
    """
    firewall_client = compute_v1.FirewallsClient()
    operation = firewall_client.delete(project=project_id, firewall=firewall_rule_name)

    wait_for_extended_operation(operation, "firewall rule deletion")

Ruby


require "google/cloud/compute/v1"

# Deletes a firewall rule from the project.
#
# @param [String] project project ID or project number of the Cloud project you want to use.
# @param [String] name name of the firewall rule you want to delete.
def delete_firewall_rule project:, name:
  client = ::Google::Cloud::Compute::V1::Firewalls::Rest::Client.new
  operation = client.delete project: project, firewall: name

  wait_until_done operation: operation
end

Monitorize as regras de firewall da VPC

Pode ativar o registo para regras de firewall da VPC para ver que regra permitiu ou bloqueou que tráfego. Consulte o artigo Use o registo de regras de firewall para ver instruções.

Configure regras de firewall da VPC para exemplos de utilização comuns

As secções seguintes fornecem exemplos de como usar a CLI gcloud e a API para recriar as regras de firewall da VPC predefinidas criadas para redes predefinidas. Pode usar os exemplos para criar regras semelhantes para as suas redes de modo personalizado e automático. Cada regra de firewall pode incluir intervalos de endereços IPv4 ou IPv6, mas não ambos.

Permita ligações de entrada internas entre VMs

Os exemplos seguintes criam uma regra de firewall para permitir ligações TCP, UDP e ICMP internas às suas instâncias de VM, semelhante à regra allow-internal para redes predefinidas.

gcloud

Use o comando gcloud compute firewall-rules create:

gcloud compute firewall-rules create RULE_NAME \
    --action=ALLOW \
    --direction=INGRESS \
    --network=NETWORK \
    --priority=1000 \
    --rules=tcp:0-65535,udp:0-65535,ICMP_PROTOCOL \
    --source-ranges=SUBNET_RANGES

Substitua o seguinte:

  • RULE_NAME: o nome desta regra de firewall.
  • NETWORK: o nome da rede à qual esta regra de firewall se aplica. O valor predefinido é default.
  • ICMP_PROTOCOL: o tipo de protocolo ICMP. Especifique o ICMPv4 através do nome do protocolo icmp ou do número do protocolo 1. Especifique o ICMPv6 através do número de protocolo 58.
  • SUBNET_RANGES: um ou mais intervalos de endereços IP. A inclusão de um intervalo de endereços IP significa que o tráfego desse intervalo pode alcançar qualquer destino de VM na rede VPC. Pode especificar intervalos IPv4 ou IPv6 numa determinada regra de firewall.

    Intervalos de sub-redes IPv4:

    • As redes VPC no modo automático usam intervalos de endereços IP que estão dentro de 10.128.0.0/9.
    • As redes do modo personalizado podem usar quaisquer intervalos IPv4 válidos. Se não estiver a usar intervalos contíguos para as sub-redes na sua rede VPC, pode ter de especificar vários intervalos.
    • Pode usar 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 para permitir o tráfego de todos os intervalos de endereços IPv4 privados (intervalos RFC 1918).

    Intervalos de sub-rede IPv6:

    • Se atribuiu um intervalo de endereços IPv6 internos à sua rede VPC, pode usar esse intervalo como um intervalo de origem. A utilização do intervalo IPv6 interno da rede VPC significa que a regra de firewall inclui todos os intervalos de sub-rede IPv6 internos atuais e futuros. Pode encontrar o intervalo IPv6 interno da rede VPC através do seguinte comando:

      gcloud compute networks describe NETWORK \
        --format="flattened(internalIpv6Range)"
      

      Também pode especificar intervalos de sub-redes IPv6 internos específicos.

    • Para permitir tráfego dos intervalos de sub-redes IPv6 externas, tem de especificar o intervalo de endereços IPv6 de cada sub-rede que quer incluir.

API

POST https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
{
  "kind": "compute#firewall",
  "name": "RULE_NAME",
  "network": "projects/PROJECT_ID/global/networks/NETWORK",
  "direction": "INGRESS",
  "priority": 1000,
  "targetTags": [],
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "0-65535"
      ]
    },
    {
      "IPProtocol": "udp",
      "ports": [
        "0-65535"
      ]
    },
    {
      "IPProtocol": "ICMP_PROTOCOL"
    }
  ],
  "sourceRanges": [
    "SUBNET_RANGES"
  ]
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto onde a rede VPC está localizada.
  • RULE_NAME: o nome da regra de firewall.
  • NETWORK: o nome da rede de VPC onde a regra de firewall é criada. O valor predefinido é default.
  • ICMP_PROTOCOL: o tipo de protocolo ICMP. Especifique ICMPv4 através do nome do protocolo icmp ou do número do protocolo 1. Especifique o ICMPv6 através do número de protocolo 58.
  • INTERNAL_SOURCE_RANGES: um ou mais intervalos de IP. Para permitir o tráfego interno em todas as sub-redes nas suas redes VPC, especifique os intervalos de endereços IP usados na sua rede VPC. Pode especificar intervalos IPv4 ou IPv6 numa determinada regra de firewall.

    Intervalos de sub-redes IPv4:

    • As redes VPC no modo automático usam intervalos de endereços IP que estão dentro de 10.128.0.0/9.
    • As redes do modo personalizado podem usar quaisquer intervalos IPv4 válidos. Se não estiver a usar intervalos contíguos para as sub-redes na sua rede VPC, pode ter de especificar vários intervalos.
    • Pode usar 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 para permitir o tráfego de todos os intervalos de endereços IPv4 privados (intervalos RFC 1918).

    Intervalos de sub-rede IPv6:

    • Se atribuiu um intervalo de endereços IPv6 internos à sua rede VPC, pode usar esse intervalo como um intervalo de origem. A utilização do intervalo IPv6 interno da rede VPC significa que a regra de firewall inclui todos os intervalos de sub-rede IPv6 internos atuais e futuros. Pode encontrar o intervalo IPv6 interno da rede VPC através do seguinte comando:

      gcloud compute networks describe NETWORK \
        --format="flattened(internalIpv6Range)"
      

      Também pode especificar intervalos de sub-redes IPv6 internos específicos.

    • Para permitir tráfego dos intervalos de sub-redes IPv6 externas, tem de especificar o intervalo de endereços IPv6 de cada sub-rede que quer incluir.

Permita ligações SSH de entrada a VMs

Os exemplos seguintes criam uma regra de firewall para permitir ligações SSH às suas instâncias de VM, semelhante à regra allow-ssh para redes predefinidas.

gcloud

Use o comando gcloud compute firewall-rules create:

gcloud compute firewall-rules create RULE_NAME \
    --action=ALLOW \
    --direction=INGRESS \
    --network=NETWORK \
    --priority=1000 \
    --rules=tcp:22 \
    --source-ranges=RANGES_OUTSIDE_VPC_NETWORK

Substitua o seguinte:

  • RULE_NAME: o nome desta regra de firewall.
  • NETWORK: o nome da rede à qual esta regra de firewall se aplica. O valor predefinido é default.
  • RANGES_OUTSIDE_VPC_NETWORK: um ou mais intervalos de endereços IP. Pode especificar intervalos IPv4 ou IPv6 numa determinada regra de firewall. Como prática recomendada, especifique os intervalos de endereços IP específicos a partir dos quais precisa de permitir o acesso, em vez de todas as origens IPv4 ou IPv6.

    • A inclusão de 35.235.240.0/20 nos intervalos de origem permite ligações SSH através do encaminhamento TCP do Identity-Aware Proxy (IAP) se todos os outros pré-requisitos forem cumpridos. Para mais informações, consulte o artigo Usar o IAP para encaminhamento TCP.
    • A utilização de 0.0.0.0/0 como intervalo de origem permite o tráfego de todas as origens IPv4, incluindo origens fora de Trusted Cloud.
    • A utilização de ::/0 como intervalo de origem permite o tráfego de todas as origens IPv6, incluindo origens fora de Trusted Cloud.

API

POST https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
{
  "kind": "compute#firewall",
  "name": "RULE_NAME",
  "network": "projects/PROJECT_ID/global/networks/NETWORK",
  "direction": "INGRESS",
  "priority": 1000,
  "targetTags": [],
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "22"
      ]
    }
  ],
  "sourceRanges": [
    "RANGES_OUTSIDE_VPC_NETWORK"
  ]
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto onde a rede VPC está localizada.
  • RULE_NAME: o nome da regra de firewall.
  • NETWORK: o nome da rede de VPC onde a regra de firewall é criada.
  • RANGES_OUTSIDE_VPC_NETWORK: um ou mais intervalos de endereços IP. Pode especificar intervalos IPv4 ou IPv6 numa determinada regra de firewall. Como prática recomendada, especifique os intervalos de endereços IP específicos a partir dos quais precisa de permitir o acesso, em vez de todas as origens IPv4 ou IPv6.

    • A inclusão de 35.235.240.0/20 nos intervalos de origem permite ligações SSH através do encaminhamento TCP do Identity-Aware Proxy (IAP) se todos os outros pré-requisitos forem cumpridos. Para mais informações, consulte o artigo Usar o IAP para encaminhamento TCP.
    • A utilização de 0.0.0.0/0 como intervalo de origem permite o tráfego de todas as origens IPv4, incluindo origens fora de Trusted Cloud.
    • A utilização de ::/0 como intervalo de origem permite o tráfego de todas as origens IPv6, incluindo origens fora de Trusted Cloud.

Permita ligações RDP de entrada a VMs

Os exemplos seguintes criam uma regra de firewall para permitir ligações do protocolo de ambiente de trabalho remoto (RDP) da Microsoft às suas instâncias de VM, semelhante à regra allow-rdp para redes predefinidas.

gcloud

Use o comando gcloud compute firewall-rules create:

gcloud compute firewall-rules create RULE_NAME \
    --action=ALLOW \
    --direction=INGRESS \
    --network=NETWORK \
    --priority=1000 \
    --rules=tcp:3389 \
    --source-ranges=RANGES_OUTSIDE_VPC_NETWORK

Substitua o seguinte:

  • RULE_NAME: o nome desta regra de firewall.
  • NETWORK: o nome da rede à qual esta regra de firewall se aplica. O valor predefinido é default.
  • RANGES_OUTSIDE_VPC_NETWORK: um ou mais intervalos de endereços IP. Pode especificar intervalos IPv4 ou IPv6 numa determinada regra de firewall. Como prática recomendada, especifique os intervalos de endereços IP específicos a partir dos quais precisa de permitir o acesso, em vez de todas as origens IPv4 ou IPv6.

    • A inclusão de 35.235.240.0/20 nos intervalos de origem permite ligações RDP através do encaminhamento TCP do Identity-Aware Proxy (IAP) se todos os outros pré-requisitos forem cumpridos. Para mais informações, consulte o artigo Usar o IAP para encaminhamento TCP.
    • A utilização de 0.0.0.0/0 como intervalo de origem permite o tráfego de todas as origens IPv4, incluindo origens fora de Trusted Cloud.
    • A utilização de ::/0 como intervalo de origem permite o tráfego de todas as origens IPv6, incluindo origens fora de Trusted Cloud.

API

POST https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
{
  "kind": "compute#firewall",
  "name": "RULE_NAME",
  "network": "projects/PROJECT_ID/global/networks/NETWORK",
  "direction": "INGRESS",
  "priority": 1000,
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "3389"
      ]
    }
  ],
  "sourceRanges": [
    "EXTERNAL_SOURCE_RANGES"
  ]
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto onde a rede VPC está localizada.
  • RULE_NAME: o nome da regra de firewall.
  • NETWORK: o nome da rede de VPC onde a regra de firewall é criada.
  • RANGES_OUTSIDE_VPC_NETWORK: um ou mais intervalos de endereços IP. Pode especificar intervalos IPv4 ou IPv6 numa determinada regra de firewall. Como prática recomendada, especifique os intervalos de endereços IP específicos a partir dos quais precisa de permitir o acesso, em vez de todas as origens IPv4 ou IPv6.

    • A inclusão de 35.235.240.0/20 nos intervalos de origem permite ligações RDP através do encaminhamento TCP do Identity-Aware Proxy (IAP) se todos os outros pré-requisitos forem cumpridos. Para mais informações, consulte o artigo Usar o IAP para encaminhamento TCP.
    • A utilização de 0.0.0.0/0 como intervalo de origem permite o tráfego de todas as origens IPv4, incluindo origens fora de Trusted Cloud.
    • A utilização de ::/0 como intervalo de origem permite o tráfego de todas as origens IPv6, incluindo origens fora de Trusted Cloud.

Permita ligações ICMP de entrada a VMs

Os exemplos seguintes criam uma regra de firewall para permitir ligações ICMP às suas instâncias de VM, semelhante à regra allow-icmp para redes predefinidas.

gcloud

Use o comando gcloud compute firewall-rules create:

gcloud compute firewall-rules create RULE_NAME \
    --action=ALLOW \
    --direction=INGRESS \
    --network=NETWORK \
    --priority=1000 \
    --rules=ICMP_PROTOCOL \
    --source-ranges=RANGES_OUTSIDE_VPC_NETWORK

Substitua o seguinte:

  • RULE_NAME: o nome da regra de firewall.
  • NETWORK: o nome da rede à qual esta regra de firewall se aplica. O valor predefinido é default.
  • ICMP_PROTOCOL: o tipo de protocolo ICMP. Especifique ICMPv4 através do nome do protocolo icmp ou do número do protocolo 1. Especifique o ICMPv6 através do número de protocolo 58.
  • RANGES_OUTSIDE_VPC_NETWORK: um ou mais intervalos de endereços IP. Pode especificar intervalos IPv4 ou IPv6 numa determinada regra de firewall. Como prática recomendada, especifique os intervalos de endereços IP específicos a partir dos quais precisa de permitir o acesso, em vez de todas as origens IPv4 ou IPv6.

    • A utilização de 0.0.0.0/0 como intervalo de origem permite o tráfego de todas as origens IPv4, incluindo origens fora de Trusted Cloud.
    • A utilização de ::/0 como intervalo de origem permite o tráfego de todas as origens IPv6, incluindo origens fora de Trusted Cloud.

API

POST https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
{
  "kind": "compute#firewall",
  "name": "RULE_NAME",
  "network": "projects/PROJECT_ID/global/networks/NETWORK",
  "direction": "INGRESS",
  "priority": 1000,
  "targetTags": [],
  "allowed": [
    {
      "IPProtocol": "ICMP_PROTOCOL"
    }
  ],
  "sourceRanges": [
    "RANGES_OUTSIDE_VPC_NETWORK"
  ]
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto onde a rede VPC está localizada.
  • RULE_NAME: o nome da regra de firewall.
  • NETWORK: o nome da rede de VPC onde a regra de firewall é criada.
  • ICMP_PROTOCOL: o tipo de protocolo ICMP a usar. Especifique ICMPv4 através do nome do protocolo icmp ou do número do protocolo 1. Especifique o ICMPv6 através do número de protocolo 58.
  • RANGES_OUTSIDE_VPC_NETWORK: um ou mais intervalos de endereços IP. Pode especificar intervalos IPv4 ou IPv6 numa determinada regra de firewall. Como prática recomendada, especifique os intervalos de endereços IP específicos a partir dos quais precisa de permitir o acesso, em vez de todas as origens IPv4 ou IPv6.

    • A utilização de 0.0.0.0/0 como intervalo de origem permite o tráfego de todas as origens IPv4, incluindo origens fora de Trusted Cloud.
    • A utilização de ::/0 como intervalo de origem permite o tráfego de todas as origens IPv6, incluindo origens fora de Trusted Cloud.

Outros exemplos de configuração

A Figura 1 descreve um exemplo de configuração para uma rede de VPC denominada my-network. A rede contém o seguinte:

  • Uma sub-rede denominada subnet1, com o intervalo de IP 10.240.10.0/24 e uma única instância
  • Uma sub-rede denominada subnet2, com o intervalo de IP 192.168.1.0/24
  • Uma instância denominada vm1 em subnet2 com uma etiqueta de webserver e um endereço IP interno 192.168.1.2
  • Uma instância denominada vm2 em subnet2 com uma etiqueta de database e o endereço IP interno 192.168.1.3
Esta rede da VPC contém duas sub-redes que contêm VMs; a sub-rede 2 contém VMs que têm etiquetas de rede atribuídas.
Figura 1. Esta rede da VPC contém duas sub-redes que contêm VMs; a sub-rede 2 contém VMs que têm etiquetas de rede atribuídas (clique para aumentar).

Exemplo 1: negar todas as ligações TCP de entrada, exceto as que se destinam à porta 80 da sub-rede1

Este exemplo cria um conjunto de regras de VPC de firewall que recusam todas as ligações TCP de entrada, exceto as ligações destinadas à porta 80 de subnet1.

gcloud

  1. Crie uma regra de firewall para recusar todo o tráfego TCP de entrada para instâncias etiquetadas com webserver.

    gcloud compute firewall-rules create deny-subnet1-webserver-access \
        --network NETWORK_NAME \
        --action deny \
        --direction INGRESS \
        --rules tcp \
        --source-ranges 0.0.0.0/0 \
        --priority 1000 \
        --target-tags webserver
    

    Substitua NETWORK_NAME pelo nome da rede.

  2. Crie uma regra de firewall para permitir que todos os endereços IP em subnet1 (10.240.10.0/24) acedam à porta TCP 80 em instâncias etiquetadas com webserver.

    gcloud compute firewall-rules create vm1-allow-ingress-tcp-port80-from-subnet1 \
        --network NETWORK_NAME \
        --action allow \
        --direction INGRESS \
        --rules tcp:80 \
        --source-ranges 10.240.10.0/24 \
        --priority 50 \
        --target-tags webserver
    

    Substitua NETWORK_NAME pelo nome da rede.

Exemplo 2: negar todas as ligações TCP de saída, exceto as que se destinam à porta 80 de vm1

gcloud

  1. Crie uma regra de firewall para recusar todo o tráfego TCP de saída.

    gcloud compute firewall-rules create deny-all-access \
        --network NETWORK_NAME \
        --action deny \
        --direction EGRESS \
        --rules tcp \
        --destination-ranges 0.0.0.0/0 \
        --priority 1000
    

    Substitua NETWORK_NAME pelo nome da rede.

  2. Crie uma regra de firewall para permitir o tráfego TCP destinado à porta vm1 80.

    gcloud compute firewall-rules create vm1-allow-egress-tcp-port80-to-vm1 \
        --network NETWORK_NAME \
        --action allow \
        --direction EGRESS \
        --rules tcp:80 \
        --destination-ranges 192.168.1.2/32 \
        --priority 60
    

    Substitua NETWORK_NAME pelo nome da rede.

Exemplo 3: permitir ligações TCP de saída à porta 443 de um anfitrião externo

Crie uma regra de firewall que permita que as instâncias etiquetadas com webserver enviem tráfego TCP de saída para a porta 443 de um endereço IP externo de exemplo, 192.0.2.5.

gcloud

gcloud compute firewall-rules create vm1-allow-egress-tcp-port443-to-192-0-2-5 \
    --network NETWORK_NAME \
    --action allow \
    --direction EGRESS \
    --rules tcp:443 \
    --destination-ranges 192.0.2.5/32 \
    --priority 70 \
    --target-tags webserver

Substitua NETWORK_NAME pelo nome da rede.

Exemplo 4: permitir ligações SSH de vm2 para vm1

Crie uma regra de firewall que permita que o tráfego SSH de instâncias com a etiqueta database (vm2) alcance instâncias com a etiqueta webserver (vm1).

gcloud

gcloud compute firewall-rules create vm1-allow-ingress-tcp-ssh-from-vm2 \
    --network NETWORK_NAME \
    --action allow \
    --direction INGRESS \
    --rules tcp:22 \
    --source-tags database \
    --priority 80 \
    --target-tags webserver

Substitua NETWORK_NAME pelo nome da rede.

Exemplo 5: permitir TCP:1443 do servidor Web para a base de dados através de contas de serviço

Para ver informações adicionais sobre contas de serviço e funções, consulte o artigo Atribua funções a contas de serviço.

Considere o cenário na figura 2, no qual existem duas aplicações que são dimensionadas automaticamente através de modelos: uma aplicação de servidor Web associada a uma my-sa-webserver conta de serviço e uma aplicação de base de dados associada a uma my-sa-database conta de serviço. Um administrador de segurança quer permitir o tráfego TCP de VMs com a conta de serviço my-sa-webserver para a porta de destino 1443 de VMs com a conta de serviço my-sa-database.

Uma regra de firewall permite o tráfego de uma VM com a conta de serviço
      my-sa-webserver para a porta 1443 de uma VM com a conta de serviço
      my-sa-database.
Figura 2. Uma regra de firewall permite o tráfego de uma VM com a conta de serviço my-sa-webserver para a porta 1443 de uma VM com a conta de serviço my-sa-database (clique para aumentar).

Os passos de configuração, incluindo a criação das contas de serviço, são os seguintes.

gcloud

  1. Um EDITOR do projeto ou um PROPRIETÁRIO do projeto cria as contas de serviço my-sa-webserver e my-sa-database.

    gcloud iam service-accounts create my-sa-webserver \
        --display-name "webserver service account"
    
    gcloud iam service-accounts create my-sa-database \
        --display-name "database service account"
    
  2. Um PROPRIETÁRIO do projeto atribui ao programador do servidor Web web-dev@example.com uma função de serviceAccountUser para a conta de serviço my-sa-webserver ao definir uma política de gestão de identidade e de acesso (IAM).

    gcloud iam service-accounts add-iam-policy-binding \
    my-sa-webserver@my-project.s3ns.iam.gserviceaccount.com \
        --member='user:web-dev@example.com' \
        --role='roles/iam.serviceAccountUser'
    
  3. Um PROPRIETÁRIO do projeto atribui ao programador da base de dados db-dev@example.com a função de serviceAccountUser para a conta de serviço my-sa-database definindo uma política do IAM.

    gcloud iam service-accounts add-iam-policy-binding \
    my-sa-database@my-project.s3ns.iam.gserviceaccount.com \
        --member='user:db-dev@example.com' \
        --role='roles/iam.serviceAccountUser'
    
  4. O programador web-dev@example.com, que tem a função de administrador da instância, cria um modelo de instância do servidor Web e autoriza as instâncias a serem executadas como my-sa-webserverconta de serviço.

    gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
        --service-account my-sa-webserver@my-project-123.s3ns.iam.gserviceaccount.com
    
  5. O programador db-dev@example.com, que tem a função de administrador da instância, cria o modelo de instância da base de dados e autoriza as instâncias a serem executadas como conta de serviço my-sa-database.

    gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
        --service-account my-sa-database@my-project-123.s3ns.iam.gserviceaccount.com
    
  6. O administrador de segurança cria uma regra de firewall que permite o tráfego TCP de VMs com a conta de serviço my-sa-webserver para alcançar a porta 1443 de VMs com a conta de serviço my-sa-database.

    gcloud compute firewall-rules create RULE_NAME \
        --network network_a \
        --allow TCP:1443 \
        --source-service-accounts my-sa-webserver@my-project.s3ns.iam.gserviceaccount.com \
        --target-service-accounts my-sa-database@my-project.s3ns.iam.gserviceaccount.com
    

Resolução de problemas

Mensagens de erro ao criar ou atualizar uma regra de firewall da VPC

Pode ver uma das seguintes mensagens de erro:

  • Should not specify destination range for ingress direction.

    Os intervalos de destino não são parâmetros válidos para regras de firewall de entrada. As regras de firewall são consideradas regras de entrada, a menos que seja especificada uma direção de EGRESS. Se criar uma regra que não especifique uma direção, esta é criada como uma regra de entrada, que não permite um intervalo de destino. Além disso, os intervalos de origem não são parâmetros válidos para regras de saída.

  • Firewall direction cannot be changed once created.

    Não é possível alterar a direção de uma regra de firewall existente. Tem de criar uma nova regra com os parâmetros corretos e, em seguida, eliminar a antiga.

  • Firewall traffic control action cannot be changed once created.

    Não pode alterar a ação de uma regra de firewall existente. Tem de criar uma nova regra com os parâmetros corretos e, em seguida, eliminar a antiga.

  • Service accounts must be valid RFC 822 email addresses. A conta de serviço especificada na regra de firewall tem de ser um endereço de email formatado de acordo com a RFC 822.

    gcloud compute firewall-rules create bad --allow tcp --source-service-accounts invalid-email
    
    Creating firewall...failed.
    ERROR: (gcloud.compute.firewall-rules.create) Could not fetch resource:
    – Invalid value for field 'resource.sourceServiceAccounts[0]': 'invalid-email'. Service accounts must be valid RFC 822 email addresses.
    
  • ServiceAccounts and Tags are mutually exclusive and can't be combined in the same firewall rule. Não pode especificar contas de serviço e etiquetas na mesma regra.

    gcloud compute firewall-rules create bad --allow tcp --source-service-accounts test@google.com --target-tags target
    
    Creating firewall...failed.
     ERROR: (gcloud.compute.firewall-rules.create) Could not fetch resource:
    – ServiceAccounts and Tags are mutually exclusive and can't be combined in the same firewall rule.
    

Erro de recurso não encontrado

Quando elimina uma rede VPC ou uma regra de firewall, pode ver uma mensagem semelhante à seguinte: The resource "aet-uscentral1-subnet--1-egrfw" was not found.

Este erro pode impedir a eliminação de uma regra de firewall implícita ou a visualização dos respetivos detalhes. Uma regra de firewall neste estado também pode impedir a eliminação de uma rede da VPC.

Para eliminar uma regra de firewall ou uma rede bloqueada desta forma, elimine primeiro o conetor do Acesso a VPC sem servidor associado e, em seguida, tente novamente. Para mais informações sobre como eliminar um conetor de acesso VPC sem servidor, consulte o artigo eliminar um conetor.

Erro de demasiadas firewalls grandes

Pode ver a seguinte mensagem de erro: Google Compute Engine: The network contains too many large firewalls.

Para manter a segurança e o desempenho, existe um limite para a complexidade e o número de regras de firewall que podem ser implementadas numa rede de VPC. Se vir este erro, peça à equipa de gestão da conta para simplificar ou consolidar as regras da firewall.

Não é possível estabelecer ligação à instância de VM

Se não conseguir estabelecer ligação a uma instância de VM, verifique as regras da firewall.

gcloud

  1. Se estiver a iniciar a ligação a partir de outra instância de VM, liste as regras de firewall de saída dessa instância.

    gcloud compute firewall-rules list --filter network=NETWORK_NAME \
      --filter EGRESS \
      --sort-by priority \
      --format="table(
          name,
          network,
          direction,
          priority,
          sourceRanges.list():label=SRC_RANGES,
          destinationRanges.list():label=DEST_RANGES,
          allowed[].map().firewall_rule().list():label=ALLOW,
          denied[].map().firewall_rule().list():label=DENY,
          sourceTags.list():label=SRC_TAGS,
          sourceServiceAccounts.list():label=SRC_SVC_ACCT,
          targetTags.list():label=TARGET_TAGS,
          targetServiceAccounts.list():label=TARGET_SVC_ACCT
          )"
    

    Substitua NETWORK_NAME pelo nome da rede.

  2. Verifique se o IP de destino é recusado por alguma regra de saída. A regra com a prioridade mais elevada (número de prioridade mais baixo) substitui as regras de prioridade mais baixa. Para duas regras com a mesma prioridade, a regra de recusa tem precedência.

  3. Verifique a regra de firewall de entrada para a rede que contém a instância de VM de destino.

    gcloud compute firewall-rules list --filter network=NETWORK_NAME \
      --filter INGRESS \
      --sort-by priority \
      --format="table(
          name,
          network,
          direction,
          priority,
          sourceRanges.list():label=SRC_RANGES,
          destinationRanges.list():label=DEST_RANGES,
          allowed[].map().firewall_rule().list():label=ALLOW,
          denied[].map().firewall_rule().list():label=DENY,
          sourceTags.list():label=SRC_TAGS,
          sourceServiceAccounts.list():label=SRC_SVC_ACCT,
          targetTags.list():label=TARGET_TAGS,
          targetServiceAccounts.list():label=TARGET_SVC_ACCT
          )"
    

    Substitua NETWORK_NAME pelo nome da rede.

    Exemplo de saída. O resultado depende da sua lista de regras de firewall.

    NAME                    NETWORK  DIRECTION  PRIORITY  SRC_RANGES    DEST_RANGES  ALLOW                         DENY  SRC_TAGS  SRC_SVC_ACCT      TARGET_TAGS  TARGET_SVC_ACCT
    default-allow-icmp      default  INGRESS    65534     0.0.0.0/0                  icmp
    default-allow-internal  default  INGRESS    65534     10.128.0.0/9               tcp:0-65535,udp:0-65535,icmp
    default-allow-rdp       default  INGRESS    65534     0.0.0.0/0                  tcp:3389
    default-allow-ssh       default  INGRESS    65534     0.0.0.0/0                  tcp:22
    firewall-with-sa        default  INGRESS    1000                                 tcp:10000                                     test1@google.com               target@google.com
    
  4. Também pode executar testes de conetividade de/para instâncias de VMs numa rede VPC para outra rede VPC ou rede na nuvem não pertencente à Google para resolver problemas se o tráfego estiver a ser rejeitado por regras de firewall de entrada ou saída. Para mais informações sobre como executar os testes de conetividade para resolver problemas em vários cenários, consulte o artigo Executar testes de conetividade.

A minha regra de firewall da VPC está ativada ou desativada?

Para ver se uma regra de firewall está ativada ou desativada, consulte os detalhes das regras de firewall.

No Trusted Cloud console, procure Ativado ou Desativado na secção Aplicação.

No resultado da CLI gcloud, procure o campo disabled. Se indicar disabled:false, a regra está ativada e a ser aplicada. Se for apresentado disabled: true, a regra está desativada.

Que regra está a ser aplicada numa instância de VM?

Depois de criar uma regra, pode verificar se está a ser aplicada corretamente numa instância específica. Para mais informações, consulte o artigo Liste as regras da firewall para uma interface de rede de uma instância de VM.

As regras de firewall da VPC com etiquetas de origem não entram em vigor imediatamente

As regras de firewall de entrada que usam etiquetas de origem podem demorar algum tempo a propagar-se. Para ver detalhes, consulte as considerações relacionadas com as etiquetas de origem para regras de firewall de entrada.

O que se segue?