Organízate con las colecciones Guarda y clasifica el contenido según tus preferencias.

Usa reglas de firewall

En esta página, se describen los comandos necesarios para trabajar con reglas de firewall y se ofrecen algunos ejemplos de su uso.

Antes de comenzar

Consulta la Descripción general de las reglas de firewall a fin de obtener más información al respecto, como las reglas implícitas y las reglas generadas por el sistema para las redes predeterminadas.

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

Las reglas de firewall 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.

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 consola. Si usas la CLI de gcloud 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. Ve a la página Firewall en Google Cloud Console.
    Ir a la página 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. Puedes habilitar los registros de reglas de firewall (opcional):
    • Haz clic en Registros > Activados.
    • Para omitir los metadatos, expande Detalles de los registros y, luego, borra 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 deseas que la regla se aplique a todas las instancias de la red, selecciona All instances in the network.
    • Si deseas que la regla se aplique a determinadas instancias por etiquetas de red (de destino), elige Specified target tags y, luego, escribe las etiquetas a las que debe aplicarse la regla en el campo Etiquetas de destino.
    • Si deseas que la regla se aplique a instancias seleccionadas por la cuenta de servicio asociada, selecciona Specified service account, indica si la cuenta de servicio está en el proyecto actual o en otro en Permiso de la cuenta de servicio, y elige o escribe el nombre de la cuenta de servicio en el campo Cuenta de servicio de destino.
  10. Para una regla de entrada, especifica el Filtro de origen:
    • Para filtrar el tráfico entrante por rangos de IPv4 de origen, selecciona IPv4 ranges 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 IPv6 ranges 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, selecciona Source tags 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 obtener más información, consulta la comparación entre el filtrado por cuenta de servicio y por etiqueta de red.
    • Para limitar el tráfico entrante por cuenta de servicio, elige Service account, indica si la cuenta de servicio está en el proyecto actual o en otro en Permiso de la cuenta de servicio, y 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. Para obtener más información, consulta la comparación entre el filtrado por cuenta de servicio y 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.
  11. Para una regla de salida, especifica el Filtro de destino:
    • Para filtrar el tráfico saliente por rangos de IPv4 de destino, selecciona IPv4 ranges y, luego, 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 IPv6 ranges y, luego, ingresa los bloques de CIDR en el campo Rangos de IPv6 de destino. Usa ::/0 para cualquier destino de IPv6.
  12. Define los Protocolos y puertos a los que se aplica la regla:

    • Selecciona Allow all o Deny all, según la acción, para que la regla se aplique a todos los protocolos y los puertos de destino.

    • Define protocolos y puertos de destino específicos:

      • 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. Usa el protocolo 58 para ICMPv6. Consulta protocolos y puertos de destino para obtener más información.
  13. 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.

  14. Haz clic en Crear.

gcloud

El comando de gcloud para crear reglas de firewall es el siguiente:

gcloud compute firewall-rules create 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 objetivo de una de estas tres maneras:
    • Omite --target-tags y --target-service-accounts si la regla se debe aplicar a todos los objetivos de la red.
    • --target-tags: Usa esta marca para definir objetivos por etiquetas de red.
    • --target-service-accounts: Usa esta marca para definir objetivos por cuentas de servicio asociadas.
  • Para una regla de entrada, especifica un 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 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 aplican de forma automática, 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 te permite auditar, verificar y analizar los efectos de estas reglas. Consulta Registro de reglas de firewall 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.

API

Crea una regla de firewall.

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

Reemplaza los marcadores de posición por valores válidos:

  • 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.
  • FIREWALL_NAME es un nombre para la regla de firewall.

  • Para una regla de firewall de entrada, usa los siguientes campos a fin de especificar el origen de entrada: sourceRanges, sourceTags o sourceServiceAccounts. sourceRanges puede ser un rango IPv4 o IPv6, pero no una combinación de ambos. No especifiques ningún campo para usar el rango 0.0.0.0/0. 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.

  • Para una regla de firewall de salida, usa el campo destinationRanges a fin de 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 "google.golang.org/genproto/googleapis/cloud/compute/v1"
	"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: %v", 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: %v", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %v", 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\FirewallsClient;
use Google\Cloud\Compute\V1\Allowed;
use Google\Cloud\Compute\V1\Firewall;

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

/**
 * 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.
    $operation = $firewallsClient->insert($firewallResource, $projectId);

    // 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

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:
    """
    This method will wait 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

Terraform

Puedes usar un recurso de Terraform para crear una regla de firewall.

resource "google_compute_firewall" "rules" {
  project     = var.project_id # Replace this with your project ID in quotes
  name        = "my-firewall-rule"
  network     = "default"
  description = "Creates firewall rule targeting tagged instances"

  allow {
    protocol = "tcp"
    ports    = ["80", "8080", "1000-2000"]
  }
  target_tags = ["web"]
}

Para aprender a aplicar o quitar una configuración de Terraform, consulta Trabaja con una configuración de Terraform.

Actualiza reglas de firewall

Puedes modificar algunos componentes de una regla de firewall, 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 Google Cloud CLI, la API o las bibliotecas cliente. No puedes usar la consola para especificar varias cuentas de servicio de destino o de origen.

Console

  1. Ve a la página Firewall en Google Cloud Console.
    Ir a la página 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.

    En el campo Protocolos y puertos especificados, usa una lista delimitada por punto y coma para especificar varios protocolos y combinaciones de protocolo y puerto de destino. Para especificar ICMP de IPv4, usa icmp o el número de protocolo 1. Para especificar ICMP de IPv6, usa el número de protocolo 58. Consulta Protocolos y puertos de destino para obtener más información.

  5. Haz clic en Guardar.

gcloud

El comando de gcloud para actualizar reglas de firewall es el siguiente:

gcloud compute firewall-rules update 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/FIREWALL_NAME
{
  "name": "FIREWALL_NAME",
  "network": "projects/PROJECT-ID/global/networks/NETWORK",
  ... other fields
}

Reemplaza los marcadores de posición por valores válidos:

  • 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.
  • FIREWALL_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 firewallRulePatching.PollUntilCompletedAsync();
    }
}

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "google.golang.org/genproto/googleapis/cloud/compute/v1"
	"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: %v", 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: %v", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %v", 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\FirewallsClient;
use Google\Cloud\Compute\V1\Firewall;

/**
 * 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.
    $operation = $firewallsClient->patch($firewallRuleName, $firewallResource, $projectId);

    // 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

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:
    """
    This method will wait 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")
    return

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

Enumera las reglas de firewall para una red de VPC

En la consola de Google Cloud, puedes enumerar todas las reglas de firewall para tu proyecto o para una red de VPC en particular. Para cada regla de firewall, la consola de Google Cloud muestra detalles como el tipo, los objetivos y los filtros de la regla.

Si habilitas el registro de reglas de firewall, Firewall Insights puede proporcionarte estadísticas sobre tus reglas de firewall para ayudarte a comprender mejor y optimizar de forma segura sus parámetros de configuración. Por ejemplo, puedes ver qué reglas allow no se usaron en las últimas seis semanas. Para obtener más información, consulta Usa la pantalla de detalles de las reglas de firewall en la documentación de Firewall Insights.

Console

Para ver una lista de todas las reglas de firewall de todas las redes en tu proyecto:

Para ver una lista de todas las reglas de firewall de una red en particular:

  1. Ve a la página Redes de VPC en Google Cloud Console.
    Ir a la página Redes de VPC
  2. Haz clic en el Nombre de la red de VPC para ver su página de detalles.
  3. En la página de detalles de la red, haz clic en la pestaña Reglas de firewall.

gcloud

El siguiente comando produce una lista ordenada de las reglas de firewall de una red determinada ([NETWORK-NAME]).

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
        )"

API

Enumera todas las reglas de firewall para una red determinada.

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

Reemplaza los marcadores de posición por valores válidos:

  • 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 que contiene las reglas de firewall que se enumerarán.

Para obtener más información, consulta el 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"
	"google.golang.org/api/iterator"
	computepb "google.golang.org/genproto/googleapis/cloud/compute/v1"
)

// 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: %v", 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\FirewallsClient;

/**
 * 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();
    $firewallList = $firewallClient->list($projectId);

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

Python

from typing 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

Enumera las reglas de firewall para una interfaz de red de una instancia de VM

Para cada interfaz de red, la consola de Google Cloud enumera todas las reglas de firewall que se aplican a la interfaz y las reglas que usa la interfaz. Las reglas de firewall pueden enmascarar otras reglas, por lo que una interfaz podría no estar usando todas las reglas que se le aplican.

Las reglas de firewall se asocian con una instancia de VM y se aplican a ella mediante el parámetro de objetivo de una regla. Si consultas la lista de todas las reglas que se aplican, puedes verificar si una regla en particular se está aplicando a una interfaz.

Si habilitas el registro de reglas de firewall, Firewall Insights puede proporcionarte estadísticas sobre tus reglas de firewall para ayudarte a comprender mejor y optimizar de forma segura sus parámetros de configuración. Por ejemplo, puedes ver qué reglas de una interfaz se usaron en las últimas seis semanas. Para obtener más información, consulta Usa la pantalla de detalles de la interfaz de red de VM en la documentación de Firewall Insights.

Console

Para ver las reglas que se aplican a una interfaz de red específica de una instancia de VM, sigue estos pasos:

  1. Ve a la página Instancias de VM en Google Cloud Console y busca la instancia que deseas ver.
    Ir a la página Instancias de VM
  2. En el menú más acciones de la instancia (), selecciona Ver detalles de la red.
  3. Si una instancia tiene varias interfaces de red, selecciona la interfaz de red que quieres ver en la sección Detalles de la interfaz de red.
  4. En la sección Detalles de firewall y rutas, haz clic en la pestaña Reglas de firewall.
  5. Consulta la tabla para determinar si se permite el tráfico desde o hacia una dirección IP específica.

Visualiza detalles de las reglas de firewall

Puedes inspeccionar una regla de firewall para ver su nombre, red aplicable y componentes, y si la regla está habilitada o inhabilitada.

Console

  1. Enumera tus reglas de firewall. Puedes visualizar una lista de todas las reglas o solo aquellas de una red en particular.
  2. Haz clic en la regla que quieres ver.

gcloud

El siguiente comando describe una regla de firewall individual. Reemplaza [FIREWALL-NAME] por el nombre de la regla de firewall. Debido a que los nombres de reglas de firewall son únicos del proyecto, no tienes que especificar una red cuando describes una regla existente.

gcloud compute firewall-rules describe [FIREWALL-NAME]

API

Describe una regla de firewall determinada.

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

Reemplaza los marcadores de posición por valores válidos:

  • PROJECT_ID es el ID del proyecto en el que se encuentra la regla de firewall.
  • FIREWALL_NAME es el nombre de la regla de firewall que deseas describir.

Para obtener más información, consulta el método firewalls.get.

Borra reglas de firewall

Console

  1. Enumera tus reglas de firewall. Puedes visualizar una lista de todas las reglas o solo aquellas de una red en particular.
  2. Haz clic en la regla que quieres borrar.
  3. Haz clic en Borrar.
  4. Haz clic en Borrar nuevamente para confirmar.

gcloud

El siguiente comando borra una regla de firewall. Reemplaza [FIREWALL-NAME] con el nombre de la regla que quieres borrar.

gcloud compute firewall-rules delete [FIREWALL-NAME]

API

Borra una regla de firewall.

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

Reemplaza los marcadores de posición por valores válidos:

  • PROJECT_ID es el ID del proyecto en el que se encuentra la regla de firewall.
  • FIREWALL_NAME es el nombre de la regla de firewall que deseas borrar.

Para obtener más información, consulta el 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 "google.golang.org/genproto/googleapis/cloud/compute/v1"
)

// 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: %v", 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: %v", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %v", 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\FirewallsClient;

/**
 * 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.
    $operation = $firewallsClient->delete($firewallRuleName, $projectId);

    // 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

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:
    """
    This method will wait 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")
    return

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

Supervisa reglas de firewall

Puedes habilitar los registros de reglas de firewall para ver qué regla permitió o bloqueó qué tráfico. Consulta Usa el registro de reglas de firewall para obtener instrucciones.

Configura reglas de firewall para casos de uso comunes

En las siguientes secciones, se proporcionan ejemplos de la CLI de gcloud y la API a fin de volver a crear las reglas de firewall predefinidas creadas para las redes predeterminadas. Puedes usar los ejemplos a fin de crear reglas similares para tus redes de modo personalizado y automático. Cada regla de firewall puede incluir rangos de direcciones IPv4 o IPv6, pero no ambos.

Permite conexiones de entrada internas entre VM

En los siguientes ejemplos, se crea una regla de firewall para permitir conexiones internas, TCP, ICMP y UDP a tus instancias de VM, de manera similar a la regla allow-internal para redes predeterminadas:

gcloud

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

Reemplaza lo siguiente:

  • NAME: El nombre de esta regla de firewall.
  • NETWORK: El nombre de la red a la que se aplica esta regla de firewall. El valor predeterminado es default.
  • ICMP_PROTOCOL: Especifica ICMPv4 con el nombre del protocolo icmp o el número de protocolo 1. Especifica ICMPv6 con el número de protocolo 58.
  • SUBNET_RANGES: Uno o más rangos de direcciones IP. Incluir un rango de direcciones IP significa que el tráfico de ese rango puede llegar a cualquier destino de VM en la red de VPC. Puedes especificar rangos de IPv4 o de IPv6 en una regla de firewall determinada.

    Rangos de subredes IPv4

    • Las redes de VPC de modo automático usan rangos de direcciones IP que están dentro de 10.128.0.0/9.
    • Las redes en modo personalizado pueden usar cualquier rango IPv4 válido. Si no usas rangos contiguos a las subredes de tu red de VPC, es posible que debas especificar varios rangos.
    • Puedes usar 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 para permitir el tráfico de todos los rangos de direcciones IPv4 privadas (rangos RFC 1918).

    Rangos de subredes IPv6:

    • Si asignaste un rango de direcciones IPv6 interna a tu red de VPC, puedes usar ese rango como un rango de origen. El uso del rango IPv6 interno de la red de VPC significa que la regla de firewall incluye todos los rangos de subred IPv6 internos actuales y futuros. Para encontrar el rango IPv6 interno de la red de VPC, puedes usar el siguiente comando:

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

      También puedes especificar rangos de subredes IPv6 internos específicos.

    • Para permitir el tráfico de los rangos de subredes IPv6 externas de las subredes de doble pila, debes especificar el rango de direcciones IPv6 de cada subred que desees incluir.

API

POST https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
{
  "kind": "compute#firewall",
  "name": "FIREWALL_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"
  ]
}

Reemplaza lo siguiente:

  • PROJECT_ID es el ID del proyecto en el que se encuentra la red de VPC.
  • FIREWALL_NAME: El nombre de la red de VPC en la que se crea la regla de firewall.
  • NETWORK: Es un nombre para la regla de firewall. El valor predeterminado es default.
  • ICMP_PROTOCOL: Especifica ICMPv4 con el nombre del protocolo icmp o el número de protocolo 1. Especifica ICMPv6 con el número de protocolo 58.
  • INTERNAL_SOURCE_RANGES: Uno o más rangos de IP. Para permitir el tráfico interno dentro de todas las subredes en tus redes de VPC, especifica los rangos de direcciones IP que se usan en tu red de VPC. Puedes especificar rangos de IPv4 o de IPv6 en una regla de firewall determinada.

    Rangos de subredes IPv4

    • Las redes de VPC de modo automático usan rangos de direcciones IP que están dentro de 10.128.0.0/9.
    • Las redes en modo personalizado pueden usar cualquier rango IPv4 válido. Si no usas rangos contiguos a las subredes de tu red de VPC, es posible que debas especificar varios rangos.
    • Puedes usar 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 para permitir el tráfico de todos los rangos de direcciones IPv4 privadas (rangos RFC 1918).

    Rangos de subredes IPv6:

    • Si asignaste un rango de direcciones IPv6 interna a tu red de VPC, puedes usar ese rango como un rango de origen. El uso del rango IPv6 interno de la red de VPC significa que la regla de firewall incluye todos los rangos de subred IPv6 internos actuales y futuros. Para encontrar el rango IPv6 interno de la red de VPC, puedes usar el siguiente comando:

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

      También puedes especificar rangos de subredes IPv6 internos específicos.

    • Para permitir el tráfico de los rangos de subredes IPv6 externas de las subredes de doble pila, debes especificar el rango de direcciones IPv6 de cada subred que desees incluir.

Permite conexiones SSH de entrada a VM

En los ejemplos siguientes, se crea una regla de firewall a fin de permitir conexiones SSH a tus instancias de VM, de manera similar a la regla allow-ssh para las redes predeterminadas:

gcloud

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

Reemplaza lo siguiente:

  • NAME: El nombre de esta regla de firewall.
  • NETWORK: El nombre de la red a la que se aplica esta regla de firewall. El valor predeterminado es default.
  • RANGES_OUTSIDE_VPC_NETWORK: Uno o más rangos de direcciones IP. Puedes especificar rangos de IPv4 o de IPv6 en una regla de firewall determinada. Como práctica recomendada, especifica los rangos de direcciones IP específicos desde los que necesitas permitir el acceso, en lugar de todas las fuentes IPv4 o IPv6.

    • Incluir 35.235.240.0/20 en los rangos de origen permite conexiones SSH mediante el reenvío de TCP de Identity-Aware Proxy (IAP) si se cumplen todos los demás requisitos previos. Si deseas obtener más información, consulta Usa IAP para el redireccionamiento de TCP.
    • El uso de 0.0.0.0/0 como rango de origen permite el tráfico desde todas las fuentes de IPv4, incluidas las fuentes fuera de Google Cloud.
    • El uso de ::/0 como rango de origen permite el tráfico desde todas las fuentes de IPv6, incluidas las fuentes fuera de Google Cloud.

API

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

Reemplaza lo siguiente:

  • PROJECT_ID es el ID del proyecto en el que se encuentra la red de VPC.
  • FIREWALL_NAME: El nombre de la red de VPC en la que se crea la regla de firewall.
  • NETWORK es un nombre para la regla de firewall.
  • RANGES_OUTSIDE_VPC_NETWORK: Uno o más rangos de direcciones IP. Puedes especificar rangos de IPv4 o de IPv6 en una regla de firewall determinada. Como práctica recomendada, especifica los rangos de direcciones IP específicos desde los que necesitas permitir el acceso, en lugar de todas las fuentes IPv4 o IPv6.

    • Incluir 35.235.240.0/20 en los rangos de origen permite conexiones SSH mediante el reenvío de TCP de Identity-Aware Proxy (IAP) si se cumplen todos los demás requisitos previos. Si deseas obtener más información, consulta Usa IAP para el redireccionamiento de TCP.
    • El uso de 0.0.0.0/0 como rango de origen permite el tráfico desde todas las fuentes de IPv4, incluidas las fuentes fuera de Google Cloud.
    • El uso de ::/0 como rango de origen permite el tráfico desde todas las fuentes de IPv6, incluidas las fuentes fuera de Google Cloud.

Permite conexiones RDP de entrada a VM

En los siguientes ejemplos, se crea una regla de firewall para permitir conexiones del protocolo de escritorio remoto de Microsoft (RDP) a las instancias de VM, de forma similar a la regla allow-rdp para las redes predeterminadas:

gcloud

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

Reemplaza lo siguiente:

  • NAME: El nombre de esta regla de firewall.
  • NETWORK: El nombre de la red a la que se aplica esta regla de firewall. El valor predeterminado es default.
  • RANGES_OUTSIDE_VPC_NETWORK: Uno o más rangos de direcciones IP. Puedes especificar rangos de IPv4 o de IPv6 en una regla de firewall determinada. Como práctica recomendada, especifica los rangos de direcciones IP específicos desde los que necesitas permitir el acceso, en lugar de todas las fuentes IPv4 o IPv6.

    • Incluir 35.235.240.0/20 en los rangos de origen permite conexiones de RDP mediante el reenvío de TCP de Identity-Aware Proxy (IAP) si se cumplen todos los demás requisitos previos. Si deseas obtener más información, consulta Usa IAP para el redireccionamiento de TCP.
    • El uso de 0.0.0.0/0 como rango de origen permite el tráfico desde todas las fuentes de IPv4, incluidas las fuentes fuera de Google Cloud.
    • El uso de ::/0 como rango de origen permite el tráfico desde todas las fuentes de IPv6, incluidas las fuentes fuera de Google Cloud.

API

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

Reemplaza lo siguiente:

  • PROJECT_ID es el ID del proyecto en el que se encuentra la red de VPC.
  • FIREWALL_NAME: El nombre de la red de VPC en la que se crea la regla de firewall.
  • NETWORK es un nombre para la regla de firewall.
  • RANGES_OUTSIDE_VPC_NETWORK: Uno o más rangos de direcciones IP. Puedes especificar rangos de IPv4 o de IPv6 en una regla de firewall determinada. Como práctica recomendada, especifica los rangos de direcciones IP específicos desde los que necesitas permitir el acceso, en lugar de todas las fuentes IPv4 o IPv6.

    • Incluir 35.235.240.0/20 en los rangos de origen permite conexiones de RDP mediante el reenvío de TCP de Identity-Aware Proxy (IAP) si se cumplen todos los demás requisitos previos. Si deseas obtener más información, consulta Usa IAP para el redireccionamiento de TCP.
    • El uso de 0.0.0.0/0 como rango de origen permite el tráfico desde todas las fuentes de IPv4, incluidas las fuentes fuera de Google Cloud.
    • El uso de ::/0 como rango de origen permite el tráfico desde todas las fuentes de IPv6, incluidas las fuentes fuera de Google Cloud.

Permite conexiones ICMP de entrada a VM

En los siguientes ejemplos, se crea una regla de firewall a fin de permitir conexiones ICMP a las instancias de VM, de manera similar a la regla allow-icmp para las redes predeterminadas:

gcloud

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

Reemplaza lo siguiente:

  • NAME: El nombre de esta regla de firewall.
  • NETWORK: El nombre de la red a la que se aplica esta regla de firewall. El valor predeterminado es default.
  • ICMP_PROTOCOL: Especifica ICMPv4 con el nombre del protocolo icmp o el número de protocolo 1. Especifica ICMPv6 con el número de protocolo 58.
  • RANGES_OUTSIDE_VPC_NETWORK: Uno o más rangos de direcciones IP. Puedes especificar rangos de IPv4 o de IPv6 en una regla de firewall determinada. Como práctica recomendada, especifica los rangos de direcciones IP específicos desde los que necesitas permitir el acceso, en lugar de todas las fuentes IPv4 o IPv6.

    • El uso de 0.0.0.0/0 como rango de origen permite el tráfico desde todas las fuentes de IPv4, incluidas las fuentes fuera de Google Cloud.
    • El uso de ::/0 como rango de origen permite el tráfico desde todas las fuentes de IPv6, incluidas las fuentes fuera de Google Cloud.

API

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

Reemplaza lo siguiente:

  • PROJECT_ID es el ID del proyecto en el que se encuentra la red de VPC.
  • FIREWALL_NAME: El nombre de la red de VPC en la que se crea la regla de firewall.
  • NETWORK es un nombre para la regla de firewall.
  • ICMP_PROTOCOL: Especifica ICMPv4 con el nombre del protocolo icmp o el número de protocolo 1. Especifica ICMPv6 con el número de protocolo 58.
  • RANGES_OUTSIDE_VPC_NETWORK: Uno o más rangos de direcciones IP. Puedes especificar rangos de IPv4 o de IPv6 en una regla de firewall determinada. Como práctica recomendada, especifica los rangos de direcciones IP específicos desde los que necesitas permitir el acceso, en lugar de todas las fuentes IPv4 o IPv6.

    • El uso de 0.0.0.0/0 como rango de origen permite el tráfico desde todas las fuentes de IPv4, incluidas las fuentes fuera de Google Cloud.
    • El uso de ::/0 como rango de origen permite el tráfico desde todas las fuentes de IPv6, incluidas las fuentes fuera de Google Cloud.

Otros ejemplos de configuración

El siguiente diagrama muestra un ejemplo de configuración de firewall. La situación implica una my-network que contiene lo siguiente:

  • una subred subnet1 con un rango de IP 10.240.10.0/24
  • una subred subnet2 con un rango de IP 192.168.1.0/24
  • una instancia vm1 en subnet2 con la etiqueta webserver y la IP interna 192.168.1.2
  • una instancia vm2 en subnet2 con la etiqueta database y la IP interna 192.168.1.3
Configuración de red de muestra (haz clic para ampliar)
Configuración de red de muestra (haz clic para agrandar)

Ejemplo 1: Rechaza todas las conexiones TCP de entrada, excepto las del puerto 80 de subnet1

En este ejemplo, se crea un conjunto de reglas de firewall que rechaza todas las conexiones TCP de entrada, excepto las conexiones destinadas al puerto 80 de subnet1.

gcloud

  1. Crea una regla de firewall para rechazar todo el tráfico de TCP de entrada a instancias etiquetadas con 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
    
  2. Crea una regla de firewall para permitir que todas las direcciones IP de subnet1 (10.240.10.0/24) accedan al puerto TCP 80 en las instancias etiquetadas con 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
    

Ejemplo 2: Rechaza todas las conexiones TCP de salida, excepto aquellas al puerto 80 de vm1

gcloud

  1. Crea una regla de firewall que rechace todo el tráfico de TCP de salida.

    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
    
  2. Crea una regla de firewall para permitir el tráfico TCP destinado al puerto 80 de vm1.

    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
    

Ejemplo 3: Permite las conexiones TCP de salida al puerto 443 de un host externo

Crea una regla de firewall que permita que las instancias etiquetadas con webserver envíen tráfico TCP de salida al puerto 443 de una dirección IP externa de muestra, 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

Ejemplo 4: Permite las conexiones SSH de vm2 a vm1

Crea una regla de firewall que permita que el tráfico SSH proveniente de instancias con la etiqueta database (vm2) llegue a instancias con la 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

Ejemplo 5: Permite TCP:1443 de un servidor web a una base de datos mediante cuentas de servicio

Si deseas obtener información adicional acerca de las cuentas de servicio y las funciones, consulta Asigna funciones a cuentas de servicio.

Considera la situación presentada en el siguiente diagrama, en la que hay dos aplicaciones con ajuste de escala automático a través de plantillas, una aplicación de servidor web my-sa-web y una aplicación de base de datos “my-sa-db”. Un administrador de seguridad desea permitir que los flujos de TCP se dirijan al puerto de destino 1443 desde my-sa-web hasta my-sa-db.

Usa reglas de firewall en cuentas de servicio (haz clic para ampliar)
Uso de reglas de firewall en cuentas de servicio (haz clic para agrandar)

A continuación, se describen los pasos de configuración, incluida la creación de las cuentas de servicio:

gcloud

  1. Un EDITOR o PROPIETARIO de proyecto crea las cuentas de servicio my-sa-web y my-sa-db.

    gcloud iam service-accounts create my-sa-web \
      --display-name "webserver service account"
    
    gcloud iam service-accounts create my-sa-db \
      --display-name "database service account"
    
  2. Un PROPIETARIO del proyecto asigna al desarrollador del servidor web web-dev@example.com una función de serviceAccountUser para la cuenta de servicio my-sa-web mediante una política de la administración de identidades y accesos (IAM).

    gcloud iam service-accounts add-iam-policy-binding \
     my-sa-web@my-project.iam.gserviceaccount.com \
     --member='user:web-dev@example.com' \
     --role='roles/iam.serviceAccountUser'
    
  3. Un PROPIETARIO del proyecto asigna al desarrollador de base de datos “db-dev@example.com” una función serviceAccountUser para la cuenta de servicio my-sa-db mediante una política de IAM.

    gcloud iam service-accounts add-iam-policy-binding \
     my-sa-db@my-project.iam.gserviceaccount.com \
     --member='user:db-dev@example.com' \
     --role='roles/iam.serviceAccountUser'
    
  4. El desarrollador web-dev@example.com, que tiene la función de Administrador de instancias, crea una plantilla de instancia de servidor web y autoriza a las instancias a ejecutarse como la cuenta de servicio my-sa-web.

    gcloud compute instance-templates create [INSTANCE_TEMPLATE_NAME]  \
       --service-account my-sa-web@my-project-123.iam.gserviceaccount.com
    
  5. El desarrollador db-dev@example.com, que tiene la función de Administrador de instancias, crea la plantilla de instancia de base de datos y autoriza a las instancias a ejecutarse como la cuenta de servicio my-sa-db.

    gcloud compute instance-templates create [INSTANCE_TEMPLATE_NAME] \
      --service-account my-sa-db@my-project-123.iam.gserviceaccount.com
    
  6. El Administrador de seguridad crea las reglas de firewall mediante cuentas de servicio para permitir el tráfico TCP:1443 de la cuenta de servicio my-sa-web a la cuenta de servicio my-sa-db.

    gcloud compute firewall-rules create FIREWALL_NAME \
       --network network_a \
       --allow TCP:1443 \
       --source-service-accounts my-sa-web@my-project.iam.gserviceaccount.com \
       --target-service-accounts my-sa-db@my-project.iam.gserviceaccount.com
    

Soluciona problemas

Mensajes de error cuando se crea o actualiza una regla de firewall

Tal vez veas alguno de los siguientes mensajes de error:

  • Should not specify destination range for ingress direction.

    Los rangos de destino no son parámetros válidos para reglas de firewall de entrada. Se supone que las reglas de firewall son de entrada, a no ser que se especifique una dirección de egress. Si creas una regla que no especifica una dirección, se crea como una regla de entrada, que no permite un rango de destino. De igual manera, los rangos fuente no son parámetros válidos para las reglas de salida.

  • Firewall direction cannot be changed once created.

    No puedes cambiar la dirección de una regla de firewall existente. Tienes que crear una regla nueva con los parámetros correctos y, luego, borrar la anterior.

  • Firewall traffic control action cannot be changed once created.

    No puedes cambiar la acción de una regla de firewall existente. Tienes que crear una regla nueva con los parámetros correctos y, luego, borrar la anterior.

  • Service accounts must be valid RFC 822 email addresses. La cuenta de servicio especificada en una regla de firewall debe ser una dirección de correo electrónico con el formato que indica 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.No puedes especificar cuentas de servicio y etiquetas en la misma regla.

    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.
    

No es posible conectarse a la instancia de VM

Si no puedes conectarte a la instancia de VM, verifica tus reglas de firewall.

gcloud

  1. Si estás iniciando la conexión desde otra instancia de VM, enumera las reglas de firewall de salida para esa instancia.

    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
          )"
    
  2. Verifica si la IP de destino está rechazada en alguna regla de salida. La regla con la mayor prioridad (con el número de prioridad más bajo) anula las reglas de menor prioridad. En el caso de que haya dos reglas con la misma prioridad, prevalece la regla de rechazo.

  3. Verifica las reglas de firewall de ingreso para la red que contiene la instancia 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
          )"
    

    Resultado de muestra: El resultado que recibas dependerá de la lista de reglas 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. También puedes ejecutar pruebas de conectividad desde y hacia las instancias de VM pertenecientes a una red de VPC hasta otra red de VPC o una red que no pertenezca a Google Cloud para solucionar problemas en caso de pérdida de tráfico debido a reglas de firewall de entrada o salida. Si quieres obtener más información sobre cómo ejecutar las pruebas de conectividad para solucionar diversos problemas, consulta Ejecuta pruebas de conectividad.

¿Mi regla de firewall está habilitada o inhabilitada?

Para ver si una regla de firewall está habilitada o inhabilitada, consulta los detalles de reglas de firewall.

En Google Cloud Console, busca Enabled o Disabled en Aplicación.

En el resultado de la CLI de Google Cloud, busca el campo disabled. Si dice disabled:false, la regla está habilitada y se está aplicando. Si dice disabled: true, la regla está inhabilitada.

¿Qué regla se está aplicando en una instancia de VM?

Después de crear la regla, puedes verificar si se está aplicando de forma correcta en una instancia en particular. Si deseas obtener más información, consulta Enumera las reglas de firewall para una interfaz de red de una instancia de VM.

Las reglas de firewall con etiquetas de origen no se aplican de inmediato

Las reglas de firewall de entrada que usan etiquetas de origen pueden demorar en propagarse. Para obtener detalles, consulta las consideraciones relacionadas con las etiquetas de origen para las reglas de firewall de entrada.

Próximos pasos