Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Utilizzo delle regole firewall VPC

In questa pagina vengono descritti i comandi per l'utilizzo delle regole firewall e vengono forniti alcuni esempi di utilizzo.

Prima di iniziare

Per scoprire di più sulle regole firewall, ad esempio regole implicite e regole generate dal sistema per le reti predefinite, consulta le regole firewall VPC.

Prima di configurare le regole firewall, esamina i componenti delle regole firewall per acquisire familiarità con i componenti firewall utilizzati in Google Cloud.

Creazione di regole firewall

Le regole firewall sono definite a livello di rete e si applicano solo alla rete in cui vengono create; tuttavia, il nome che scegli per ciascuna di esse deve essere univoco per il progetto.

Una regola firewall può contenere intervalli IPv4 o IPv6, ma non entrambi.

Quando crei una regola firewall, puoi scegliere di abilitare il logging delle regole firewall. Se abiliti il logging, puoi omettere i campi dei metadati per risparmiare sui costi di archiviazione. Per ulteriori informazioni, consulta la pagina relativa all'utilizzo del logging delle regole firewall.

Se vuoi specificare più account di servizio per il campo dell'account di servizio di destinazione o di origine, utilizza l'interfaccia a Google Cloud CLI, l'API o le librerie client.

La rete predefinita fornisce regole firewall automatiche al momento della creazione. Le reti personalizzate e in modalità automatica consentono di creare facilmente firewall simili durante la creazione della rete se utilizzi Google Cloud Console. Se utilizzi l'interfaccia a riga di comando gcloud o l'API e vuoi creare regole firewall simili a quelle fornite dalla rete predefinita, consulta Configurare le regole firewall per i casi d'uso comuni.

Console

  1. In Google Cloud Console, vai alla pagina Firewall.

    Vai a Firewall

  2. Fai clic su Crea regola firewall.

  3. Inserisci un Nome per la regola firewall.

    Questo nome deve essere univoco per il progetto.

  4. (Facoltativo) Puoi attivare il logging delle regole firewall:

    • Fai clic su Log > On.
    • Per omettere i metadati, fai clic su Mostra dettagli log, quindi deseleziona la casella Includi metadati.
  5. Specifica la Rete per la regola firewall.

  6. Specifica la priorità della regola.

    Più basso è il numero, maggiore è la priorità.

  7. In Direzione del traffico, scegli traffico in entrata o in uscita.

  8. Per Azione in caso di corrispondenza, scegli Consenti o Nega.

  9. Specifica i Target della regola.

    • Se vuoi che la regola si applichi a tutte le istanze della rete, scegli Tutte le istanze nella rete.
    • Se vuoi che la regola venga applicata a determinate istanze in base ai tag di rete (target), scegli Tag di destinazione specificati, quindi, nel campo Tag di destinazione, digita i tag a cui applicare la regola.
    • Se vuoi che la regola si applichi alle istanze selezionate per account di servizio associato, scegli Account di servizio specificato, indica se l'account di servizio è nel progetto corrente o in un altro sotto Ambito dell'account di servizio e poi, nel campo Account di servizio di destinazione, scegli o digita il nome dell'account di servizio.
  10. Per una regola in entrata, specifica il filtro di origine:

    • Per filtrare il traffico in entrata in base a intervalli IPv4 di origine, seleziona Intervalli IPv4 e inserisci i blocchi CIDR nel campo Intervalli IPv4 di origine. Utilizza 0.0.0.0/0 per qualsiasi origine IPv4.
    • Per filtrare il traffico in entrata in base a intervalli IPv6 di origine, seleziona Intervalli IPv6 e inserisci i blocchi CIDR nel campo Intervalli IPv6 di origine. Utilizza ::/0 per qualsiasi origine IPv6.
    • Per filtrare il traffico in entrata in base al tag di rete, scegli Tag di origine, quindi digita i tag di rete nel campo Tag di origine. Per il limite del numero di tag di origine, consulta Limiti per rete. I filtri per tag di origine sono disponibili solo se la destinazione non è specificata dall'account di servizio. Per ulteriori informazioni, consulta la pagina relativa al filtro per account di servizio e tag di rete.
    • Per filtrare il traffico in entrata in base all'account di servizio, scegli Account di servizio, indica se l'account di servizio fa parte del progetto corrente o di un altro sotto Ambito dell'account di servizio, quindi scegli o digita il nome dell'account di servizio nel campo Account di servizio di origine. I filtri in base all'account di servizio di origine sono disponibili solo se il target non viene specificato dal tag di rete. Per ulteriori informazioni, consulta la pagina relativa al filtro per account di servizio e tag di rete.
    • Se lo desideri, puoi specificare un secondo filtro di origine. I filtri di origine secondari non possono utilizzare gli stessi criteri del filtro di quello principale. Gli intervalli IP di origine possono essere utilizzati insieme ai tag di origine o all'account di servizio di origine. Il set di origine effettivo è l'unione degli indirizzi IP dell'intervallo di origine e delle istanze identificate dai tag di rete o dagli account di servizio. In altre parole, se l'intervallo IP di origine oppure i tag di origine (o gli account di servizio di origine) corrispondono ai criteri del filtro, l'origine è inclusa nel set di origini efficaci.
    • I tag di origine e l'account di servizio di origine non possono essere utilizzati insieme.
  11. Per una regola in uscita, specifica il filtro Destinazione:

    • Per filtrare il traffico in uscita in base a intervalli IPv4 di destinazione, seleziona Intervalli IPv4 e inserisci i blocchi CIDR nel campo Intervalli IPv4 di destinazione. Utilizza 0.0.0.0/0 per qualsiasi destinazione IPv4.
    • Per filtrare il traffico in uscita in base a intervalli IPv6 di destinazione, seleziona Intervalli IPv6 e inserisci i blocchi CIDR nel campo Intervalli IPv6 di destinazione. Utilizza ::/0 per qualsiasi destinazione IPv6.
  12. Definisci i protocolli e le porte a cui si applica la regola:

    • Per applicare la regola a tutti i protocolli e alle porte di destinazione, seleziona Consenti tutto o Nega tutto, a seconda dell'azione.
    • Per definire protocolli e porte di destinazione specifici, seleziona Protocolli e porte specificati:

      • Seleziona TCP per includere il protocollo TCP e le porte di destinazione. Inserisci all o un elenco di porte di destinazione delimitato da virgole, ad esempio 20-22, 80, 8080.
      • Seleziona UDP per includere il protocollo UDP e le porte di destinazione. Inserisci all o un elenco di porte di destinazione delimitato da virgole, ad esempio 67-69, 123.
      • Seleziona Altro per includere protocolli come icmp, sctp o un numero di protocollo. Ad esempio, utilizza icmp o il numero di protocollo 1 per l'ICMP IPv4. Utilizza il numero di protocollo 58 per IPv6 ICMP.

        Per scoprire di più, consulta protocolli e porte di destinazione.

  13. (Facoltativo) Puoi creare la regola firewall ma non applicarla impostando lo stato di applicazione su disattivata. Fai clic su Disattiva regola, quindi seleziona Disabilitata.

  14. Fai clic su Crea.

gcloud

Il comando gcloud per la creazione di regole firewall è:

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

Utilizza i parametri come segue. Maggiori dettagli su ciascuno sono disponibili nella documentazione di riferimento dell'SDK.

  • --network La rete per la regola. Se omessa, la regola viene creata nella rete default. Se non hai una rete predefinita o vuoi creare la regola in una rete specifica, devi utilizzare questo campo.
  • --priority Un valore numerico che indica la priorità per la regola. Più basso è il numero, maggiore è la priorità.
  • --direction La direzione del traffico, ingress o egress.
  • --action L'azione sulla corrispondenza, allow o deny. Deve essere utilizzato con il flag --rules.
  • Specifica un target in uno dei seguenti modi:
    • Ometti --target-tags e --target-service-accounts se la regola deve essere applicata a tutte le destinazioni nella rete.
    • Utilizza il flag --target-tags per definire i target per tag di rete.
    • Utilizza il flag --target-service-accounts per definire i target per gli account di servizio associati.
  • Per la regola in entrata, per perfezionare ulteriormente la destinazione, utilizza --destination-ranges per specificare gli intervalli di indirizzi IPv4 o IPv6 in formato CIDR. Se --destination-ranges viene omesso, la destinazione in entrata è qualsiasi indirizzo IPv4, 0.0.0.0/0. Per ulteriori informazioni, vedi Destinazioni per le regole in entrata e Indirizzi di destinazione e IP per le regole in entrata.

  • Per una regola in entrata, specifica un'origine:

    • --source-ranges Utilizza questo flag per specificare intervalli di indirizzi IPv4 o IPv4 di origine in formato CIDR.
    • Se --source-ranges, source-tags e --source-service-accounts vengono omessi, l'origine in entrata è un indirizzo IPv4, 0.0.0.0/0.
    • --source-tags Utilizza questo flag per specificare le istanze di origine per tag di rete. I filtri per tag di origine sono disponibili solo se la destinazione non è specificata dall'account di servizio. Per ulteriori informazioni, consulta la pagina relativa al filtro per account di servizio e tag di rete.
    • --source-ranges e --source-tags possono essere utilizzati insieme. Se sono specificati entrambi, il set di origine effettivo è l'unione degli indirizzi IP dell'intervallo di origine e delle istanze identificate dai tag di rete, anche se le istanze codificate non hanno IP negli intervalli di origine.
    • --source-service-accounts Utilizza questo flag per specificare le istanze in base agli account di servizio utilizzati. Il filtro per account di servizio di origine è disponibile solo se la destinazione non è specificata dal tag di rete. Per ulteriori informazioni, consulta la pagina relativa al filtro per account di servizio e tag di rete. --source-ranges e --source-service-accounts possono essere utilizzati insieme. Se sono specificati entrambi, l'insieme di origine effettivo è l'unione degli indirizzi IP dell'intervallo di origine e le istanze identificate dagli account di servizio di origine, anche se le istanze identificate dagli account di servizio di origine non hanno IP negli intervalli di origine.
  • Per la regola di uscita, per perfezionare ulteriormente l'origine, utilizza --source-ranges per
    specificare intervalli di indirizzi IPv4 o IPv6 in formato CIDR. Se --source-ranges viene omesso, l'origine in uscita è qualsiasi indirizzo IPv4, 0.0.0.0/0. Per scoprire di più, vedi Origini per le regole in uscita e Indirizzi di destinazione e IP per le regole in uscita.

  • Per una regola in uscita, specifica una destinazione:

    • --destination-ranges Utilizza questo flag per specificare intervalli di indirizzi IPv4 o IPv6 di destinazione in formato CIDR.
    • Se --destination-ranges viene omesso, la destinazione in uscita è qualsiasi indirizzo IPv4, 0.0.0.0/0.
  • --rules Un elenco di protocolli e porte di destinazione a cui si applica la regola. Utilizza all per rendere la regola applicabile a tutti i protocolli e a tutte le porte di destinazione. Richiede il flag --action.

  • Per impostazione predefinita, le regole firewall vengono create e applicate automaticamente, ma puoi modificare questo comportamento.

    • Se --disabled e --no-disabled vengono omessi, la regola firewall viene creata e applicata.
    • --disabled Aggiungi questo flag per creare la regola firewall ma non applicarla. La regola firewall rimane disattivata finché non aggiorna la regola firewall per abilitarla.
    • --no-disabled Aggiungi questo flag per assicurarti che la regola firewall sia applicata in modo forzato.
  • --enable-logging | --no-enable-logging Puoi abilitare il logging delle regole firewall per una regola quando la crei o la aggiorni. Il logging delle regole firewall ti consente di controllare, verificare e analizzare gli effetti delle regole firewall. Per informazioni dettagliate, consulta la sezione Logging regole firewall.

    • --logging-metadata Se abiliti il logging, per impostazione predefinita, il logging delle regole firewall include i campi di base e di metadati. Puoi omettere i campi dei metadati per risparmiare sui costi di archiviazione. Per ulteriori informazioni, consulta la sezione Utilizzo del logging delle regole firewall.

API

Creare una regola firewall.

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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto in cui si trova la rete VPC.
  • NETWORK: nome della rete VPC in cui viene creata la regola firewall.
  • RULE_NAME: il nome della regola firewall.

  • Per una regola firewall in entrata, specifica l'origine e la destinazione in entrata:

    • Utilizza i campi sourceRanges, sourceTags o sourceServiceAccounts per specificare l'origine in entrata.

    • sourceRanges può essere un intervallo IPv4 o IPv6, ma non una combinazione di entrambi. Per utilizzare l'intervallo 0.0.0.0/0, non specificare alcun campo.

    • Non puoi utilizzare i campi sourceTags e sourceServiceAccounts insieme. Tuttavia, puoi utilizzare sourceRanges con sourceTags o sourceServiceAccounts. In caso contrario, la connessione deve corrispondere a uno o all'altro affinché la regola firewall venga applicata.

    • Per i campi di destinazione, se utilizzi il campo sourceTags, non puoi utilizzare il campo targetServiceAccounts. Devi utilizzare il campo targetTags o nessun campo di destinazione. Analogamente, se utilizzi il campo sourceServiceAccounts, non puoi utilizzare il campo targetTags. Se non specifichi un campo di destinazione, la regola si applica a tutti i target nella rete.

    • Utilizza il campo destinationRanges per specificare la destinazione in entrata. destinationRanges può essere un intervallo IPv4 o IPv6, ma non una combinazione di entrambi.
      Se non specifichi una destinazione, Google Cloud utilizza 0.0.0.0/0. Per ulteriori informazioni, consulta Destinazioni per le regole in entrata e Indirizzi di destinazione e IP per le regole in entrata.
      Nota: la specifica degli intervalli di indirizzi IP di destinazione per una regola in entrata è una funzionalità di anteprima.

  • Per una regola firewall in uscita, specifica l'origine e la destinazione del traffico in uscita:

    • Utilizza il campo sourceRanges per specificare l'origine in uscita. sourceRange può essere intervalli IPv4 o IPv6, ma non una combinazione di entrambi.
      Se non specifichi un'origine, Google Cloud utilizza 0.0.0.0/0. Per ulteriori informazioni, vedi Origini per le regole in uscita e Indirizzi di destinazione e IP per le regole in uscita.
      Nota. La specifica degli intervalli di indirizzi IP di origine per una regola in uscita è una funzionalità di anteprima.

    • Utilizza il campo destinationRanges per specificare la destinazione. destinationRanges può essere un intervallo IPv4 o IPv6, ma non una combinazione di entrambi.
      Se non specifichi una destinazione, Google Cloud utilizza 0.0.0.0/0. Utilizza il campo targetTags o targetServiceAccounts per specificare a quale target si applica la regola. Se non specifichi un campo di destinazione, la regola si applica a tutti i target nella rete.

Per ulteriori informazioni e descrizioni per ogni campo, consulta il metodo 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

Puoi utilizzare una risorsa Terraform per creare una regola 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"]
}

Per scoprire come applicare o rimuovere una configurazione di Terraform, vedi Lavorare con una configurazione di Terraform.

Aggiorna regole firewall

Puoi modificare alcuni componenti di una regola firewall, ad esempio i protocolli e le porte di destinazione specificati per la condizione di corrispondenza. Non puoi modificare il nome, la rete, l'azione dell'azione sulla corrispondenza del firewall e la direzione del traffico.

Se devi modificare il nome, la rete o il componente azione o direzione, devi invece eliminare la regola e crearne una nuova.

Se vuoi aggiungere o rimuovere più account di servizio, utilizza l'interfaccia a riga di comando gcloud, l'API o le librerie client. Non puoi utilizzare Google Cloud Console per specificare più account di servizio di destinazione o account di servizio di origine.

Console

  1. In Google Cloud Console, vai alla pagina Firewall.

    Vai a Firewall

  2. Fai clic sulla regola firewall che vuoi modificare.

  3. Fai clic su Modifica.

  4. Modifica i componenti modificabili per soddisfare le tue esigenze.

  5. Fai clic su Salva.

gcloud

Il comando gcloud per aggiornare le regole firewall è il seguente:

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

Le descrizioni di ogni flag sono uguali a quelle della creazione di regole firewall e ulteriori dettagli su ciascuna sono disponibili nella documentazione di riferimento per gli SDK.

API

Utilizza PATCH per aggiornare i seguenti campi: allowed, description, sourceRanges, sourceTags o targetTags. Utilizza PUT o POST per tutti gli altri campi.

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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto in cui si trova la rete VPC.
  • NETWORK: nome della rete VPC in cui si trova la regola firewall.
  • RULE_NAME: il nome della regola firewall da aggiornare.

Per ulteriori informazioni e descrizioni per ogni campo, consulta il metodo 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

Elenca regole firewall per una rete VPC

Puoi elencare tutte le regole firewall per il tuo progetto o per una determinata rete VPC. Per ogni regola firewall, Google Cloud mostra dettagli come il tipo di regola, le destinazioni e i filtri.

Se abiliti il logging delle regole firewall, Firewall Insights può fornire insight sulle regole firewall per aiutarti a comprendere e ottimizzare meglio le loro configurazioni. Ad esempio, puoi visualizzare quali allow regole non sono state utilizzate nelle ultime sei settimane. Per ulteriori informazioni, consulta la sezione Utilizzo della schermata dei dettagli delle regole firewall nella documentazione di Firewall Insights.

Console

Per visualizzare tutte le regole firewall per tutte le reti nel tuo progetto:

Per visualizzare le regole firewall in una determinata rete:

  1. In Google Cloud Console, vai alla pagina Reti VPC.

    Vai a Reti VPC

  2. Fai clic sul nome di una rete VPC per andare alla relativa pagina dei dettagli.

  3. Nella pagina dei dettagli della rete, fai clic sulla scheda Firewall.

  4. Espandi vpc-firewall-rules.

gcloud

Il comando seguente produce un elenco ordinato di regole firewall per una determinata rete.

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

Sostituisci NETWORK con il nome della rete in cui elencare le regole del firewall.

API

Elenca tutte le regole firewall per una determinata rete.

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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto in cui si trova la rete VPC.
  • NETWORK: il nome della rete VPC che contiene le regole firewall da elencare.

Per ulteriori informazioni, consulta il metodo 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

Elenca le regole firewall per un'interfaccia di rete di un'istanza VM

Per ogni interfaccia di rete, la console Google Cloud elenca tutte le regole firewall che si applicano all'interfaccia e le regole effettivamente utilizzate dall'interfaccia. Le regole firewall possono mascherare altre regole, quindi tutte quelle che si applicano a un'interfaccia potrebbero in realtà non essere utilizzate dall'interfaccia.

Le regole firewall sono associate a istanze VM e vengono applicate tramite il parametro di destinazione di una regola. Visualizzando tutte le regole applicate, puoi verificare se una determinata regola viene applicata a un'interfaccia.

Se abiliti il logging delle regole firewall, Firewall Insights può fornire insight sulle regole firewall per aiutarti a comprendere e ottimizzare meglio le loro configurazioni. Ad esempio, puoi visualizzare quali regole su un'interfaccia sono state attivate nelle ultime sei settimane. Per ulteriori informazioni, consulta la pagina relativa all'utilizzo della schermata dei dettagli dell'interfaccia di rete delle VM nella documentazione di Firewall Insights.

Console

Per visualizzare le regole che si applicano a una specifica interfaccia di rete di un'istanza VM:

  1. In Google Cloud Console, vai alla pagina Istanze VM.

    Vai alle istanze VM

  2. Trova l'istanza da visualizzare.

  3. Nel menu Altre azioni dell'istanza (), seleziona Visualizza i dettagli della rete.

  4. Se un'istanza ha più interfacce di rete, seleziona l'interfaccia di rete da visualizzare nel campo Interfaccia di rete selezionata.

  5. Nella sezione Firewall e dettagli percorso, seleziona la scheda Firewall.

  6. Espandi vpc-firewall-rules.

  7. Visualizza la tabella per determinare se il traffico da o verso un indirizzo IP specifico è consentito.

Visualizza i dettagli delle regole del firewall

Puoi esaminare una regola firewall per verificarne il nome, la rete applicabile e i componenti, anche per verificare se la regola è abilitata o disabilitata.

Console

  1. Elenca le tue regole firewall. Puoi visualizzare un elenco di tutte le regole o solo di quelle in una determinata rete.
  2. Fai clic sulla regola per visualizzarla.

gcloud

Il comando seguente descrive una singola regola firewall. Poiché i nomi delle regole firewall sono univoci per il progetto, non è necessario specificare una rete quando si descrive una regola firewall esistente.

gcloud compute firewall-rules describe RULE_NAME

Sostituisci RULE_NAME con il nome della regola firewall.

API

Descrivi una determinata regola firewall.

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

Sostituisci i segnaposto con valori validi:

  • PROJECT_ID: l'ID del progetto in cui si trova la regola firewall.
  • RULE_NAME: il nome della regola firewall da descrivere.

Per ulteriori informazioni, consulta il metodo firewalls.get.

Elimina regole firewall

Console

  1. Elenca le tue regole firewall. Puoi visualizzare un elenco di tutte le regole o solo di quelle in una determinata rete.
  2. Fai clic sulla regola da eliminare.
  3. Fai clic su Elimina.
  4. Fai di nuovo clic su Elimina per confermare.

gcloud

Il comando seguente elimina una regola firewall.

gcloud compute firewall-rules delete RULE_NAME

Sostituisci RULE_NAME con il nome della regola da eliminare.

API

Elimina una regola firewall.

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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto in cui si trova la regola firewall.
  • RULE_NAME: il nome della regola firewall da eliminare.

Per ulteriori informazioni, consulta il metodo 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

Monitora regole firewall

Puoi abilitare il logging per le regole firewall per vedere quale regola è consentita o bloccata per quale traffico. Per istruzioni, consulta la pagina relativa all'utilizzo del logging delle regole firewall.

Configura regole firewall per casi d'uso comuni

Le seguenti sezioni forniscono esempi di come utilizzare l'interfaccia a riga di comando gcloud e l'API per ricreare le regole firewall predefinite create per le reti predefinite. Puoi utilizzare gli esempi per creare regole simili per le reti in modalità personalizzata e automatica. Ogni regola firewall può includere intervalli di indirizzi IPv4 o IPv6, ma non entrambi.

Consenti connessioni interne in entrata tra le VM

Gli esempi seguenti creano una regola firewall per consentire le connessioni TCP, UDP e ICMP interne alle istanze VM, in modo simile alla regola allow-internal per le reti predefinite:

gcloud

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

Sostituisci quanto segue:

  • RULE_NAME: il nome della regola firewall.
  • NETWORK: nome della rete per la quale si applica la regola firewall. Il valore predefinito è default.
  • ICMP_PROTOCOL: tipo di protocollo ICMP. Specifica ICMPv4 utilizzando il nome di protocollo icmp o il numero di protocollo 1. Specifica ICMPv6 utilizzando il numero di protocollo 58.
  • SUBNET_RANGES: uno o più intervalli di indirizzi IP. L'inclusione di un intervallo di indirizzi IP significa che il traffico proveniente da quell'intervallo può raggiungere qualsiasi destinazione VM nella rete VPC. Puoi specificare intervalli IPv4 o IPv6 in una determinata regola firewall.

    Intervalli di subnet IPv4:

    • Le reti VPC in modalità automatica utilizzano intervalli di indirizzi IP che si trovano all'interno di 10.128.0.0/9.
    • Le reti in modalità personalizzata possono utilizzare qualsiasi intervallo IPv4 valido. Se non utilizzi intervalli contigui per le subnet nella rete VPC, potrebbe essere necessario specificare più intervalli.
    • Puoi utilizzare 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 per consentire il traffico da tutti gli intervalli di indirizzi IPv4 privati (intervalli RFC 1918).

    Intervalli di subnet IPv6:

    • Se hai assegnato un intervallo di indirizzi IPv6 interni alla tua rete VPC, puoi utilizzare tale intervallo come intervallo di origine. Utilizzare l'intervallo IPv6 interno della rete VPC significa che la regola firewall include tutti gli intervalli di subnet IPv6 interni attuali e futuri. Per trovare l'intervallo IPv6 interno della rete VPC6, utilizza il comando seguente:

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

      Puoi anche specificare intervalli di subnet IPv6 interni specifici.

    • Per consentire il traffico dagli intervalli di subnet IPv6 esterni delle subnet a doppio stack, devi specificare l'intervallo di indirizzi IPv6 di ogni subnet da includere.

API

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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto in cui si trova la rete VPC.
  • RULE_NAME: il nome della regola firewall.
  • NETWORK: il nome della rete VPC in cui viene creata la regola firewall. Il valore predefinito è default.
  • ICMP_PROTOCOL: tipo di protocollo ICMP. Specifica ICMPv4 utilizzando il nome del protocollo icmp o il numero di protocollo 1. Specifica ICMPv6 utilizzando il numero di protocollo 58.
  • INTERNAL_SOURCE_RANGES: uno o più intervalli IP. Per consentire il traffico interno in tutte le subnet nelle reti VPC, specifica gli intervalli di indirizzi IP utilizzati nella rete VPC. Puoi specificare intervalli IPv4 o IPv6 in una determinata regola firewall.

    Intervalli di subnet IPv4:

    • Le reti VPC in modalità automatica utilizzano intervalli di indirizzi IP che si trovano all'interno di 10.128.0.0/9.
    • Le reti in modalità personalizzata possono utilizzare qualsiasi intervallo IPv4 valido. Se non utilizzi intervalli contigui per le subnet nella rete VPC, potrebbe essere necessario specificare più intervalli.
    • Puoi utilizzare 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 per consentire il traffico da tutti gli intervalli di indirizzi IPv4 privati (intervalli RFC 1918).

    Intervalli di subnet IPv6:

    • Se hai assegnato un intervallo di indirizzi IPv6 interni alla tua rete VPC, puoi utilizzare tale intervallo come intervallo di origine. Utilizzare l'intervallo IPv6 interno della rete VPC significa che la regola firewall include tutti gli intervalli di subnet IPv6 interni attuali e futuri. Per trovare l'intervallo IPv6 interno della rete VPC6, utilizza il comando seguente:

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

      Puoi anche specificare intervalli di subnet IPv6 interni specifici.

    • Per consentire il traffico dagli intervalli di subnet IPv6 esterni delle subnet a doppio stack, devi specificare l'intervallo di indirizzi IPv6 di ogni subnet da includere.

Consenti connessioni SSH in entrata alle VM

Gli esempi seguenti creano una regola firewall per consentire le connessioni SSH alle tue istanze VM, in modo simile alla regola allow-ssh per le reti predefinite:

gcloud

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

Sostituisci quanto segue:

  • RULE_NAME: il nome della regola firewall.
  • NETWORK: nome della rete per la quale si applica la regola firewall. Il valore predefinito è default.
  • RANGES_OUTSIDE_VPC_NETWORK: uno o più intervalli di indirizzi IP. Puoi specificare intervalli IPv4 o IPv6 in una determinata regola firewall. Come best practice, specifica gli intervalli di indirizzi IP specifici da cui vuoi consentire l'accesso anziché tutte le origini IPv4 o IPv6.

    • L'inclusione di 35.235.240.0/20 negli intervalli di origine consente le connessioni SSH che utilizzano il forwarding TCP di Identity-Aware Proxy (IAP) se tutti gli altri prerequisiti sono soddisfatti. Per saperne di più, consulta Utilizzo di IAP per l'inoltro TCP.
    • L'utilizzo di 0.0.0.0/0 come intervallo di origine consente il traffico da tutte le origini IPv4, incluse quelle esterne a Google Cloud.
    • L'uso di ::/0 come intervallo di origine consente il traffico da tutte le origini IPv6, incluse quelle esterne a Google Cloud.

API

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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto in cui si trova la rete VPC.
  • RULE_NAME: il nome della regola firewall.
  • NETWORK: il nome della rete VPC in cui viene creata la regola firewall.
  • RANGES_OUTSIDE_VPC_NETWORK: uno o più intervalli di indirizzi IP. Puoi specificare intervalli IPv4 o IPv6 in una determinata regola firewall. Come best practice, specifica gli intervalli di indirizzi IP specifici da cui vuoi consentire l'accesso anziché tutte le origini IPv4 o IPv6.

    • L'inclusione di 35.235.240.0/20 negli intervalli di origine consente le connessioni SSH che utilizzano il forwarding TCP di Identity-Aware Proxy (IAP) se tutti gli altri prerequisiti sono soddisfatti. Per saperne di più, consulta Utilizzo di IAP per l'inoltro TCP.
    • L'utilizzo di 0.0.0.0/0 come intervallo di origine consente il traffico da tutte le origini IPv4, incluse quelle esterne a Google Cloud.
    • L'uso di ::/0 come intervallo di origine consente il traffico da tutte le origini IPv6, incluse quelle esterne a Google Cloud.

Consenti connessioni RDP in entrata alle VM

Gli esempi seguenti creano una regola firewall per consentire le connessioni RDP (Microsoft Remote Desktop Protocol) alle istanze VM, in modo simile alla regola allow-rdp per le reti predefinite:

gcloud

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

Sostituisci quanto segue:

  • RULE_NAME: il nome della regola firewall.
  • NETWORK: nome della rete per la quale si applica la regola firewall. Il valore predefinito è default.
  • RANGES_OUTSIDE_VPC_NETWORK: uno o più intervalli di indirizzi IP. Puoi specificare intervalli IPv4 o IPv6 in una determinata regola firewall. Come best practice, specifica gli intervalli di indirizzi IP specifici da cui vuoi consentire l'accesso anziché tutte le origini IPv4 o IPv6.

    • L'inclusione di 35.235.240.0/20 negli intervalli di origine consente le connessioni RDP che utilizzano il forwarding TCP di Identity-Aware Proxy (IAP) se tutti gli altri prerequisiti sono soddisfatti. Per saperne di più, consulta Utilizzo di IAP per l'inoltro TCP.
    • L'utilizzo di 0.0.0.0/0 come intervallo di origine consente il traffico da tutte le origini IPv4, incluse quelle esterne a Google Cloud.
    • L'uso di ::/0 come intervallo di origine consente il traffico da tutte le origini IPv6, incluse quelle esterne a Google Cloud.

API

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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto in cui si trova la rete VPC.
  • RULE_NAME: il nome della regola firewall.
  • NETWORK: il nome della rete VPC in cui viene creata la regola firewall.
  • RANGES_OUTSIDE_VPC_NETWORK: uno o più intervalli di indirizzi IP. Puoi specificare intervalli IPv4 o IPv6 in una determinata regola firewall. Come best practice, specifica gli intervalli di indirizzi IP specifici da cui vuoi consentire l'accesso anziché tutte le origini IPv4 o IPv6.

    • L'inclusione di 35.235.240.0/20 negli intervalli di origine consente le connessioni RDP che utilizzano il forwarding TCP di Identity-Aware Proxy (IAP) se tutti gli altri prerequisiti sono soddisfatti. Per saperne di più, consulta Utilizzo di IAP per l'inoltro TCP.
    • L'utilizzo di 0.0.0.0/0 come intervallo di origine consente il traffico da tutte le origini IPv4, incluse quelle esterne a Google Cloud.
    • L'uso di ::/0 come intervallo di origine consente il traffico da tutte le origini IPv6, incluse quelle esterne a Google Cloud.

Consenti connessioni ICMP in entrata alle VM

Gli esempi seguenti creano una regola firewall per consentire le connessioni ICMP per le tue istanze VM, in modo simile alla regola allow-icmp per le reti predefinite:

gcloud

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

Sostituisci quanto segue:

  • RULE_NAME: il nome della regola firewall.
  • NETWORK: nome della rete per la quale si applica la regola firewall. Il valore predefinito è default.
  • ICMP_PROTOCOL: tipo di protocollo ICMP. Specifica ICMPv4 utilizzando il nome del protocollo icmp o il numero di protocollo 1. Specifica ICMPv6 utilizzando il numero di protocollo 58.
  • RANGES_OUTSIDE_VPC_NETWORK: uno o più intervalli di indirizzi IP. Puoi specificare intervalli IPv4 o IPv6 in una determinata regola firewall. Come best practice, specifica gli intervalli di indirizzi IP specifici da cui vuoi consentire l'accesso anziché tutte le origini IPv4 o IPv6.

    • L'utilizzo di 0.0.0.0/0 come intervallo di origine consente il traffico da tutte le origini IPv4, incluse quelle esterne a Google Cloud.
    • L'uso di ::/0 come intervallo di origine consente il traffico da tutte le origini IPv6, incluse quelle esterne a Google Cloud.

API

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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto in cui si trova la rete VPC.
  • RULE_NAME: il nome della regola firewall.
  • NETWORK: il nome della rete VPC in cui viene creata la regola firewall.
  • ICMP_PROTOCOL: tipo di protocollo ICMP da utilizzare. Specifica ICMPv4 utilizzando il nome del protocollo icmp o il numero di protocollo 1. Specifica ICMPv6 utilizzando il numero di protocollo 58.
  • RANGES_OUTSIDE_VPC_NETWORK: uno o più intervalli di indirizzi IP. Puoi specificare intervalli IPv4 o IPv6 in una determinata regola firewall. Come best practice, specifica gli intervalli di indirizzi IP specifici da cui vuoi consentire l'accesso anziché tutte le origini IPv4 o IPv6.

    • L'utilizzo di 0.0.0.0/0 come intervallo di origine consente il traffico da tutte le origini IPv4, incluse quelle esterne a Google Cloud.
    • L'uso di ::/0 come intervallo di origine consente il traffico da tutte le origini IPv6, incluse quelle esterne a Google Cloud.

Altri esempi di configurazione

Il diagramma seguente illustra un esempio di configurazione firewall. Lo scenario riguarda un elemento my-network che contiene quanto segue:

  • una subnet subnet1 con intervallo IP 10.240.10.0/24
  • una subnet subnet2 con intervallo IP 192.168.1.0/24
  • istanza vm1 in subnet2 con tag webserver e IP interno 192.168.1.2
  • istanza vm2 in subnet2 con tag database e IP interno 192.168.1.3
Esempio di configurazione di rete (fai clic per ingrandire)
Configurazione di rete di esempio (fai clic per ingrandire)

Esempio 1: rifiutare tutte le connessioni TCP in entrata tranne quelle per il trasferimento di 80 da subnet1

Questo esempio crea un insieme di regole firewall che negano tutte le connessioni TCP in entrata, ad eccezione di quelle destinate alla porta 80 da subnet1.

gcloud

  1. Crea una regola firewall per negare tutto il traffico TCP in entrata alle istanze codificate 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
    

    Sostituisci NETWORK_NAME con il nome della rete.

  2. Crea una regola firewall per consentire a tutti gli IP in subnet1 (10.240.10.0/24) di accedere alla porta TCP 80 sulle istanze contrassegnate 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
    

    Sostituisci NETWORK_NAME con il nome della rete.

Esempio 2: rifiuta tutte le connessioni TCP in uscita, ad eccezione di quelle alla porta 80 di vm1

gcloud

  1. Crea una regola firewall per negare tutto il traffico TCP in uscita.

    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
    

    Sostituisci NETWORK_NAME con il nome della rete.

  2. Crea una regola firewall per consentire il traffico TCP destinato alla porta vm1 80.

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

    Sostituisci NETWORK_NAME con il nome della rete.

Esempio 3: consentire le connessioni TCP in uscita alla porta 443 di un host esterno

Crea una regola firewall che consenta alle istanze contrassegnate con webserver di inviare il traffico TCP in uscita alla porta 443 di un indirizzo IP esterno di esempio, 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

Sostituisci NETWORK_NAME con il nome della rete.

Esempio 4: consentire le connessioni SSH da vm2 a vm1

Crea una regola firewall che consenta il traffico SSH dalle istanze con tag database (vm2) per raggiungere le istanze con tag 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

Sostituisci NETWORK_NAME con il nome della rete.

Esempio 5: consentire la connessione TCP:1443 dal server web al database utilizzando gli account di servizio

Per ulteriori informazioni sugli account di servizio e sui ruoli, vedi Concedere i ruoli agli account di servizio.

Considera lo scenario nel diagramma di seguito, in cui sono presenti due applicazioni di cui viene eseguita la scalabilità automatica tramite i modelli, un'applicazione server web my-sa-web e un'applicazione di database "my-sa-db". Un amministratore della sicurezza vuole consentire i flussi TCP alla porta di destinazione 1443 da my-sa-web a my-sa-db.

Utilizzo di regole firewall con gli account di servizio (fai clic per ingrandire)
Utilizzo delle regole firewall con gli account di servizio (fai clic per ingrandire)

I passaggi di configurazione, inclusa la creazione degli account di servizio, sono i seguenti:

gcloud

  1. Un EDITOR o PROPRIETARIO del progetto crea gli account di servizio my-sa-web e 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 PROPRIETARIO del progetto assegna allo sviluppatore webserver web-dev@example.com un ruolo serviceAccountUser per l'account di servizio my-sa-web impostando un criterio di Identity and Access Management (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 PROPRIETARIO del progetto assegna allo sviluppatore di database "db-dev@example.com" il ruolo serviceAccountUser per l'account di servizio my-sa-db impostando un criterio 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. Lo sviluppatore web-dev@example.com, con il ruolo Amministratore istanze, crea un modello di istanza server web e autorizza le istanze a eseguire l'account di servizio my-sa-web.

    gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME] \
       --service-account my-sa-web@my-project-123.iam.gserviceaccount.com
    
  5. Lo sviluppatore db-dev@example.com, con il ruolo Amministratore istanze, crea il modello di istanza del database e autorizza le istanze a eseguire come account di servizio my-sa-db.

    gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
      --service-account my-sa-db@my-project-123.iam.gserviceaccount.com
    
  6. L'amministratore della sicurezza crea le regole firewall utilizzando gli account di servizio per consentire il traffico di TCP:1443 dall'account di servizio my-sa-web all'account di servizio my-sa-db.

    gcloud compute firewall-rules create RULE_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
    

Risolvere i problemi

Messaggi di errore durante la creazione o l'aggiornamento di una regola firewall

Potrebbe essere mostrato uno dei seguenti messaggi di errore:

  • Should not specify destination range for ingress direction.

    Gli intervalli di destinazione non sono parametri validi per le regole firewall in entrata. Si presume che le regole firewall siano regole in entrata, a meno che non venga specificata una direzione di egress. Se crei una regola che non specifica una direzione, viene creata come regola in entrata, che non consente un intervallo di destinazione. Inoltre, gli intervalli di origine non sono parametri validi per le regole del traffico in uscita.

  • Firewall direction cannot be changed once created.

    Non puoi modificare la direzione di una regola firewall esistente. Devi creare una nuova regola con i parametri corretti, quindi eliminare quella precedente.

  • Firewall traffic control action cannot be changed once created.

    Non puoi modificare l'azione di una regola firewall esistente. Devi creare una nuova regola con i parametri corretti, quindi eliminare quella precedente.

  • Service accounts must be valid RFC 822 email addresses. L'account di servizio specificato nella regola firewall deve essere un indirizzo email formattato in base a RFC 822.

    gcloud compute firewall-rules create bad --allow tcp --source-service-accounts invalid-email
    
    Creating firewall...failed.
    ERROR: (gcloud.compute.firewall-rules.create) Could not fetch resource:
    – Invalid value for field 'resource.sourceServiceAccounts[0]': 'invalid-email'. Service accounts must be valid RFC 822 email addresses.
    
  • ServiceAccounts and Tags are mutually exclusive and can't be combined in the same firewall rule. Non puoi specificare sia account di servizio sia tag nella stessa regola.

    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.
    

Errore: troppi firewall di grandi dimensioni

Potresti vedere il seguente messaggio di errore: Google Compute Engine: The network contains too many large firewalls.

Per mantenere la sicurezza e le prestazioni, c'è un limite alla complessità e al numero di regole firewall che possono essere implementate in una rete VPC. Se visualizzi questo errore, chiedi al tuo team di gestione degli account di semplificare o consolidare le regole firewall.

Impossibile connettersi all'istanza VM

Se non riesci a connetterti a un'istanza VM, controlla le regole del firewall.

gcloud

  1. Se avvii la connessione da un'altra istanza VM, elenca le regole del firewall in uscita per l'istanza.

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

    Sostituisci NETWORK_NAME con il nome della rete.

  2. Controlla se l'IP di destinazione viene rifiutato da eventuali regole in uscita. La regola con la priorità più alta (numero di priorità più basso) sostituisce le regole con priorità inferiore. Per due regole con la stessa priorità, la regola di negazione ha la precedenza.

  3. Controlla la regola firewall in entrata per la rete che contiene l'istanza VM di destinazione.

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

    Sostituisci NETWORK_NAME con il nome della rete.

    Output di esempio. L'output dipenderà dall'elenco delle regole 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. Puoi inoltre eseguire test di connettività da/per istanze VM in una rete VPC in un'altra rete VPC o in una rete cloud non Google per risolvere i problemi se il traffico viene omesso da regole firewall in entrata o in uscita. Per ulteriori informazioni su come eseguire i test di connettività per risolvere vari scenari, consulta l'articolo sull'esecuzione dei test di connettività.

La mia regola firewall è abilitata o disabilitata?

Per verificare se una regola firewall è attivata o disattivata, visualizza i dettagli delle regole firewall.

In Google Cloud Console, cerca Attivato o Disattivato in Applicazione.

Nell'output dell'interfaccia a riga di comando gcloud, cerca il campo disabled. Se è indicato disabled:false, la regola è attivata e applicata. Se è indicato disabled: true, la regola viene disattivata.

Quale regola viene applicata a un'istanza VM?

Dopo aver creato una regola, puoi controllare se viene applicata correttamente in una determinata istanza. Per ulteriori informazioni, consulta la pagina relativa all'elenco delle regole firewall per un'interfaccia di rete di un'istanza VM.

Le regole firewall con tag di origine non hanno effetto immediato

La propagazione delle regole firewall in entrata che utilizzano i tag di origine può richiedere del tempo. Per i dettagli, consulta le considerazioni relative ai tag di origine per le regole firewall in entrata.

Passaggi successivi