Usa reglas de firewall de VPC

En esta página, se describen los comandos necesarios para trabajar con reglas de firewall de la nube privada virtual (VPC) y se ofrecen algunos ejemplos de cómo usarlas. Las reglas de firewall de VPC permiten o rechazan el tráfico desde o hacia las instancias de máquina virtual (VM) en una red de VPC según el número de puerto, la etiqueta o el protocolo.

Antes de comenzar

A fin de obtener más información sobre las reglas de firewall de VPC, como las reglas implícitas y las generadas por el sistema para las redes predeterminadas, consulta Reglas de firewall de VPC.

Antes de configurar las reglas de firewall, revisa los componentes de las reglas de firewall para familiarizarte con los componentes de firewall que se usan en Google Cloud.

Crea reglas de firewall de VPC

Las reglas de firewall de VPC se definen a nivel de red y solo se aplican a la red en la que se crean; sin embargo, el nombre que elijas para cada una de ellas debe ser exclusivo del proyecto.

Una regla de firewall puede contener rangos IPv4 o IPv6, pero no ambos.

Cuando creas una regla de firewall, puedes elegir habilitar el registro de reglas de firewall. Si lo habilitas, puedes omitir los campos de metadatos para ahorrar costos de almacenamiento. Para obtener más información, consulta Usa el registro de reglas de firewall de VPC.

Si quieres especificar varias cuentas de servicio para el campo de cuenta de servicio de origen o de destino, usa Google Cloud CLI, la API o las bibliotecas cliente.

La red predeterminada proporciona reglas de firewall automáticas en el momento de la creación. Las redes de modo automático y personalizado te permiten crear firewalls similares con facilidad durante la creación de la red si usas la Google Cloud consola. Si usas gcloud CLI o la API y deseas crear reglas de firewall similares a las que proporciona la red predeterminada, consulta Configura reglas de firewall para casos de uso comunes.

Console

  1. En la consola de Google Cloud , ve a la página Políticas de firewall.

    Ir a Políticas de firewall

  2. Haz clic en Crear regla de firewall.

  3. Ingresa un Nombre para la regla de firewall.

    Este nombre debe ser único para el proyecto.

  4. (Opcional) Puedes habilitar los registros de reglas de firewall:

    • Haz clic en Registros > Activados.
    • Para omitir los metadatos, haz clic en Mostrar detalles de registros y, luego, desmarca la casilla de verificación Incluir metadatos.
  5. Especifica la Red para la regla de firewall.

  6. Especifica la Prioridad de la regla.

    Mientras más bajo sea el número, más alta será la prioridad.

  7. Para la Dirección del tráfico, elige entrada o salida.

  8. Para Acción en caso de coincidencia, elige permitir o rechazar.

  9. Especifica los Objetivos de la regla.

    • Si quieres que la regla se aplique a todas las instancias de la red, elige All instances in the network.
    • Si deseas que la regla se aplique a determinadas instancias por etiquetas de red (de destino), elige Etiquetas de destino especificadas y, luego, en el campo Etiquetas de destino, escribe las etiquetas a las que se debería aplicar la regla.
    • Si deseas que la regla se aplique a determinadas instancias por cuenta de servicio asociada, elige Cuenta de servicio especificada, indica si la cuenta de servicio está en el proyecto actual o en otro en Alcance de la cuenta de servicio y, luego, en el campo Cuenta de servicio de destino, elige o escribe el nombre de la cuenta de servicio.
  10. Para una regla de entrada, especifica el Filtro de fuente:

    • Para filtrar el tráfico entrante por rangos de IPv4 de origen, selecciona Rangos de IPv4 y, luego, ingresa los bloques de CIDR en el campo Rangos de IPv4 de origen. Usa 0.0.0.0/0 para cualquier origen IPv4.
    • Para filtrar el tráfico entrante por rangos de IPv6 de origen, selecciona Rangos de IPv6 y, luego, ingresa los bloques de CIDR en el campo Rangos de IPv6 de origen. Usa ::/0 para cualquier origen IPv6.
    • Para filtrar el tráfico entrante por etiqueta de red, elige Etiquetas de origen y, luego, escribe las etiquetas de red en el campo Etiquetas de origen. Si quieres conocer el límite en la cantidad de etiquetas de origen, consulta Límites por red. Solo es posible filtrar por etiquetas de origen si el objetivo no está especificado por cuenta de servicio.
    • Para limitar el tráfico entrante por cuenta de servicio, elige Cuenta de servicio, indica si la cuenta de servicio está en el proyecto actual o en otro en Permiso de la cuenta de servicio y, luego, elige o escribe el nombre de la cuenta de servicio en el campo Cuenta de servicio de origen. Solo es posible filtrar por cuentas de servicio de origen si el objetivo no está especificado por etiqueta de red.
    • Especifica un Segundo filtro de fuente si así lo deseas. Los filtros de origen secundarios no pueden usar los mismos criterios de filtrado que los principales. Los rangos de IP de origen se pueden usar junto con las etiquetas de origen o la cuenta de servicio de origen. El conjunto de orígenes efectivo consta de la unión entre las direcciones IP del rango de origen y las instancias identificadas por las etiquetas de red o las cuentas de servicio. Es decir, si el rango de IP de origen, o las etiquetas de origen (o las cuentas de servicio de origen) coinciden con los criterios del filtro, el origen se incluye en el conjunto de orígenes efectivo.
    • Las etiquetas de origen y la cuenta de servicio de origen no se pueden usar juntas.

    Para obtener más información sobre el uso de una cuenta de servicio y una etiqueta de red, consulta Filtrado por cuenta de servicio frente a filtrado por etiqueta de red.

  11. Para una regla de entrada, especifica el Filtro de origen:

    • Para filtrar el tráfico entrante por rangos de IPv4 de destino, selecciona Rangos de IPv4 e ingresa los bloques de CIDR en el campo Rangos de IPv4 de destino. Usa 0.0.0.0/0 para cualquier destino de IPv4.
    • Para filtrar el tráfico entrante por rangos de IPv6 de destino, selecciona Rangos de IPv6 e ingresa los bloques de CIDR en el campo Rangos de IPv6 de destino. Usa ::/0 para cualquier destino de IPv6.

    Si deseas obtener más información, consulta Destino para las reglas de entrada.

  12. Para una regla de salida, especifica el Filtro de destino:

    • Para filtrar el tráfico saliente por rangos de IPv4 de destino, selecciona Rangos de IPv4 e ingresa los bloques de CIDR en el campo Rangos de IPv4 de destino. Usa 0.0.0.0/0 para cualquier destino de IPv4.
    • Para filtrar el tráfico saliente por rangos de IPv6 de destino, selecciona Rangos de IPv6 e ingresa los bloques de CIDR en el campo Rangos de IPv6 de destino. Usa ::/0 para cualquier destino de IPv6.

    Si deseas obtener más información, consulta Destino para las reglas de salida.

  13. Para una regla de salida, especifica el Filtro de destino:

    • Para filtrar el tráfico saliente por rangos de IPv4 de origen, selecciona Rangos de IPv4 y, luego, ingresa los bloques de CIDR en el campo Rangos de IPv4 de origen. Usa 0.0.0.0/0 para cualquier origen IPv4.
    • Para filtrar el tráfico saliente por rangos de IPv6 de destino, selecciona Rangos de IPv6 e ingresa los bloques de CIDR en el campo Rangos de IPv6 de origen. Usa ::/0 para cualquier destino de IPv6.

    Si deseas obtener más información, consulta Fuente para las reglas de salida.

  14. Define los Protocolos y puertos a los que se aplica la regla:

    • Para que la regla se aplique a todos los protocolos y puertos de destino, selecciona Permitir todo o Rechazar todo, según la acción.
    • Para definir protocolos y puertos de destino específicos, selecciona Protocolos y puertos especificados:
      • Selecciona TCP a fin de incluir los puertos de destino y el protocolo TCP. Ingresa all o una lista de puertos de destino delimitada por comas, como 20-22, 80, 8080.
      • Selecciona UDP para incluir los puertos de destino y el protocolo UDP. Ingresa all o una lista de puertos de destino delimitada por comas, como 67-69, 123.
      • Selecciona Otros protocolos para incluir protocolos como icmp, sctp o un número de protocolo. Por ejemplo, usa icmp o el número de protocolo 1 para ICMP de IPv4. Usa el número de protocolo 58 para ICMP de IPv6.

    Para obtener más información, consulta Protocolos y puertos de destino.

  15. Puedes crear la regla de firewall sin aplicarla, si configuras su estado de aplicación como inhabilitado (opcional). Haz clic en Inhabilitar regla y, luego, selecciona Inhabilitado.

  16. Haz clic en Crear.

gcloud

Para crear una regla de firewall de VPC, usa el 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]

Usa los parámetros como se describe a continuación. Puedes obtener más detalles en la documentación de referencia de SDK.

  • --network: Es la red para la regla. Si se omite, la regla se crea en la red default. Si no tienes una red predeterminada o quieres crearla en una red específica, debes usar este campo.
  • --priority: Es un valor numérico que indica la prioridad de la regla. Mientras más bajo sea el número, más alta será la prioridad.
  • --direction: Es la dirección del tráfico: puede ser INGRESS o EGRESS.
  • --action: Es la acción en caso de coincidencia; allow o deny. Se debe usar con la marca --rules.
  • Especifica un destino de una de las siguientes maneras:
    • Omite --target-tags y --target-service-accounts si la regla se debe aplicar a todos los objetivos de la red.
    • Usa la marca --target-tags para definir destinos por etiquetas de red.
    • Usa la marca --target-service-accounts para definir destinos por cuentas de servicio asociadas.
  • Para la regla de entrada, a fin de definir mejor el destino, usa --destination-ranges para especificar rangos de direcciones IPv4 o IPv6 en formato CIDR. Si se omite --destination-ranges, el destino de entrada es cualquier dirección IPv4, 0.0.0.0/0. Si deseas obtener más información, consulta Destinos para las reglas de entrada y Direcciones IP y de destino para las reglas de entrada.

  • Para una regla de entrada, especifica una origen:

    • --source-ranges Usa esta marca para especificar rangos de direcciones IPv4 o IPv6 de origen en formato CIDR.
    • Si se omiten --source-ranges, source-tags y --source-service-accounts, la fuente de entrada es cualquier dirección IPv4, 0.0.0.0/0.
    • --source-tags Usa esta marca para especificar instancias de origen por etiquetas de red. Solo es posible filtrar por etiquetas de origen si el objetivo no está especificado por cuenta de servicio. Para obtener más información, consulta la comparación entre el filtrado por cuenta de servicio y por etiqueta de red.
    • --source-ranges y --source-tags se pueden usar a la vez. Si ambas se especifican, el conjunto de orígenes efectivo consta de la unión de las direcciones IP del rango de origen y las instancias identificadas por etiquetas de red, incluso si las instancias etiquetadas no tienen IP en los rangos de origen.
    • --source-service-accounts: Usa esta marca para especificar instancias por las cuentas de servicio que usan. Solo es posible filtrar por cuentas de servicio de origen si el objetivo no está especificado por etiqueta de red. Para obtener más información, consulta la comparación entre el filtrado por cuenta de servicio y por etiqueta de red. --source-ranges y --source-service-accounts se pueden usar a la vez. Si se especifican ambos, el conjunto de orígenes efectivo consta de la unión de las direcciones IP del rango de origen y las instancias identificadas por las cuentas de servicio de origen, incluso si las cuentas de servicio de origen no tienen IP en los rangos de origen.
  • Para la regla de salida y definir mejor el origen, usa--source-ranges y podrás especificar rangos de direcciones IPv4 o IPv6 en formato CIDR. Si se omite --source-ranges, el origen de salida es cualquier dirección IPv4, 0.0.0.0/0. Si deseas obtener más información, consulta Fuentes para reglas de salida y Direcciones IP y de destino para reglas de salida.

  • Para una regla de salida, especifica un destino:

    • --destination-ranges Usa esta marca para especificar rangos de direcciones IPv4 o IPv6 de destino en formato CIDR.
    • Si se omite --destination-ranges, el destino de salida es cualquier dirección IPv4, 0.0.0.0/0.
  • --rules Una lista de protocolos y puertos de destino a los que se aplica la regla. Usa all para que la regla sea aplicable a todos los protocolos y los puertos de destino. Requiere la marca --action.

  • Según la configuración predeterminada, las reglas de firewall se crean y comienzan a aplicarse automáticamente, pero puedes cambiar este comportamiento.

    • Si se omiten --disabled y --no-disabled, la regla de firewall se crea y se aplica.
    • --disabled Agrega esta marca para crear la regla de firewall, pero no aplicarla. La regla de firewall permanecerá inhabilitada hasta que la actualices para habilitarla.
    • --no-disabled Agrega esta marca para asegurarte de que la regla de firewall se aplique.
  • --enable-logging | --no-enable-logging: Puedes habilitar el registro de reglas de firewall para una regla cuando la crees o actualices. El registro de reglas de firewall de VPC te permite auditar, verificar y analizar los efectos de tus reglas de firewall. Consulta Registro de reglas de firewall de VPC para obtener más información.

    • --logging-metadata: Si habilitas el registro, de forma predeterminada, el registro de reglas de firewall incluye campos de base y metadatos. Puedes omitir los campos de metadatos para ahorrar costos de almacenamiento. Para obtener más información, consulta Usa el registro de reglas de firewall de VPC.

Terraform

Para crear una regla de firewall, puedes usar un 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"]
}

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

API

Crea una regla de firewall de 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
}

Reemplaza lo siguiente:

  • PROJECT_ID es el ID del proyecto en el que se encuentra la red de VPC.
  • NETWORK es el nombre de la red de VPC en la que se crea la regla de firewall.
  • RULE_NAME: Es el nombre de la regla de firewall.

  • Para una regla de firewall de entrada, especifica el origen y el destino de entrada:

    • Usa los campos sourceRanges, sourceTags o sourceServiceAccounts para especificar la fuente de entrada.

    • sourceRanges puede ser un rango IPv4 o IPv6, pero no una combinación de ambos. Para usar el rango 0.0.0.0/0, no especifiques ningún campo.

    • No puedes usar los campos sourceTags y sourceServiceAccounts al mismo tiempo. Sin embargo, puedes usar sourceRanges con sourceTags o sourceServiceAccounts. Si lo haces, la conexión debe coincidir con cualquiera de los dos para que se aplique la regla de firewall.

    • Para los campos de destino, si usas el campo sourceTags, no puedes usar el campo targetServiceAccounts. Debes usar el campo targetTags o ningún campo de destino. Del mismo modo, si usas el campo sourceServiceAccounts, no puedes usar el campo targetTags. Si no especificas un campo de destino, la regla se aplica a todos los destinos de la red.

    • Usa el campo destinationRanges para especificar el origen. destinationRanges puede ser un rango IPv4 o IPv6, pero no una combinación de ambos.
      Si no especificas un destino, Google Cloud usará 0.0.0.0/0. Si deseas obtener más información, consulta Destinos para las reglas de entrada y Direcciones IP y de destino para las reglas de entrada.

  • Para una regla de firewall de salida, especifica la fuente y el destino de salida:

    • Usa el campo sourceRanges para especificar la fuente de salida. sourceRange puede ser un rango IPv4 o IPv6, pero no una combinación de ambos.
      Si no especificas una fuente, Google Cloud usa 0.0.0.0/0. Si deseas obtener más información, consulta Fuentes para reglas de salida y Direcciones IP y de destino para reglas de salida.

    • Usa el campo destinationRanges para especificar el destino. destinationRanges puede ser un rango IPv4 o IPv6, pero no una combinación de ambos.
      Si no especificas un destino, Google Cloud usa 0.0.0.0/0. Usa el campo targetTags o targetServiceAccounts para especificar a qué objetivos se aplica la regla. Si no especificas un campo de destino, la regla se aplica a todos los destinos de la red.

Para obtener más información y descripciones de cada campo, consulta el 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\Firewall;
use Google\Cloud\Compute\V1\Firewall\Direction;
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::name(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

Actualiza las reglas de firewall de VPC

Puedes modificar algunos componentes de una regla de firewall de VPC, como los protocolos y los puertos de destino especificados para la condición de coincidencia. No puedes modificar el nombre, la red, la acción en caso de coincidencia ni la dirección del tráfico de una regla de firewall.

Si necesitas cambiar el nombre, la red, o el componente de acción o dirección, debes borrar la regla y crear una nueva en su lugar.

Si deseas agregar o quitar varias cuentas de servicio, usa la gcloud CLI, la API o las bibliotecas cliente. No puedes usar la consola de Google Cloud para especificar varias cuentas de servicio de destino o de origen.

Console

  1. En la consola de Google Cloud , ve a la página Políticas de firewall.

    Ir a Políticas de firewall

  2. Haz clic en la regla de firewall que quieres modificar.

  3. Haz clic en Editar.

  4. Modifica todos los componentes editables que necesites.

  5. Haz clic en Guardar.

gcloud

Para actualizar las reglas de firewall de VPC, usa el 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]

Las descripciones de cada marca son las mismas que para crear reglas de firewall y puedes obtener más detalles acerca de cada una en la documentación de referencia del SDK.

API

Usa PATCH para actualizar los siguientes campos: allowed, description, sourceRanges, sourceTags o targetTags. Usa PUT o POST para todos los demás 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
}

Reemplaza lo siguiente:

  • PROJECT_ID es el ID del proyecto en el que se encuentra la red de VPC.
  • NETWORK es el nombre de la red de VPC en la que se encuentra la regla de firewall.
  • RULE_NAME es el nombre de la regla de firewall que deseas actualizar.

Para obtener más información y descripciones de cada campo, consulta los métodos firewalls.patch o 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