Utilizar rutas

En esta página se describe cómo crear y gestionar rutas de redes de nube privada virtual (VPC) en Google Cloud. En esta página se da por hecho que conoces los distintos tipos de Google Cloud rutas y sus características, tal como se describe en Rutas.

Cada red nueva tiene dos tipos de rutas generadas por el sistema: una ruta predeterminada, que puedes quitar o sustituir, y una ruta de subred por cada una de sus subredes. No puedes eliminar una ruta de subred a menos que elimines la subred correspondiente.

Además de las rutas generadas por el sistema, puede crear otras rutas estáticas personalizadas.

Listar las rutas de una red de VPC

Puedes usar la CLI de Google Cloud o la API para enumerar y ver los detalles de los siguientes tipos de rutas:

Ni los comandos de la interfaz de línea de comandos de gcloud ni los métodos de la API muestran los siguientes tipos de rutas:

Para ver la ruta completa, usa la consola Google Cloud . Para enumerar y describir las rutas basadas en políticas, consulta Usar rutas basadas en políticas.

Consola

  1. En la Google Cloud consola, ve a la página Rutas.

    Ir a Rutas

  2. En la pestaña Rutas eficaces, haz lo siguiente:

    • Elige una red de VPC.
    • Elige una región.
  3. Haz clic en Ver.

  4. Puede filtrar por propiedades como el tipo de ruta, el intervalo de IPs de destino y el tipo de salto siguiente.

  5. Opcional: Haz clic en el interruptor Mostrar rutas suprimidas para activarlo y ver las rutas que se han suprimido. Para ver el motivo por el que se ha suprimido una ruta, coloque el cursor sobre el icono de la columna Estado.

gcloud

Para enumerar y ver los detalles de las rutas de subred y las rutas estáticas, usa los comandos gcloud compute routes. Estos comandos no muestran otros tipos de rutas. Para ver todas las rutas, usa la Google Cloud consola.

Para enumerar las rutas, siga estos pasos:

gcloud compute routes list \
    --filter="network=NETWORK_NAME" \
    --project=PROJECT_ID

Para obtener información sobre una ruta, haz lo siguiente:

gcloud compute routes describe ROUTE_NAME \
    --format="flattened()" \
    --project=PROJECT_ID

Haz los cambios siguientes:

  • NETWORK_NAME: el nombre de la red de VPC
  • PROJECT_ID: el ID del proyecto que contiene tu red VPC
  • ROUTE_NAME: el nombre de la ruta

API

Para enumerar y ver los detalles de las rutas de subred y las rutas estáticas, usa los métodos routes.list y routes.get. Estos métodos no muestran otros tipos de rutas. Para ver todas las rutas, usa la Google Cloud consola.

Para enumerar las rutas, siga estos pasos:

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

Para obtener información sobre una ruta, haz lo siguiente:

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes/ROUTE_NAME

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto que contiene tu red VPC
  • NETWORK_URL: la URL de la red de VPC
  • ROUTE_NAME: el nombre de la ruta

Mostrar las rutas aplicables de una interfaz de red de una VM

Puedes usar la Google Cloud consola para ver las rutas aplicables a la interfaz de red de una VM. Esta vista acota la lista de rutas que puede usar para el tráfico de salida.

Para ver las rutas aplicables a una interfaz de red específica de una VM, sigue estos pasos.

Consola

  1. En la consola de Google Cloud , ve a la página Instancias de VM.

    Ir a instancias de VM

  2. Busca una instancia de VM en la lista. En el menú Más acciones situado al final de la fila, seleccione Ver detalles de la red.

  3. Si una instancia tiene varias interfaces de red, en la sección Detalles de la interfaz de red, selecciona la interfaz de red que quieras ver.

  4. En la sección Detalles de cortafuegos y rutas, haga clic en la pestaña Rutas para ver todas las rutas que se aplican a la interfaz de red, ordenadas por nombre de ruta.

Añadir y eliminar rutas estáticas

Puede añadir o quitar rutas estáticas y rutas basadas en políticas que sean locales de su red de VPC. En esta sección se describe cómo añadir y eliminar rutas estáticas locales. Para obtener más información sobre cómo añadir y quitar rutas basadas en políticas, consulta el artículo Usar rutas basadas en políticas.

Las rutas de subred se añaden y se eliminan automáticamente cuando añades o eliminas una subred. Para obtener más información sobre cómo añadir y quitar subredes, consulta Trabajar con subredes.

Todas las rutas de una red de VPC conectada mediante el emparejamiento de redes de VPC deben manipularse en la red de VPC que exporta esas rutas. Para obtener más información, consulta las opciones de intercambio de rutas.

Antes de añadir una ruta estática

Antes de añadir una ruta estática, ten en cuenta lo siguiente:

  • Asegúrate de entender los diferentes tipos de saltos siguientes que pueden usar las rutas estáticas. Para obtener información sobre los diferentes tipos de siguiente salto de ruta estática, incluidos los que admiten destinos IPv6, consulta Siguientes saltos y funciones.
  • A menos que uses subredes híbridas, una ruta estática no puede tener un intervalo de destino que coincida con el intervalo de destino de una subred o una ruta de subred de peering, o que sea más específico que este. Para obtener más información, consulta las secciones Interacciones con rutas estáticas personalizadas en la descripción general de las rutas y Interacciones entre subredes y rutas estáticas en la documentación sobre el emparejamiento entre redes de VPC.
  • Para evitar conflictos al usar una red de VPC en modo automático, no crees rutas estáticas cuyos destinos se incluyan en 10.128.0.0/9. Consulta los intervalos de IPv4 del modo automático para obtener más información.
  • Los destinos de las rutas estáticas personalizadas no pueden solaparse con ningún intervalo asignado interno.
  • Antes de crear una ruta estática personalizada que use una VM como salto siguiente, familiarízate con las instancias como saltos siguientes. Google Cloud Solo se valida que una VM exista en el momento en que creas la ruta si eliges una instancia de salto siguiente.
  • Si crea una ruta con una etiqueta de red, solo las VMs que tengan esa etiqueta recibirán la ruta. Sin embargo, las VMs etiquetadas siguen recibiendo todas las rutas que no tienen ninguna etiqueta de red.

Añadir una ruta estática

Añadir una ruta estática a una red. Para obtener más información sobre los diferentes tipos de saltos siguientes de ruta estática, incluidos los que admiten destinos IPv6, consulta Saltos siguientes y funciones.

Consola

  1. En la Google Cloud consola, ve a la página Rutas.

    Ir a Rutas

  2. Haga clic en la pestaña Gestión de rutas.

  3. Haz clic en Crear ruta.

  4. Especifica un nombre y una descripción para la ruta.

  5. En la lista Red, selecciona una red para la ruta.

  6. En la lista Tipo de ruta, selecciona Ruta estática.

  7. En la lista Versión de IP, selecciona la versión de IP que necesites:

    • Para crear una ruta estática IPv4, selecciona IPv4.
    • Para crear una ruta estática IPv6, selecciona IPv6.
  8. Especifica un intervalo de IPs de destino. El destino más amplio posible es 0.0.0.0/0 para IPv4 o ::/0 para IPv6.

  9. Especifica una prioridad para la ruta. La prioridad puede ir de 0 (la más alta) a 65535 (la más baja).

  10. Para que la ruta solo se aplique a las instancias seleccionadas con etiquetas de red coincidentes, especifíquelas en el campo Etiquetas de instancia. Deje el campo en blanco para que la ruta se aplique a todas las instancias de la red.

  11. Selecciona un siguiente salto para la ruta:

    • Pasarela de Internet predeterminada: envía paquetes a Internet y a las APIs y los servicios de Google.
    • Especificar una instancia: envía paquetes a la interfaz de red de una instancia de VM. Especifica la instancia de VM por nombre y zona. Si el destino de la ruta es una dirección IPv6, la instancia de VM debe ser de pila dual o solo IPv6.
    • Especificar la dirección IP de una instancia: especifica la dirección IP de una instancia ya creada en la red de VPC. En el caso de las rutas estáticas IPv6, la instancia debe ser de doble pila o de solo IPv6. Para consultar las restricciones importantes de las direcciones IP de siguiente salto válidas, consulta Siguientes saltos de rutas estáticas.
    • Especificar túnel VPN: envía paquetes a un túnel de VPN clásica mediante enrutamiento estático.
    • Especifica una regla de reenvío de un balanceador de carga de red de paso a través interno: envía paquetes a un balanceador de carga de red de paso a través interno que se especifica mediante su nombre de regla de reenvío interno y su región. La regla de reenvío puede tener una dirección IPv4 o IPv6. La versión de IP de la regla de reenvío que especifique debe coincidir con la versión de IP de la ruta estática que cree.
  12. Haz clic en Crear.

gcloud

Crea una ruta estática personalizada con el siguiente comando de la CLI de gcloud:

gcloud compute routes create ROUTE_NAME \
    --network=NETWORK \
    --destination-range=DESTINATION_RANGE \
    --priority=PRIORITY \
    NEXT_HOP_SPECIFICATION

Haz los cambios siguientes:

  • ROUTE_NAME: el nombre de la ruta
  • NETWORK: nombre de la red de VPC que contiene la ruta
  • DESTINATION_RANGE: las direcciones IPv4 o IPv6 de destino a las que se aplica esta ruta. El destino más amplio posible es 0.0.0.0/0 para IPv4 o ::/0 para IPv6.
  • PRIORITY: la ruta priority, que puede ser de 0 (la prioridad más alta) a 65535 (la prioridad más baja)
  • NEXT_HOP_SPECIFICATION: el siguiente salto de la ruta estática. Usa uno de los siguientes parámetros o una combinación de ellos:

    • --next-hop-gateway=default-internet-gateway: entrega paquetes a Internet y a las APIs y los servicios de Google.
    • --next-hop-instance=INSTANCE_NAME y --next-hop-instance-zone=ZONE: entrega paquetes a la interfaz de red de una instancia de VM. Especifica la instancia de VM por nombre y zona. Si el destino de la ruta es una dirección IPv6, la instancia de VM debe ser de pila dual o de solo IPv6.
    • --next-hop-address=ADDRESS: especifica una dirección IP de una instancia que ya exista en la red de VPC. En el caso de las rutas estáticas IPv6, la instancia debe ser de doble pila o solo IPv6. Para ver las restricciones importantes de las direcciones IP del siguiente salto válidas, consulta Siguientes saltos y funciones.
    • --next-hop-vpn-tunnel=VPN_TUNNEL_NAME y --next-hop-vpn-tunnel-region=REGION: envía paquetes a un túnel de VPN clásica mediante enrutamiento estático.
    • --next-hop-ilb=FORWARDING_RULE y --next-hop-ilb-region=REGION: envía paquetes a un balanceador de carga de red de paso a través interno. Especifica la regla de reenvío por su nombre (o dirección IPv4 o IPv6) y región. La versión de IP de la regla de reenvío que especifique debe coincidir con la versión de IP de la ruta estática que cree. Para obtener más información sobre cómo configurar rutas estáticas en balanceadores de carga de red internos de tipo pasarela, consulta el artículo Crear rutas estáticas.

    Para que la ruta estática personalizada se aplique solo a las VMs seleccionadas por etiqueta de red, añade la marca --tags y especifica una o varias etiquetas de red. Para obtener más información sobre cómo funcionan conjuntamente las etiquetas de red y las rutas estáticas personalizadas, consulta Rutas aplicables en la descripción general de las rutas. Puedes usar etiquetas con cualquier ruta estática personalizada.

Para obtener más información sobre la sintaxis de la CLI de gcloud, consulta la documentación del SDK.

API

Crea una ruta estática personalizada.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes
{
  "name": "ROUTE_NAME",
  "network": "NETWORK_NAME",
  "destRange": "DESTINATION_RANGE",
  "priority": PRIORITY,
  "NEXT_HOP_SPECIFICATION"
}

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto en el que se crea la ruta
  • ROUTE_NAME: el nombre de la ruta
  • NETWORK: el nombre de la red de VPC que contiene la ruta.
  • DESTINATION_RANGE: el intervalo de direcciones IPv4 o IPv6 de destino al que se aplica esta ruta. El destino más amplio posible es 0.0.0.0/0 para IPv4 o ::/0 para IPv6.
  • PRIORITY: la ruta priority, que puede ser de 0 (la prioridad más alta) a 65535 (la prioridad más baja)
  • NEXT_HOP_SPECIFICATION: el salto siguiente de la ruta estática. Usa uno de los siguientes parámetros o una combinación de ellos:
    • nextHopGateway: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/gateways/default-internet-gateway: envía paquetes a Internet y a las APIs y los servicios de Google
    • nextHopInstance: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME: envía paquetes a la interfaz de red de una instancia de VM. Especifica la instancia de VM por nombre y zona. Si el destino de la ruta es una dirección IPv6, la instancia de VM debe ser de pila dual o solo IPv6.
    • nextHopIp: ADDRESS: especifica una dirección IP de una instancia que ya exista en la red de VPC. En el caso de las rutas estáticas IPv6, la instancia debe ser de doble pila o de solo IPv6. Para consultar las restricciones importantes de las direcciones IP del siguiente salto válidas, consulta Siguientes saltos y funciones.
    • nextHopVpnTunnel: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/vpnTunnels/VPN_TUNNEL_NAME: envía paquetes a un túnel de VPN clásica mediante enrutamiento estático.
    • nextHopIlb: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/forwardingRules/FORWARDING_RULE: envía paquetes a un balanceador de carga de red de paso a través interno. Especifica la regla de reenvío por su nombre (o dirección IPv4 o IPv6) y región. La versión de IP de la regla de reenvío que especifique debe coincidir con la versión de IP de la ruta estática que cree.

Para que la ruta estática personalizada se aplique solo a las VMs seleccionadas por etiqueta de red, añade el campo tags y especifica una o varias etiquetas de red. Para obtener más información sobre cómo funcionan conjuntamente las etiquetas de red y las rutas estáticas personalizadas, consulta Rutas aplicables en la descripción general de las rutas. Puedes usar etiquetas con cualquier ruta estática personalizada.

Para obtener más información, consulta el método routes.insert.

Terraform

Puedes crear una ruta estática mediante un módulo de Terraform.

Esta ruta estática crea una ruta predeterminada a Internet.

module "google_compute_route" {
  source       = "terraform-google-modules/network/google//modules/routes"
  version      = "~> 11.0"
  project_id   = var.project_id # Replace this with your project ID in quotes
  network_name = "default"

  routes = [
    {
      name              = "egress-internet"
      description       = "route through IGW to access internet"
      destination_range = "0.0.0.0/0"
      tags              = "egress-inet"
      next_hop_internet = "true"
    }
  ]
}

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

Go

import (
	"context"
	"fmt"
	"io"

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

// createRoute creates a route with given name inside given project.
func createRoute(w io.Writer, projectID, name string) error {
	// projectID := "your_project_id"
	// name := "testname"

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

	route := &computepb.Route{
		Name:           proto.String(name),
		Network:        proto.String("global/networks/default"),
		DestRange:      proto.String("0.0.0.0/0"),
		NextHopGateway: proto.String("global/gateways/default-internet-gateway"),
	}

	req := &computepb.InsertRouteRequest{
		Project:       projectID,
		RouteResource: route,
	}
	op, err := client.Insert(ctx, req)

	if err != nil {
		return fmt.Errorf("unable to insert a route: %w", err)
	}

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

	fmt.Fprintf(w, "Route created\n")

	return nil
}

Java


import com.google.cloud.compute.v1.InsertRouteRequest;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Route;
import com.google.cloud.compute.v1.RoutesClient;
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 CreateRoute {

  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project you want to use.
    String projectId = "your-project-id";
    // Route name you want to use.
    String routeName = "your-route-name";
    createRoute(projectId, routeName);
  }

  // Create route for a project.
  public static Operation.Status createRoute(String projectId, String routeName)
          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.
    try (RoutesClient routesClient = RoutesClient.create()) {
      String nextHopGateway =
              String.format("projects/%s/global/gateways/default-internet-gateway", projectId);

      Route route = Route.newBuilder()
              .setName(routeName)
              .setDestRange("10.0.0.0/16")
              .setNetwork("global/networks/default")
              .setNextHopGateway(nextHopGateway)
              .build();

      InsertRouteRequest request = InsertRouteRequest.newBuilder()
              .setProject(projectId)
              .setRequestId(UUID.randomUUID().toString())
              .setRouteResource(route)
              .build();

      return routesClient.insertCallable().futureCall(request)
              .get(30, TimeUnit.SECONDS).getStatus();
    }
  }
}

Python

from __future__ import annotations

import sys
from typing import Any

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


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

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

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

    Returns:
        Whatever the operation.result() returns.

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

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

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

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

    return result


def create_route(
    project_id: str,
    network: str,
    route_name: str,
    destination_range: str,
    *,
    next_hop_gateway: str | None = None,
    next_hop_ip: str | None = None,
    next_hop_instance: str | None = None,
    next_hop_vpn_tunnel: str | None = None,
    next_hop_ilb: str | None = None,
) -> compute_v1.Route:
    """
    Create a new route in selected network by providing a destination and next hop name.

    Note: The set of {next_hop_gateway, next_hop_ip, next_hop_instance, next_hop_vpn_tunnel,
        next_hop_ilb} is exclusive, you and only specify one of those parameters.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        network: name of the network the route will be created in. Available name formats:
            * https://www.googleapis.com/compute/v1/projects/{project_id}/global/networks/{network}
            * projects/{project_id}/global/networks/{network}
            * global/networks/{network}
        route_name: name of the new route.
        destination_range: range of destination IPs this route should be applied to. E.g. 10.0.0.0/16.
        next_hop_gateway: name of the gateway the traffic should be directed to.
        next_hop_ip: IP address the traffic should be directed to.
        next_hop_instance: name of the instance the traffic should be directed to. Name format:
            "projects/{project}/zones/{zone}/instances/{instance_name}"
        next_hop_vpn_tunnel: name of the VPN tunnel the traffic should be directed to. Name format:
            "projects/{project}/regions/{region}/vpnTunnels/{vpn_tunnel_name}"
        next_hop_ilb: name of a forwarding rule of the Internal Load Balancer the traffic
            should be directed to. Name format:
            "projects/{project}/regions/{region}/forwardingRules/{forwarding_rule_region}"

    Returns:
        A new compute_v1.Route object.
    """
    excl_args = {
        next_hop_instance,
        next_hop_ilb,
        next_hop_vpn_tunnel,
        next_hop_gateway,
        next_hop_ip,
    }
    args_set = sum(1 if arg is not None else 0 for arg in excl_args)

    if args_set != 1:
        raise RuntimeError("You must specify exactly one next_hop_* parameter.")

    route = compute_v1.Route()
    route.name = route_name
    route.network = network
    route.dest_range = destination_range

    if next_hop_gateway:
        route.next_hop_gateway = next_hop_gateway
    elif next_hop_ip:
        route.next_hop_ip = next_hop_ip
    elif next_hop_instance:
        route.next_hop_instance = next_hop_instance
    elif next_hop_vpn_tunnel:
        route.next_hop_vpn_tunnel = next_hop_vpn_tunnel
    elif next_hop_ilb:
        route.next_hop_ilb = next_hop_ilb

    route_client = compute_v1.RoutesClient()
    operation = route_client.insert(project=project_id, route_resource=route)

    wait_for_extended_operation(operation, "route creation")

    return route_client.get(project=project_id, route=route_name)

Añadir una ruta predeterminada IPv4

La ruta estática predeterminada de IPv4 (0.0.0.0/0) con next-hop-gateway configurado como default-internet-gateway se configura automáticamente en cada red VPC. Sigue estos pasos para volver a crear la ruta si es necesario.

Consola

  1. En la Google Cloud consola, ve a la página Rutas.

    Ir a Rutas

  2. Haga clic en la pestaña Gestión de rutas.

  3. Haz clic en Crear ruta.

  4. Especifica un nombre y una descripción para la ruta.

  5. Selecciona una red para la ruta.

  6. En Intervalo de IP de destino, introduce 0.0.0.0/0.

  7. Especifica una prioridad para la ruta. La prioridad puede ir de 0 (la más alta) a 65535 (la más baja).

  8. En Siguiente salto, selecciona Pasarela de Internet predeterminada.

  9. Haz clic en Crear.

gcloud

Recrea la ruta predeterminada de IPv4 de una red.

gcloud compute routes create ROUTE_NAME \
    --destination-range=0.0.0.0/0 \
    --network=NETWORK \
    --next-hop-gateway=default-internet-gateway

Haz los cambios siguientes:

  • ROUTE_NAME: nombre de la ruta
  • NETWORK: nombre de la red de VPC que contiene la ruta

API

Recrea la ruta predeterminada de IPv4 de una red.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes
{
  "destRange": "0.0.0.0/0",
  "name": "ROUTE_NAME",
  "network": "NETWORK_NAME",
  "nextHopGateway": "projects/PROJECT_ID/global/gateways/default-internet-gateway"
}

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto en el que se crea la ruta
  • ROUTE_NAME: nombre de la ruta
  • NETWORK_NAME: nombre de la red de VPC que contiene la ruta

Añadir una ruta predeterminada IPv6

La ruta estática predeterminada de IPv6 (::/0) con next-hop-gateway configurado como default-internet-gateway se configura automáticamente en la red de VPC al crear una subred con el tipo de acceso IPv6 definido como externo. Puedes eliminar la ruta para bloquear todo el tráfico IPv6 de las VMs a Internet. También puedes volver a crear la ruta si lo necesitas.

Consola

  1. En la Google Cloud consola, ve a la página Rutas.

    Ir a Rutas

  2. Haga clic en la pestaña Gestión de rutas.

  3. Haz clic en Crear ruta.

  4. Especifica un nombre y una descripción para la ruta.

  5. Selecciona una red para la ruta.

  6. En Intervalo de IP de destino, introduce ::/0.

  7. Especifica una prioridad para la ruta. La prioridad puede ir de 0 (la más alta) a 65535 (la más baja).

  8. En Siguiente salto, selecciona Pasarela de Internet predeterminada.

  9. Haz clic en Crear.

gcloud

Recrea la ruta predeterminada de IPv6 de una red.

gcloud compute routes create ROUTE_NAME \
    --destination-range=::/0 \
    --network=NETWORK \
    --next-hop-gateway=default-internet-gateway

Haz los cambios siguientes:

  • ROUTE_NAME: nombre de la ruta.
  • NETWORK: el nombre de la red de VPC que contiene la ruta.

API

Recrea la ruta predeterminada de IPv6 de una red.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes
{
  "destRange": "::/0",
  "name": "ROUTE_NAME",
  "network": "NETWORK_NAME",
  "nextHopGateway": "projects/PROJECT_ID/global/gateways/default-internet-gateway"
}

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto en el que se crea la ruta
  • ROUTE_NAME: nombre de la ruta
  • NETWORK_NAME: nombre de la red de VPC que contiene la ruta

Modificar una ruta estática

No puedes editar ni actualizar una ruta estática después de crearla. Para modificar una ruta estática, debes eliminarla y crear otra.

Eliminar una ruta estática

Para eliminar una ruta, sigue estos pasos:

Consola

  1. En la Google Cloud consola, ve a la página Rutas.

    Ir a Rutas

  2. Haga clic en la pestaña Gestión de rutas.

  3. Marca la casilla situada junto a la regla que quieras eliminar.

  4. Haz clic en Eliminar.

  5. Haz clic en Eliminar de nuevo para confirmar la acción.

gcloud

Elimina una ruta estática personalizada con el siguiente comando de la CLI de gcloud:

gcloud compute routes delete ROUTE_NAME

Sustituye ROUTE_NAME por el nombre de la ruta que quieras eliminar.

API

Elimina una ruta estática personalizada para quitarla de tu red de VPC mediante el método routes.delete:

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes/ROUTE_NAME

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto en el que se encuentra tu ruta.
  • ROUTE_NAME: el nombre de la ruta que se va a eliminar.

Go

import (
	"context"
	"fmt"
	"io"

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

// deleteRoute deletes a route by name in given project.
func deleteRoute(w io.Writer, projectID, name string) error {
	// projectID := "your_project_id"
	// name := "testname"

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

	req := &computepb.DeleteRouteRequest{
		Project: projectID,
		Route:   name,
	}
	op, err := client.Delete(ctx, req)

	if err != nil {
		return fmt.Errorf("unable to delete a route: %w", err)
	}

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

	fmt.Fprintf(w, "Route deleted\n")

	return nil
}

Java


import com.google.cloud.compute.v1.DeleteRouteRequest;
import com.google.cloud.compute.v1.RoutesClient;
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 DeleteRoute {

  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project you want to use.
    String projectId = "your-project-id";
    // Route name you want to delete.
    String routeName = "your-route-name";

    deleteRoute(projectId, routeName);
  }

  // Deletes a route from a project.
  public static void deleteRoute(String projectId, String routeName)
          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.
    try (RoutesClient routesClient = RoutesClient.create()) {
      DeleteRouteRequest request = DeleteRouteRequest.newBuilder()
              .setProject(projectId)
              .setRoute(routeName)
              .setRequestId(UUID.randomUUID().toString())
              .build();
      routesClient.deleteCallable().futureCall(request).get(30, TimeUnit.SECONDS);
    }
  }
}

Python

from __future__ import annotations

import sys
from typing import Any

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


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

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

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

    Returns:
        Whatever the operation.result() returns.

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

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

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

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

    return result


def delete_route(project_id: str, route_name: str) -> None:
    """
    Delete a route in project.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        route_name: name of the route to delete.
    """

    route_client = compute_v1.RoutesClient()
    operation = route_client.delete(project=project_id, route=route_name)

    wait_for_extended_operation(operation, "route deletion")

Propagación de los cambios de ruta

Cuando añades o eliminas una ruta estática, esta se propaga a todas las regiones y las instancias de máquina virtual de tu red de VPC. El estado de una operación de ruta PENDING o RUNNING indica que el cambio de ruta está en cola.

Después de ponerla en cola, el estado de la operación de ruta cambia a DONE. Pueden pasar 30 segundos más antes de que todas las instancias de máquina virtual de tu red de VPC y de las redes de VPC emparejadas usen una ruta nueva o dejen de usar una ruta antigua.

Si añades o quitas varias rutas estáticas simultáneamente, los cambios se pueden aplicar en cualquier orden. No se garantiza que el orden en el que envíes los cambios de ruta sea el orden en el que se procesen. Es posible que las distintas instancias se den cuenta de los cambios en momentos diferentes.

Si necesitas hacer cambios en las rutas que dependen unos de otros, debes hacerlos de forma secuencial. Es decir, solo puedes hacer cambios posteriores cuando el estado del cambio anterior sea DONE y hayan transcurrido 30 segundos.

Habilitar el reenvío de IP en las instancias

De forma predeterminada, el reenvío de IP está inhabilitado y Google Cloud realiza una comprobación estricta de la dirección de origen. En función de la configuración del cortafuegos de salida, una VM puede emitir paquetes con los siguientes orígenes:

  • Dirección IPv4 interna principal de la interfaz de red (NIC) de una instancia.
  • Cualquier intervalo de IP de alias configurado en la NIC de una instancia.
  • Si se configura un intervalo de direcciones IPv6 en la subred y la instancia es de doble pila o solo IPv6, cualquiera de las direcciones IPv6 asignadas a la NIC.
  • Una dirección IP interna o externa asociada a una regla de reenvío para el balanceo de carga de paso a través o el reenvío de protocolos, si la instancia es un backend de un balanceador de carga de red de paso a través interno o externo, o si una instancia de destino hace referencia a ella.

Para usar una VM como siguiente salto de una ruta, la VM debe reenviar los paquetes cuyas fuentes no coincidan con ninguna de las direcciones o intervalos IP de la lista anterior. Para reenviar paquetes con direcciones de origen arbitrarias, debes habilitar el reenvío de IP:

  • Cuando creas o actualizas una VM, puedes habilitar el reenvío de IP siguiendo las instrucciones de esta sección. Habilitar el reenvío de IP se aplica a todas las NICs de la VM.
  • Además de los pasos descritos en esta sección, debes habilitar el reenvío de IP en el sistema operativo invitado de la máquina virtual. Para hacerlo en Linux, asigna el valor 1 a uno o ambos de los siguientes parámetros del kernel: net.ipv4.ip_forward (para IPv4) o net.ipv6.conf.all.forwarding (para IPv6).

Para habilitar el reenvío de IP al crear una VM, sigue estos pasos.

Consola

  1. En la consola de Google Cloud , ve a la página Instancias de VM.

    Ir a instancias de VM

  2. Haz clic en Crear instancia.

  3. En la sección Opciones avanzadas, despliega Redes, discos, seguridad, gestión y único cliente.

  4. Despliega la sección Redes.

  5. En la sección Reenvío de IP, selecciona la casilla Habilitar.

gcloud

Cuando crees una instancia, añade la marca --can-ip-forward al comando:

gcloud compute instances create ... --can-ip-forward

API

Cuando cree una instancia, use el campo canIpForward para habilitar el reenvío de IP:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
  "canIpForward": true,
  ...other fields
}

Haz los cambios siguientes:

  • PROJECT_ID: ID del proyecto que contiene la instancia
  • ZONE: la Google Cloud zona que contiene la instancia

Para obtener más información, consulta el método instances.insert.

Terraform

Puedes usar el recurso de Terraform para crear una instancia de VM con el reenvío de IP habilitado.

En este ejemplo, los argumentos de Terraform tienen valores asignados que puedes cambiar.

resource "google_compute_instance" "default" {
  project      = var.project_id # Replace this with your project ID in quotes
  zone         = "southamerica-east1-b"
  name         = "instance-next-hop"
  machine_type = "e2-medium"
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }
  network_interface {
    network = "default"
  }
  can_ip_forward = true
}

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

Después de habilitar el reenvío de IP, continúa con el proceso de creación de la VM.

Para habilitar el reenvío de IP en una VM, actualiza la propiedad canIpForward instance.

Siguientes pasos