Implementa una red de concentrador y radio mediante un balanceador de cargas como siguiente salto

En este instructivo, se describe cómo usar el intercambio de tráfico entre redes de VPC para implementar una arquitectura de concentrador y radio.

Este instructivo está destinado a ingenieros de redes de nube y profesionales de operaciones que desean implementar una arquitectura de concentrador y radio en sus entornos de Google Cloud mediante dispositivos centralizados que consisten en máquinas virtuales de Compute Engine. En este instructivo, implementarás estas máquinas virtuales como puertas de enlace de NAT, pero puedes usar el mismo enfoque para otras funciones, como firewalls de última generación. Además, se supone que estás familiarizado con las redes de VPC y con Compute Engine.

Arquitectura

En esta arquitectura, un conjunto de redes de VPC de radio se comunican con el exterior a través de una red de VPC de concentrador en la que el tráfico se enruta a través de un grupo centralizado de dispositivos, en este caso, puertas de enlace de traducción de direcciones de red (NAT). Las rutas relevantes se exportan desde la red de VPC del concentrador hacia las redes de VPC del radio. Las puertas de enlace de NAT se configuran como backends de un balanceador de cargas interno con una ruta predeterminada nueva, que tiene el balanceador de cargas de red de transferencia interno de Cloud Load Balancing como próximo salto.

Puedes lograr el mismo tipo de distribución de cargas y alta disponibilidad mediante el uso de múltiples rutas con enrutamiento de varias rutas de igual costo (ECMP). Sin embargo, usar el balanceador de cargas de red de transferencia interno tiene las siguientes ventajas:

  • El tráfico solo se reenvía a instancias en buen estado cuando dependes de las verificaciones de estado. Con ECMP, el tráfico se reenvía a todas las instancias activas a las que apunta la ruta; el uso del balanceador de cargas de red de transferencia interno elimina la posibilidad de que haya rutas no usadas. Además, no es necesario limpiar las rutas cuando se finalizan o se reinician las instancias.
  • Hay una conmutación por error potencialmente más rápida, ya que puedes ajustar los cronómetros de la verificación de estado. Si usas grupos de instancias administrados y reparación automática, puedes personalizar los cronómetros de la verificación de estado, pero se usan para volver a crear la instancia, no para enrutar el tráfico.

Google también ofrece Cloud NAT como un servicio administrado, lo que proporciona alta disponibilidad sin intervención ni administración de los usuarios. Sin embargo, Cloud NAT no se admite en este caso de uso porque la configuración de NAT no se importa a una red de intercambio de tráfico.

En el siguiente diagrama, se muestra la topología que compilaste en este instructivo.

Arquitectura de una red de VPC del concentrador con dos redes de VPC del radio.

La topología consiste en una red de VPC de concentrador y dos redes de VPC de radio que se vinculan con la red de VPC de concentrador mediante el intercambio de tráfico entre redes de VPC. La red de VPC de concentrador tiene dos instancias de puerta de enlace de NAT detrás de un balanceador de cargas de red de transferencia interno. Una ruta estática predeterminada (0/0 NAT-GW-ILB) apunta al balanceador de cargas de red de transferencia interno como el próximo salto. Esta ruta estática predeterminada se exporta a través del intercambio de tráfico entre redes de VPC mediante rutas personalizadas.

Objetivos

  • Crear varias redes de VPC e intercambiarlas mediante una arquitectura de concentrador y radio
  • Crear y configurar puertas de enlace NAT en la red de VPC del concentrador.
  • Establece y configura el balanceador de cargas de red de transferencia interno como el próximo salto.
  • Verificar la conectividad de las redes de VPC de radio a la Internet pública

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Compute Engine API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Compute Engine API.

    Enable the API

  8. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  9. En este instructivo, ejecutarás todos los comandos desde Cloud Shell.

Configura tu entorno

  1. En Cloud Shell, asegúrate de estar trabajando en el proyecto de Google Cloud que creaste o que seleccionaste. Reemplaza project-id por tu proyecto de Google Cloud.

    gcloud config set project project-id
    
    export PROJECT_ID=`gcloud config list --format="value(core.project)"`
    
  2. Establece la región y la zona de procesamiento predeterminadas.

    gcloud config set compute/region us-central1
    gcloud config set compute/zone us-central1-c
    export REGION=us-central1
    export ZONE=us-central1-c
    

    En este instructivo, la región es us-central1, y la zona es us-central1-c.

Crea redes y subredes de VPC

  1. En Cloud Shell, crea la red y la subred de VPC de concentrador:

    gcloud compute networks create hub-vpc --subnet-mode custom
    
    gcloud compute networks subnets create hub-subnet1 \
        --network hub-vpc --range 10.0.0.0/24
    
  2. Crea las redes de VPC de radio, llamadas spoke1-vpc y spoke2-vpc, y una subred en cada una:

    gcloud compute networks create spoke1-vpc --subnet-mode custom
    
    gcloud compute networks create spoke2-vpc --subnet-mode custom
    
    gcloud compute networks subnets create spoke1-subnet1 \
        --network spoke1-vpc --range 192.168.1.0/24
    
    gcloud compute networks subnets create spoke2-subnet1 \
        --network spoke2-vpc --range 192.168.2.0/24
    
  3. Crea reglas de firewall en la red de VPC de concentrador y en las redes de VPC de radio. Estas reglas permiten el tráfico interno (TCP/80 y 443, ICMP y UDP/53) de los rangos de RFC 1918 especificados:

    gcloud compute firewall-rules create hub-vpc-web-ping-dns \
        --network hub-vpc --allow tcp:80,tcp:443,icmp,udp:53 \
        --source-ranges 10.0.0.0/24,192.168.1.0/24,192.168.2.0/24
    
    gcloud compute firewall-rules create spoke1-vpc-web-ping-dns \
        --network spoke1-vpc --allow tcp:80,tcp:443,icmp,udp:53 \
        --source-ranges 10.0.0.0/24,192.168.1.0/24
    
    gcloud compute firewall-rules create spoke2-vpc-web-ping-dns \
        --network spoke2-vpc --allow tcp:80,tcp:443,icmp,udp:53 \
        --source-ranges 10.0.0.0/24,192.168.2.0/24
    
  4. Crea reglas de firewall en la red de VPC de concentrador y en las redes de VPC de radio a fin de permitir que IAP para la conexión SSH acceda a todas tus máquinas virtuales:

    gcloud compute firewall-rules create hub-vpc-iap \
        --network hub-vpc --allow tcp:22 \
        --source-ranges 35.235.240.0/20
    
    gcloud compute firewall-rules create spoke1-vpc-iap \
        --network spoke1-vpc --allow tcp:22 \
        --source-ranges 35.235.240.0/20
    
    gcloud compute firewall-rules create spoke2-vpc-iap \
        --network spoke2-vpc --allow tcp:22 \
        --source-ranges 35.235.240.0/20
    

    En este instructivo, se usa Identity-Aware Proxy (IAP) para la conexión SSH. Para obtener más información, consulta Conéctate a instancias que no tienen direcciones IP externas.

  5. Crea una regla de firewall para permitir las verificaciones de estado de grupos de instancias de reparación automática en la red de VPC de concentrador:

    gcloud compute firewall-rules create hub-vpc-health-checks \
        --network hub-vpc --allow tcp:443 --target-tags nat-gw \
        --source-ranges 130.211.0.0/22,35.191.0.0/16
    

Crea las instancias y las rutas requeridas

  1. En Cloud Shell, crea la plantilla de instancias para la puerta de enlace de NAT que tiene una secuencia de comandos de inicio que configura la puerta de enlace de NAT:

    gcloud compute instance-templates create \
      hub-nat-gw-ilbnhop-template \
      --network hub-vpc \
      --subnet hub-subnet1 \
      --machine-type n1-standard-2 --can-ip-forward \
      --tags nat-gw --scopes default,compute-rw \
      --metadata startup-script='#! /bin/bash
    apt-get update
    # Enable IP forwarding:
    echo 1 > /proc/sys/net/ipv4/ip_forward
    echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-example.conf
    # Read VM network configuration:
    md_vm="http://metadata.google.internal/computeMetadata/v1/instance/"
    md_net="$md_vm/network-interfaces"
    nic0_gw="$(curl $md_net/0/gateway -H "Metadata-Flavor:Google")"
    nic0_mask="$(curl $md_net/0/subnetmask -H "Metadata-Flavor:Google")"
    nic0_addr="$(curl $md_net/0/ip -H "Metadata-Flavor:Google")"
    nic0_id="$(ip addr show | grep $nic0_addr | tail -c 5)"
    # Use a web server to pass the health check for this example.
    # In production, use a more complete test.
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    echo "Example web page to pass health check" | \
    tee /var/www/html/index.html
    sudo systemctl restart apache2
    # Enable IP masquerading
    iptables -t nat -A POSTROUTING -o $nic0_id -j MASQUERADE'
    

    En este instructivo, se usa n1-standard-2 como el tipo de instancia, pero puedes usar cualquier otro número o tamaño de puerta de enlace que desees. Asegúrate de tener en cuenta factores como el ancho de banda de salida máximo por VM.

  2. Crea una verificación de estado de HTTP:

    gcloud compute health-checks create http nat-gw-ilbnhop-health-check \
        --region us-central1 \
        --port 80
    
  3. Crea un grupo de instancias regional con dos instancias que se distribuyen en una sola región:

    gcloud compute instance-groups managed create \
        hub-nat-gw-ilbnhop-mig \
        --region us-central1 --size=2 \
        --template=hub-nat-gw-ilbnhop-template \
        --health-check nat-gw-ilbnhop-health-check \
        --initial-delay 15
    

    En este instructivo, la demora inicial se establece en 15 segundos. En una implementación de producción, personaliza esta configuración de acuerdo con tus requisitos. En este instructivo, no se usan las políticas de ajuste de escala automático.

  4. Crea un servicio de backend y agrega el siguiente grupo de instancias:

    gcloud compute backend-services create hub-nat-gw-ilbnhop-backend \
        --load-balancing-scheme=internal \
        --protocol=tcp \
        --health-checks=nat-gw-ilbnhop-health-check
    
    gcloud compute backend-services add-backend \
        hub-nat-gw-ilbnhop-backend \
        --instance-group=hub-nat-gw-ilbnhop-mig \
        --instance-group-region=us-central1
    
  5. Crea una regla de reenvío:

    gcloud compute forwarding-rules create \
        hub-nat-gw-ilbnhop \
        --load-balancing-scheme=internal \
        --network=hub-vpc \
        --subnet=hub-subnet1 \
        --address=10.0.0.10 \
        --ip-protocol=TCP \
        --ports=all \
        --backend-service=hub-nat-gw-ilbnhop-backend \
        --backend-service-region=us-central1 \
        --service-label=hub-nat-gw-ilbnhop
    

    Aunque la regla de reenvío se define solo con TCP, cuando usas el balanceador de cargas de red de transferencia interno como el próximo salto, la regla de reenvío reenvía todo el tráfico a todos los puertos en las VMs de backend. El balanceador de cargas de red de transferencia interno es un balanceador de cargas regional.

  6. Crea una ruta nueva con la regla de reenvío como siguiente salto:

    gcloud compute routes create hub-nat-gw-ilbnhop \
        --network=hub-vpc \
        --destination-range=0.0.0.0/0 \
        --next-hop-ilb=hub-nat-gw-ilbnhop \
        --next-hop-ilb-region=us-central1 \
        --priority=800
    

    Puedes especificar etiquetas de red para que la ruta del siguiente salto solo se aplique a las instancias de cliente que se configuraron con la etiqueta, pero las etiquetas no se exportan ni se importan a través del intercambio de tráfico entre redes de VPC.

  7. Borra la ruta predeterminada de la VPC de concentrador:

    export hub_default_route=$(gcloud compute routes list \
        --format="value(name)" --filter="network:hub-vpc AND \
        nextHopGateway:default-internet-gateway" | head -n 1)
    gcloud compute routes delete $hub_default_route -q
    
  8. Crea una nueva ruta etiquetada para permitir el tráfico solo desde las puertas de enlace NAT:

    gcloud compute routes create hub-default-tagged \
        --network hub-vpc --destination-range 0.0.0.0/0 \
        --next-hop-gateway default-internet-gateway \
        --priority 700 --tags nat-gw
    
  9. Borra las rutas predeterminadas a Internet de la VPC de cada radio:

    export spoke1_default_route=$(gcloud compute routes list \
        --format="value(name)" --filter="network:spoke1-vpc AND \
        nextHopGateway:default-internet-gateway")
    
    gcloud compute routes delete $spoke1_default_route -q
    
    export spoke2_default_route=$(gcloud compute routes list \
        --format="value(name)" \
        --filter="network:spoke2-vpc AND nextHopGateway:default-internet-gateway")
    
    gcloud compute routes delete $spoke2_default_route -q
    

    Cuando hay un conflicto entre las rutas locales y las importadas, las locales siempre tienen prioridad. Para obtener más información, consulta Orden de enrutamiento.

  10. Crea VMs de cliente:

    gcloud compute instances create spoke1-client \
        --subnet=spoke1-subnet1 --no-address \
        --metadata startup-script='#! /bin/bash
    apt-get update
    apt-get install dnsutils -y'
    
    gcloud compute instances create spoke2-client \
        --subnet=spoke2-subnet1 --no-address \
        --metadata startup-script='#! /bin/bash
    apt-get update
    apt-get install dnsutils -y'
    

Crea las conexiones de intercambio de tráfico entre redes de VPC

El intercambio de tráfico entre redes de VPC es bidireccional y, por lo tanto, debe definirse en ambos extremos. Una red de VPC puede intercambiarse con varias redes de VPC, pero se aplican limitaciones. Para llegar a la ruta predeterminada mediante el intercambio de tráfico entre redes de VPC, usa la función de importación y exportación de rutas personalizadas por medio del intercambio de tráfico entre redes de VPC.

Para este instructivo, debes crear todas las redes de VPC en el mismo proyecto de Google Cloud.

  1. En Cloud Shell, crea las conexiones de intercambio de tráfico entre redes de VPC desde la red de VPC del concentrador hacia las redes de VPC de radio con la marca de exportación de ruta habilitada:

    gcloud compute networks peerings create hub-to-spoke1 \
        --network hub-vpc --peer-network spoke1-vpc \
        --peer-project $PROJECT_ID \
        --export-custom-routes
    
    gcloud compute networks peerings create hub-to-spoke2 \
        --network hub-vpc --peer-network spoke2-vpc \
        --peer-project $PROJECT_ID \
        --export-custom-routes
    
  2. Crea una conexión de intercambio de tráfico entre redes de VPC desde la red de VPC spoke1 hacia la red de VPC del concentrador con la marca de importación de ruta habilitada:

    gcloud compute networks peerings create spoke1-to-hub \
        --network spoke1-vpc --peer-network hub-vpc \
        --peer-project $PROJECT_ID \
        --import-custom-routes
    
  3. Crea una conexión de intercambio de tráfico entre redes de VPC desde la red de VPC spoke2 hacia la red de VPC del concentrador con la marca de importación de ruta habilitada:

    gcloud compute networks peerings create spoke2-to-hub \
        --network spoke2-vpc --peer-network hub-vpc \
        --peer-project $PROJECT_ID \
        --import-custom-routes
    

Verifica la propagación de las rutas y la conectividad

  1. En Cloud Shell, verifica que las rutas estáticas se hayan creado de forma correcta como parte de las secuencias de comandos de inicio:

    gcloud compute routes list --filter="network:hub-vpc"
    

    Asegúrate de que las rutas hub-default-tagged y hub-nat-gw-ilbanhop estén presentes en el resultado:

    NAME                            NETWORK  DEST_RANGE      NEXT_HOP                  PRIORITY
    default-route-13a4b635b5eab48c  hub-vpc  10.0.0.0/24     hub-vpc                   1000
    hub-default-tagged              hub-vpc  0.0.0.0/0       default-internet-gateway  700
    hub-nat-gw-ilbanhop             hub-vpc  0.0.0.0/0       10.0.0.10                 800
    peering-route-3274f1257a9842a0  hub-vpc  192.168.2.0/24  hub-to-spoke2             1000
    peering-route-798c5777f13094bc  hub-vpc  192.168.1.0/24  hub-to-spoke1             1000
    
  2. Verifica la tabla de enrutamiento spoke1-vpc para asegurarte de que la ruta predeterminada se haya importado de forma correcta:

    gcloud compute routes list --filter="network:spoke1-vpc"
    

    Asegúrate de que haya una ruta que comience con peering-route, en la que 0.0.0.0/0 sea el valor DEST_RANGE en el resultado:

    NAME                            NETWORK     DEST_RANGE      NEXT_HOP       PRIORITY
    default-route-75f6ea8f5fc54813  spoke1-vpc  192.168.1.0/24  spoke1-vpc     1000
    peering-route-6c7f130b860bfd39  spoke1-vpc  10.0.0.0/24     spoke1-to-hub  1000
    peering-route-9d44d362f98afbd8  spoke1-vpc  0.0.0.0/0       spoke1-to-hub  800
    
  3. Conéctate a uno de los clientes mediante SSH a través de IAP:

    gcloud compute ssh spoke1-client --tunnel-through-iap
    
  4. Para verificar la conectividad, prueba el DNS público de Google a través de la puerta de enlace de NAT:

    sudo hping3 -S -p 80 -c 3 dns.google
    

    Debido a que el balanceador de cargas de red de transferencia interno es compatible con TCP y UDP, no puedes verificar la conectividad a Internet mediante un ping basado en ICMP. Por lo tanto, debes usar una herramienta como hping3.

    El resultado es similar a este:

    HPING dns.google (eth0 8.8.4.4): S set, 40 headers + 0 data bytes
    len=44 ip=8.8.4.4 ttl=126 DF id=0 sport=80 flags=SA seq=0 win=65535 rtt=4.6 ms
    len=44 ip=8.8.4.4 ttl=126 DF id=0 sport=80 flags=SA seq=1 win=65535 rtt=4.4 ms
    len=44 ip=8.8.4.4 ttl=126 DF id=0 sport=80 flags=SA seq=2 win=65535 rtt=4.3 ms
    
    --- dns.google hping statistic ---
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max = 4.3/4.4/4.6 ms
    
  5. Verifica la dirección IP pública que usas para comunicarte con Internet:

    curl ifconfig.co
    

    El resultado muestra una dirección IP pública de una de las instancias de la puerta de enlace NAT. Si vuelves a ejecutar el comando, el resultado podría mostrar una dirección IP pública diferente porque las conexiones se distribuyen mediante la afinidad de sesiones del balanceo de cargas interno configurado (de forma predeterminada, la IP, el protocolo y el puerto de cliente).

    El intercambio de tráfico entre redes de VPC no es transitivo, por lo que no hay conectividad entre las redes de VPC de radio a través del intercambio de tráfico entre redes de VPC.

Consideraciones para un entorno de producción

La configuración que debes crear en este instructivo proporciona dos puertas de enlace NAT en una sola región. Sin embargo, el balanceo de cargas de ECMP no es perfecto, y un flujo individual no se distribuye entre varios vínculos, que es lo que se necesita cuando se usan dispositivos con estado, como firewalls de nueva generación.

Para implementar esta configuración en el entorno de producción, ten en cuenta los siguientes puntos:

  • Esta configuración es la más adecuada para los vínculos de salida efímeros o sin estado. Si el tamaño del grupo de puertas de enlace de NAT cambia, es posible que se vuelvan a equilibrar las conexiones TCP, lo que podría provocar el restablecimiento de una conexión establecida.
  • Los nodos no se actualizan de forma automática, por lo que si una instalación predeterminada de Debian tiene una vulnerabilidad de seguridad, debes actualizar la imagen manualmente.
  • Si tienes VMs en varias regiones, debes configurar puertas de enlace de NAT en cada región.
  • El ancho de banda por puerta de enlace puede variar según el tipo de hardware. Asegúrate de tener en cuenta factores como el ancho de banda de salida máximo por VM. Durante una falla de la puerta de enlace, el tráfico se distribuye a las puertas de enlace restantes. Debido a que los flujos de ejecución no se reprograman, el tráfico no se restablece de forma inmediata cuando la puerta de enlace vuelve a estar en línea. Así que asegúrate de permitir suficiente sobrecarga para el dimensionamiento.
  • Para recibir alertas de resultados inesperados, usa Cloud Monitoring para supervisar los grupos de instancias administrados y el tráfico de red.

Limpia

La manera más fácil de eliminar la facturación es borrar el proyecto de Google Cloud que creaste para el instructivo. Como alternativa, puedes borrar los recursos individuales.

Borra el proyecto

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Borra los recursos individuales

Si deseas conservar el proyecto de Google Cloud, puedes borrar los recursos que creaste para este instructivo.

  1. Borra las conexiones de intercambio de tráfico entre redes de VPC:

    gcloud compute networks peerings delete spoke2-to-hub \
        --network spoke2-vpc -q
    
    gcloud compute networks peerings delete spoke1-to-hub \
        --network spoke1-vpc -q
    
    gcloud compute networks peerings delete hub-to-spoke1 \
        --network hub-vpc -q
    
    gcloud compute networks peerings delete hub-to-spoke2 \
        --network hub-vpc -q
    
  2. Borra instancias, recursos del balanceador de cargas, plantillas y rutas:

    gcloud compute instances delete spoke1-client \
      --zone=us-central1-c -q
    
    gcloud compute instances delete spoke2-client \
      --zone=us-central1-c -q
    
    gcloud compute routes delete hub-nat-gw-ilbnhop -q
    
    gcloud compute forwarding-rules delete hub-nat-gw-ilbnhop -q
    
    gcloud compute backend-services delete -q hub-nat-gw-ilbnhop-backend -q
    
    gcloud compute instance-groups managed delete hub-nat-gw-ilbnhop-mig \
      --region us-central1 -q
    
    gcloud compute health-checks delete nat-gw-ilbnhop-health-check -q
    
    gcloud compute instance-templates delete hub-nat-gw-ilbnhop-template -q
    
    gcloud compute routes delete hub-default-tagged -q
    
  3. Borra las reglas de firewall, las subredes y las redes de VPC:

    gcloud compute firewall-rules delete spoke2-vpc-iap -q
    
    gcloud compute firewall-rules delete spoke2-vpc-web-ping-dns -q
    
    gcloud compute firewall-rules delete spoke1-vpc-iap -q
    
    gcloud compute firewall-rules delete spoke1-vpc-web-ping-dns -q
    
    gcloud compute firewall-rules delete hub-vpc-iap -q
    
    gcloud compute firewall-rules delete hub-vpc-web-ping-dns -q
    
    gcloud compute firewall-rules delete hub-vpc-health-checks -q
    
    gcloud compute networks subnets delete spoke1-subnet1 \
        --region us-central1 -q
    
    gcloud compute networks subnets delete spoke2-subnet1 \
        --region us-central1 -q
    
    gcloud compute networks subnets delete hub-subnet1 \
        --region us-central1 -q
    
    gcloud compute networks delete spoke1-vpc -q
    
    gcloud compute networks delete spoke2-vpc -q
    
    gcloud compute networks delete hub-vpc -q
    

¿Qué sigue?