Configura las VM para casos prácticos de Herramientas de redes

En esta página, se describen las configuraciones de Herramientas de redes especiales de las instancias de máquina virtual (VM) de Compute Engine, como las siguientes opciones:

  • Configura una conexión HTTP externa a una VM
  • Configura una VM como un proxy de red
  • Configura una VM como una puerta de enlace de VPN
  • Configura una VM como una puerta de enlace NAT
  • Compilación de puertas de enlace de NAT con alta disponibilidad y ancho de banda alto

Configura una conexión HTTP externa a una VM

Las reglas predeterminadas de firewall no permiten conexiones HTTP o HTTPS a las instancias. Sin embargo, es bastante simple agregar una regla que permita tales conexiones. Ten en cuenta que una VM debe tener una dirección IP externa (estática o efímera) antes de poder recibir tráfico desde fuera de la red de su nube privada virtual (VPC).

Puedes usar la herramienta de línea de comandos de gcloud o Google Cloud Console para agregar una regla de firewall que permita las conexiones HTTP o HTTPS. También puedes agregar una regla de firewall mediante la API.

Console

Puedes usar Cloud Console a fin de crear una regla de firewall general para todas las instancias de la red de VPC, o bien permitir el acceso de las instancias individuales a las conexiones HTTP y HTTPS mediante la selección de la opción correspondiente durante la creación de esa instancia. La última opción se describe primero, porque proporciona más control sobre las instancias individuales.

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

    Ir a la página Instancias de VM

  2. Haz clic en Crear instancia.
  3. En la sección Firewall, selecciona Permitir tráfico HTTP y Permitir el tráfico HTTPS.
  4. Haga clic en Create para crear la instancia.

Cuando se seleccionan estas casillas de verificación, en la red de VPC, se crea de forma automática una regla default-http o default-https que se aplica a todas las instancias que contengan las etiquetas http-server o https-server. A la instancia nueva también se aplica la etiqueta correspondiente según la selección de la casilla de verificación.

Si ya cuentas con las reglas de firewall default-http y default-https, puedes habilitar las opciones Permitir HTTP o Permitir HTTPS en la página de detalles de la instancia y, de este modo, aplicar la regla de firewall a las instancias existentes.

  1. Ve a la página Instancias de VM.
  2. Haz clic en el nombre de la instancia deseada.
  3. Haz clic en el botón Editar en la parte superior de la página.
  4. Desplázate hacia abajo hasta la sección Firewalls.
  5. Marca las opciones Permitir HTTP o Permitir HTTPS en la red de VPC deseada.
  6. Haz clic en Guardar.

De manera similar, también puedes inhabilitar el acceso HTTP o HTTPS externo para una VM mediante la desactivación de una o ambas casillas de verificación.

Gracias a la posibilidad de etiquetar determinadas instancias para el tráfico HTTP y HTTPS en lugar de crear una regla de firewall general aplicable a todas las instancias, en Google Cloud, se limitan las posibles consecuencias de seguridad de permitir tráfico externo a todas las máquinas virtuales de un proyecto. Sin embargo, si deseas crear una regla de firewall que permita tráfico HTTP o HTTPS a todas las instancias de máquina virtual, puedes crear tu propia regla de firewall; para ello, haz lo siguiente:

  1. Ve a la página Redes de VPC.
  2. Selecciona la red de VPC en la cual deseas aplicar la regla de firewall.
  3. En la sección Reglas de firewall, haz clic en Agregar regla de firewall.
  4. Asigna un nombre a tu regla de firewall y agrega tcp:80 en el cuadro Protocolos y puertos, o bien tcp:443 para el tráfico HTTPS.
  5. Haz clic en Crear.
Herramienta de línea de comandos de gcloud

Si deseas permitir el tráfico HTTP y HTTPS a todas las máquinas virtuales en un proyecto, utiliza el siguiente comando a fin de crear un firewall para permitir las solicitudes HTTP y HTTPS entrantes desde cualquier lugar a cualquiera de las instancias conectadas a esta red de VPC.

gcloud compute firewall-rules create FIREWALL_RULE --allow tcp:80,tcp:443

**Ejemplo**

gcloud compute firewall-rules create sample-http \
 --description "Incoming http and https allowed." \
 --allow tcp:80,tcp:443
gcloud compute firewall-rules describe sample-http
allowed:
- IPProtocol: tcp
  ports:
  - '80'
  - '443'
creationTimestamp: '2014-06-13T13:27:12.206-07:00'
id: '5057780722612413546'
kind: compute#firewall
name: sample-http
network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/samplehttp
sourceRanges:
- 0.0.0.0/0

Configura una VM como un proxy de red

Puedes diseñar una red de VPC para otorgar acceso externo solo a una instancia y, que en todas las demás instancias de la red de VPC, se utilice esa instancia como un servidor proxy para el mundo exterior. Esto resulta útil si deseas controlar el acceso dentro o fuera de la red de VPC, o reducir el costo que implica pagar varias direcciones IP externas.

En este ejemplo particular, se analiza cómo configurar un proxy de red en las instancias de VM en las que se utiliza una imagen de Debian. Utiliza una instancia de puerta de enlace como un servidor proxy de Squid, pero esta es solo una forma de configurar un servidor proxy.

A fin de configurar un servidor proxy de Squid, haz lo siguiente:

  1. Configura una instancia con una dirección IP externa (estática o efímera). Para este ejemplo, asígnale el nombre gateway-instance a la instancia.
  2. Especifica gcloud compute instances create ... --no-address para configurar una o más instancias sin direcciones IP externas. Para este ejemplo, asigna el nombre hidden-instance a la instancia.
  3. Aprende cómo conectarte de una instancia a otra, porque no podrás conectarte directamente a las instancias solo para uso interno.
  4. Agrega un firewall para permitir el tráfico de TCP en el puerto 3128 con el siguiente comando:

    gcloud compute firewall-rules create [FIREWALL_RULE] --network [NETWORK] --allow tcp:3128
    
  5. Instala Squid en gateway-instance y configúralo para permitir el acceso desde cualquier máquina en la red de VPC (direcciones IP de subred válidas). De este modo, se supone que las instancias gateway-instance y hidden-instance están conectadas a la misma red de VPC, lo que permite que se conecten entre sí.

    user@gateway-instance:~$ sudo apt-get install squid3
    

    Habilita cualquier máquina de la red local para utilizar el servidor Squid3. Mediante los siguientes comandos sed, se quitan los comentarios de las entradas acl localnet src en los archivos de configuración de Squid y se las habilita para las redes y las máquinas locales.

    user@gateway-instance:~$ sudo sed -i 's:#\(http_access allow localnet\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(http_access deny to_localhost\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 10.0.0.0/8.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 172.16.0.0/12.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 192.168.0.0/16.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src fc00\:\:/7.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src fe80\:\:/10.*\):\1:' /etc/squid/squid.conf
    
    # Prevent proxy access to metadata server
    user@gateway-instance:~$ sudo tee -a /etc/squid/squid.conf <<'EOF'
    acl to_metadata dst 169.254.169.254
    http_access deny to_metadata
    EOF
    
    # Start Squid
    user@gateway:~$ sudo service squid start
    
  6. Configura hidden-instance para usar gateway-instance como su proxy. Conéctate a hidden-instance mediante SSH y define las direcciones URL del proxy de modo que apunten a gateway-instance en el puerto 3128 (la configuración predeterminada de Squid) como se muestra a continuación:

    user@gateway-instance:~$ ssh hidden-instance
    
    user@hidden-instance:~$ sudo -s
    
    root@hidden-instance:~# echo "export http_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export https_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export ftp_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export no_proxy=169.254.169.254,metadata,metadata.google.internal" >> /etc/profile.d/proxy.sh
    

    Actualiza el archivo sudoers para que se pase por estas variables del entorno.

    root@hidden-instance:~# cp /etc/sudoers /tmp/sudoers.new
    
    root@hidden-instance:~# chmod 640 /tmp/sudoers.new
    
    root@hidden-instance:~# echo "Defaults env_keep += \"ftp_proxy http_proxy https_proxy no_proxy"\" >>/tmp/sudoers.new
    
    root@hidden-instance:~# chmod 440 /tmp/sudoers.new
    
    root@hidden-instance:~# visudo -c -f /tmp/sudoers.new && cp /tmp/sudoers.new /etc/sudoers
    
  7. Sal de sudo, carga las variables y ejecuta apt-get en hidden-instance. Ahora debería funcionar con la puerta de enlace como proxy. Si la puerta de enlace no se usara como un proxy, apt-get no funcionará porque hidden-instance no tiene ninguna conexión directa a Internet.

    root@hidden-instance:~# exit
    
    user@hidden-instance:~$ source ~/.profile
    
    user@hidden-instance:~$ sudo apt-get update
    

Configura una VM como una puerta de enlace de VPN

Puedes utilizar el software de VPN Strongswan para configurar una puerta de enlace de VPN en una de las instancias. Para la mayoría de los usuarios, recomendamos usar Cloud VPN en lugar de Strongswan. Gracias a Cloud VPN, no necesitas crear ni configurar una VM para que ejecute el software de VPN. Utiliza Strongswan para los casos en que Cloud VPN no proporcione la funcionalidad requerida.

  1. Crea una red de VPC a la que se conectará tu red local.

    gcloud compute networks create vpn-network --subnet-mode custom
    
  2. Crea una subred con un rango de IP que no se superponga con la subred local.

    gcloud compute networks subnets create vpn-subnet \
        --network vpn-network \
        --region us-central1 \
        --range 10.0.0.0/24 \
    
  3. Crea una instancia de VM en la subred vpn-subnet. Esta instancia será la puerta de enlace de VPN.

    gcloud compute instances create vpn-gateway --can-ip-forward \
        --subnet vpn-subnet \
        --zone us-central1-a \
        --tags vpn-gateway
    
  4. Busca y registra la dirección IP interna y externa de la puerta de enlace de VPN.

    gcloud compute instances describe --zone us-central1-a vpn-gateway
    

    La dirección IP externa es el valor del campo natIP. La dirección IP interna es el valor del campo networkIP, como 10.0.0.2.

  5. Crea una instancia de VM que se comunique con los clientes de tu red local a través de la puerta de enlace de VPN.

    gcloud compute instances create test-vpn \
        --subnet vpn-subnet \
        --tags vpn \
        --zone us-central1-a
    
  6. Crea una ruta en la red vpn-network para enrutar el tráfico a través de vpn-gateway si está destinado a tu red local.

    gcloud compute routes create vpnnetwork-to-gateway \
        --destination-range [ON_PREM_IP_RANGE] \
        --next-hop-address [VPN_GATEWAY_INTERNAL_IP] \
        --network vpn-network \
        --tags vpn
    

    El valor [VPN_GATEWAY_INTERNAL_IP] es la dirección IP interna de tu puerta de enlace de VPN (el valor del campo networkIP).

  7. Agrega las siguientes reglas de firewall a tu red de VPC para aceptar el tráfico entrante.

    gcloud compute firewall-rules create ssh --source-ranges 0.0.0.0/0 \
        --allow tcp:22 \
        --network vpn-network
    
    gcloud compute firewall-rules create  allow-internal \
        --source-ranges 10.0.0.0/24 \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --network vpn-network
    
    gcloud compute firewall-rules create allow-ipsec-nat \
        --source-ranges [ON_PREM_VPN_GATEWAY_EXTERNAL_IP]/32 \
        --allow udp:4500,udp:500 \
        --network vpn-network \
        --target-tags vpn-gateway
    
    gcloud compute firewall-rules create from-onprem \
        --source-ranges [ON_PREM_NETWORK_ADDRESS_SPACE] \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --network vpn-network \
        --target-tags vpn
    

    Crea reglas de firewall en tu red local para aceptar el tráfico entrante que proviene de la red de VPC.

  8. Conéctate a la instancia de puerta de enlace de VPN.

  9. Instala y configura Strongswan, el software de VPN.

    En el directorio principal, crea un archivo llamado ipsec.conf. Propágalo con el siguiente contenido y reemplaza los marcadores de posición con los siguientes valores del entorno:

    conn myconn
      authby=psk
      auto=start
      dpdaction=hold
      esp=aes128-sha1-modp2048!
      forceencaps=yes
      ike=aes128-sha1-modp2048!
      keyexchange=ikev2
      mobike=no
      type=tunnel
      left=%any
      leftid=[VPN_GATEWAY_EXTERNAL_IP_ADDRESS]
      leftsubnet=10.0.0.0/24
      leftauth=psk
      leftikeport=4500
      right=[ON_PREM_EXTERNAL_IP_ADDRESS]
      rightsubnet=[ON_PREM_ADDRESS_SPACE]
      rightauth=psk
      rightikeport=4500
    

    Luego, ejecuta los siguientes comandos y reemplaza [secret-key] por una clave secreta (un valor de string):

    $ sudo apt-get update
    
    $ sudo apt-get install strongswan -y
    
    $ echo "%any : PSK \"[secret-key]\"" | sudo tee /etc/ipsec.secrets > /dev/null
    
    $ sudo sysctl -w net.ipv4.ip_forward=1
    
    $ sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
    
    $ sudo cp ipsec.conf /etc
    
    $ sudo ipsec restart
    

    También debes configurar la puerta de enlace de VPN local para establecer correctamente un túnel VPN.

    Si la máquina de puerta de enlace local ejecuta un sistema operativo basado en Debian, puedes utilizar los mismos pasos para instalar y configurar Strongswan. Por ejemplo, haz una copia de tu archivo ipsec.conf y cambia los ID y las subredes de la izquierda y la derecha.

  10. Para probar tu túnel VPN, haz ping a una máquina local desde la instancia test-vpn con el siguiente comando:

    gcloud compute ssh test-vpn --command 'ping -c 3 [ON_PREM_INTERNAL_ADDRESS]'
    

Soluciona problemas

Si estás teniendo problemas con la configuración de tu VPN de acuerdo con las instrucciones mencionadas con anterioridad, intenta seguir estas sugerencias para solucionar problemas de configuración:

  1. Verifica el estado de la configuración con el siguiente comando:

    $ sudo ipsec status
    

    Si myconn no aparece en la lista, inicia la conexión:

    $ sudo ipsec up myconn
    
  2. Determina si los dos extremos de VPN pueden comunicarse.

    Utiliza netcat para enviar tráfico similar a VPN (UDP, puerto 4500). Ejecuta el siguiente comando en el extremo VPN local:

    $ echo | nc -u [vpn-vm-gateway-external-address] 4500
    

    Ejecuta tcpdump en el extremo receptor para determinar si tu instancia de VM puede recibir el paquete en el puerto 4500 con el siguiente comando:

    $ tcpdump -nn -n host [external-ip-of-local-VPN-gateway-machine] -i any
    
  3. Agrega las siguientes líneas a tus archivos ipsec.conf a fin de activar registros más detallados:

    config setup
      charondebug="ike 3, mgr 3, chd 3, net 3"
    
    conn myconn
      authby=psk
      auto=start
      ...
    

    A continuación, vuelve a intentar la conexión. Aunque la conexión aún debería tener fallas, puedes revisar el registro para ver si hay errores. El archivo de registro debe estar ubicado en /var/log/charon.log, en tu instancia de VM.

Configura una VM como una puerta de enlace NAT

Puedes crear situaciones de Herramientas de redes más complicadas; para ello, realiza cambios en la colección de rutas. En esta sección, se describe cómo puedes configurar una instancia de puerta de enlace de traslación de dirección interna (NAT) que pueda enrutar tráfico desde las instancias de máquina virtual solo para uso interno a Internet. Esto te permite utilizar una dirección IP externa para enviar tráfico desde varias instancias de máquina virtual, pero solo exponer una máquina virtual a Internet.

  1. Para comenzar, crea una red de VPC a fin de alojar las instancias de tu máquina virtual para esta situación.

    gcloud compute networks create custom-network1 \
        --subnet-mode custom
    
  2. Crea una subred para la región us-central1.

    gcloud compute networks subnets create subnet-us-central \
        --network custom-network1 \
        --region us-central1 \
        --range 192.168.1.0/24
    
  3. Crea reglas de firewall para permitir conexiones SSH en la red nueva que acabas de crear.

    gcloud compute firewall-rules create custom-network1-allow-ssh \
        --allow tcp:22 \
        --network custom-network1
    
    gcloud compute firewall-rules create custom-network1-allow-internal \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --source-ranges 192.168.1.0/24 \
        --network custom-network1
    
  4. Crea una máquina virtual para que funcione como una puerta de enlace NAT en custom-network1.

    gcloud compute instances create nat-gateway --network custom-network1 \
        --subnet subnet-us-central \
        --can-ip-forward \
        --zone us-central1-a \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags nat
    
  5. Asigna la etiqueta no-ip a las instancias de máquina virtual sin una dirección IP externa en las que se usará la instancia de puerta de enlace, o bien crea una máquina virtual nueva sin una dirección IP externa y asigna la etiqueta no-ip a la instancia.

    • Agrega etiquetas a una instancia existente.
    gcloud compute instances add-tags existing-instance --tags no-ip
    
    • De forma alternativa, crea una máquina virtual nueva sin una dirección IP externa.
    gcloud compute instances create example-instance --network custom-network1 \
        --subnet subnet-us-central \
        --no-address \
        --zone us-central1-a \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags no-ip
    
  6. Crea una ruta para enviar tráfico destinado a Internet a través de la instancia de puerta de enlace.

    gcloud compute routes create no-ip-internet-route \
        --network custom-network1 \
        --destination-range 0.0.0.0/0 \
        --next-hop-instance nat-gateway \
        --next-hop-instance-zone us-central1-a \
        --tags no-ip --priority 800
    

    Establecer la prioridad de esta ruta garantiza que se la elija en caso de que existan otras rutas en conflicto. 1000 es la prioridad predeterminada y un valor inferior a 1,000 tendrá precedencia.

  7. A continuación, accede a la instancia de puerta de enlace y configura iptables para el tráfico interno de NAT a Internet.

    gcloud compute ssh nat-gateway --zone us-central1-a
    

    En la instancia, configura iptables con los siguientes comandos:

    $ sudo sysctl -w net.ipv4.ip_forward=1
    
    $ sudo iptables -t nat -A POSTROUTING -o $(/sbin/ifconfig | head -1 | awk -F: {'print $1'}) -j MASQUERADE
    

    Con el primer comando sudo, se indica al kernel que deseas permitir el reenvío de IP. Con el segundo comando sudo, se enmascaran los paquetes que se reciben de instancias internas como si se hubieran enviado desde la instancia de puerta de enlace NAT.

    Para inspeccionar las reglas de NAT de iptables, utiliza la opción de lista con el siguiente comando:

    $ sudo iptables -v -L -t nat
    

    Verifica que el resultado sea similar al siguiente ejemplo:

    Chain PREROUTING (policy ACCEPT 5 packets, 3924 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain INPUT (policy ACCEPT 5 packets, 3924 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain OUTPUT (policy ACCEPT 64 packets, 4164 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
    64  4164 MASQUERADE  all  --  any    eth0    anywhere             anywhere"
    
  8. (Opcional) Si deseas que esta configuración persista en futuros reinicios:

    $ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-natgw.conf
    
    $ sudo apt-get install iptables-persistent
    

Compila puertas de enlace de NAT con alta disponibilidad y ancho de banda alto

En esta sección, se describe cómo configurar varias puertas de enlace NAT con el enrutamiento y la reparación automática de varias rutas de acceso de igual costo (ECMP) habilitados para una implementación más resistente y de ancho de banda alto.

En Google Cloud, se usan direcciones IP internas para las máquinas virtuales. Si en estas VM se necesita acceso a recursos que se encuentran en la Internet pública, se requiere una puerta de enlace NAT. Una sola arquitectura de puerta de enlace NAT es suficiente para situaciones simples. Sin embargo, para una capacidad de procesamiento mayor o una disponibilidad más alta, se requiere una arquitectura más resiliente.

Configura las puertas de enlace

En Google Cloud, se usa el enrutamiento ECMP a fin de distribuir el tráfico para las instancias en las que varias rutas tienen la misma prioridad. En este caso, debes crear varias puertas de enlace NAT para recibir partes del tráfico mediante ECMP. Luego, en las puertas de enlace NAT, se reenvía el tráfico a hosts externos con sus direcciones IP externas.

En el siguiente diagrama, se muestra esta configuración.

configuración de varias puertas de enlace

Para una mayor resistencia, coloca cada puerta de enlace en un grupo de instancias administrado independiente con tamaño 1 y adjunta una verificación de estado simple para garantizar que las puertas de enlace se reinicien automáticamente en caso de que tengan fallas. Las puertas de enlace están en grupos de instancias independientes, por lo que tendrán una IP externa estática adjunta a la plantilla de instancias. En este ejemplo, debes aprovisionar tres puertas de enlace NAT n1-standard-2, pero puedes usar cualquier otro número o tamaño de puerta de enlace que desees. Por ejemplo, las instancias n1-standard-2 tienen un límite de 4 Gbps de tráfico de red. Si necesitas manejar un volumen de tráfico mayor, puedes elegir n1-standard-8.

  1. Crea una red de VPC (si es necesario). Si no agregas estas puertas de enlace a una VPC existente, crea una red de VPC y una subred para tales puertas. Si las agregas a una VPC existente, omite el segundo paso y modifica las regiones según corresponda para tu entorno.

    1. Mediante Cloud Shell, crea una VPC personalizada asociada a tu proyecto de Google Cloud. Esta VPC te permite utilizar direccionamiento IP no predeterminado, pero no incluye ninguna regla de firewall predeterminada. Ejecuta el siguiente comando:

      gcloud compute networks create example-vpc --subnet-mode custom
      
    2. Crea una subred dentro de esta VPC, y especifica una región y un rango de IP. Para este instructivo, usa 10.0.1.0/24 y la región us-east1 y ejecuta el siguiente comando:

      gcloud compute networks subnets create example-east \
          --network example-vpc --range 10.0.1.0/24 --region us-east1
      
  2. Reserva y almacena tres direcciones IP estáticas.

    1. Reserva y almacena una dirección con el nombre nat-1 en la región us-east1:

      gcloud compute addresses create nat-1 --region us-east1
      
      nat_1_ip=$(gcloud compute addresses describe nat-1 \
          --region us-east1 --format='value(address)')
      
    2. Reserva y almacena una dirección con el nombre nat-2 en us-east1:

      gcloud compute addresses create nat-2 --region us-east1
      
      nat_2_ip=$(gcloud compute addresses describe nat-2 \
          --region us-east1 --format='value(address)')
      
    3. Reserva y almacena una dirección con el nombre nat-3 en us-east1:

      gcloud compute addresses create nat-3 --region us-east1
      nat_3_ip=$(gcloud compute addresses describe nat-3 \
          --region us-east1 --format='value(address)')
      
  3. Crea tres plantillas de instancias con IP reservadas.

    1. Copia el archivo de configuración de inicio:

      gsutil cp gs://nat-gw-template/startup.sh .
      

      Si no puedes acceder a la secuencia de comandos de inicio, cópiala de la sección Secuencia de comandos de inicio.

    2. Crea una plantilla de instancias nat-1 con el siguiente comando:

      gcloud compute instance-templates create nat-1 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh --address $nat_1_ip
      
    3. Crea una plantilla de instancias nat-2:

      gcloud compute instance-templates create nat-2 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh  --address $nat_2_ip
      
    4. Crea una plantilla de instancias nat-3 con el siguiente comando:

      gcloud compute instance-templates create nat-3 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh --address $nat_3_ip
      

      En el tipo de máquina n1-standard-2, se dispone de dos CPU virtuales y se puede usar hasta 4 Gbps de ancho de banda de red. Si necesitas más ancho de banda, es posible que desees elegir un host diferente. El ancho de banda escala a 2 Gbps por CPU virtual, hasta 16 Gbps en un host de 8vCPU.

  4. Crea una verificación de estado para supervisar la capacidad de respuesta:

    gcloud compute health-checks create http nat-health-check --check-interval 30 \
        --healthy-threshold 1 --unhealthy-threshold 5 --request-path /health-check
    
    gcloud compute firewall-rules create "natfirewall" \
        --allow tcp:80 --target-tags natgw \
        --source-ranges "130.211.0.0/22","35.191.0.0/16"
    

    Si un sistema falla y no puede responder al tráfico HTTP, se reinicia. En este caso, dado que no necesitas un proyecto, puedes utilizar un proyecto existente o crear uno nuevo.

  5. Crea un grupo de instancias de VM para cada puerta de enlace NAT con los siguientes comandos:

    gcloud compute instance-groups managed create nat-1 --size=1 --template=nat-1 --zone=us-east1-b
    gcloud compute instance-groups managed create nat-2 --size=1 --template=nat-2 --zone=us-east1-c
    gcloud compute instance-groups managed create nat-3 --size=1 --template=nat-3 --zone=us-east1-d
    
  6. Configura la reparación automática para reiniciar las puertas de enlace NAT que no responden con los siguientes comandos:

    gcloud compute instance-groups managed update nat-1 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-b
    nat_1_instance=$(gcloud compute instances list --format='value(name)' --filter='name ~nat-1')
    gcloud compute instance-groups managed update nat-2 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-c
    nat_2_instance=$(gcloud compute instances list --format='value(name)' --filter='name ~nat-2')
    gcloud compute instance-groups managed update nat-3 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-d
    nat_3_instance=$(gcloud compute instances list --format='value(name)' --filter='name ~nat-3')
    
  7. Agrega rutas predeterminadas a tu red de VPC, que se aplican a las instancias en las que se usa la puerta de enlace NAT como se muestra a continuación:

    gcloud compute routes create natroute1 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-b \
        --next-hop-instance $nat_1_instance
    gcloud compute routes create natroute2 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-c \
        --next-hop-instance $nat_2_instance
    gcloud compute routes create natroute3 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-d \
        --next-hop-instance $nat_3_instance
    
  8. Etiqueta las instancias con las que deseas usar la NAT con el siguiente comando:

    gcloud compute instances add-tags natted-servers --tags no-ip
    
  9. Prueba la funcionalidad de NAT. Con las puertas de enlace configuradas y las VM huéspedes etiquetadas, haz ping a los hosts externos sin darles las IP externas de las VM, como se muestra en este ejemplo:

    ping 8.8.8.8

    Resultado de ejemplo:

    PING 8.8.8.8 (8.8.8.8): 56 data bytes
    64 bytes from 8.8.8.8: icmp_seq=0 ttl=52 time=0.618 ms
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=0.325 ms
    64 bytes from 8.8.8.8: icmp_seq=2 ttl=52 time=0.443 ms
    64 bytes from 8.8.8.8: icmp_seq=3 ttl=52 time=0.314 ms
    64 bytes from 8.8.8.8: icmp_seq=4 ttl=52 time=0.386 ms
    

Aspectos para tener en cuenta

Esta configuración proporciona tres puertas de enlace NAT en la región us-east1, cada una con capacidad de 2 Gbps. Sin embargo, el balanceo de cargas de ECMP no es perfecto y un flujo individual no se extiende a varios vínculos.

  • Un módulo de Terraform también está disponible para esta configuración a fin de automatizar las implementaciones.
  • Esta configuración es la mejor para los vínculos de ida efímeros o sin estado. Si el tamaño del grupo de la puerta de enlace NAT cambia, las conexiones TCP pueden volver a equilibrarse, lo que podría dar como resultado el restablecimiento de una conexión establecida.
  • Los nodos no se actualizan automáticamente, por lo que si una instalación predeterminada de Debian presenta una amenaza, tendrás que realizar la actualización de forma manual.
  • Estas instancias se encuentran en la región us-east1. Si las VM se encuentran en otras zonas, es posible que obtengas mejor rendimiento cuando mueves las puertas de enlace más cerca de esas zonas.
  • El ancho de banda por puerta de enlace es de hasta 2 Gbps por núcleo unidireccional. Durante una falla de la puerta de enlace, el tráfico se distribuye a las puertas de enlace restantes, pero debido a que los flujos en ejecución no se vuelven a programar, el tráfico no se restablece inmediatamente cuando la puerta de enlace se vuelve a conectar en línea. Así que asegúrate de permitir suficiente sobrecarga para el dimensionamiento.
  • Si deseas recibir alertas de resultados inesperados, usa Monitoring para supervisar los grupos de instancias administrados y el tráfico de red.

Secuencia de comandos de inicio: startup.sh

Secuencia de comandos de inicio a la que se hace referencia en el paso 3a:

#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-natgw.conf
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

cat <<EOF > /usr/local/sbin/health-check-server.py
#!/usr/bin/python
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
import subprocess

PORT_NUMBER = 80
PING_HOST = "www.google.com"

def connectivityCheck():
  try:
    subprocess.check_call(["ping", "-c", "1", PING_HOST])
    return True
  except subprocess.CalledProcessError as e:
    return False

#This class handles any incoming request
class myHandler(BaseHTTPRequestHandler):
  def do_GET(self):
    if self.path == '/health-check':
      if connectivityCheck():
        self.send_response(200)
      else:
        self.send_response(503)
    else:
      self.send_response(404)

try:
  server = HTTPServer(("", PORT_NUMBER), myHandler)
  print "Started httpserver on port " , PORT_NUMBER
  #Wait forever for incoming http requests
  server.serve_forever()

except KeyboardInterrupt:
  print "^C received, shutting down the web server"
  server.socket.close()
EOF

nohup python /usr/local/sbin/health-check-server.py >/dev/null 2>&1 &

Cómo migrar una puerta de enlace NAT basada en una instancia a Cloud NAT

Si tienes una puerta de enlace NAT basada en una instancia, pero deseas migrar a Cloud NAT, completa los pasos siguientes:

  1. Configura Cloud NAT en la misma región en la que tienes la puerta de enlace basada en una instancia.
  2. Borra las rutas estáticas en las que se envían paquetes a la puerta de enlace NAT basada en instancias. Ten en cuenta que aún deberías tener una ruta de puerta de enlace predeterminada para tu red.
  3. El tráfico debería comenzar a fluir a través de Cloud NAT.
  4. Una vez que hayas confirmado que todo funciona de manera correcta, borra las puertas de enlace NAT basadas en una instancia.

Próximos pasos