Configuraciones especiales para instancias de VM

En esta página, se describen las configuraciones de herramientas de redes especiales de las instancias de máquina virtual (VM) de Compute Engine, por ejemplo, las que se indican a continuación:

  • Cómo configurar una conexión HTTP externa para una instancia
  • Cómo configurar una instancia como un proxy de red
  • Cómo configurar una instancia como una puerta de enlace de VPN
  • Cómo configurar una instancia como una puerta de enlace NAT
  • Cómo compilar puertas de enlace NAT con disponibilidad alta y ancho de banda alto

Cómo configurar una conexión HTTP externa para una instancia

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 instancia debe tener una dirección IP externa antes de que pueda recibir tráfico proveniente del exterior de su red de VPC.

Puedes agregar una regla de firewall para permitir conexiones HTTP o HTTPS con el uso de la herramienta de línea de comandos de gcloud o Google Cloud Platform Console. También puedes agregar una regla de firewall a través de la API.

Console

Puedes utilizar GCP Console a fin de crear una regla de firewall general para todas las instancias en la red de VPC, o puedes permitir que instancias individuales accedan a las conexiones HTTP y HTTPS mediante la selección de la opción correspondiente cuando creas la instancia. La última opción se describe primero, porque proporciona más control sobre las instancias individuales.

  1. En GCP Console, ve a la página VM Instances.

    Ir a la página Instancias de VM

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

Cuando se seleccionan estas casillas de verificación, la red de VPC crea automáticamente una regla default-http o default-https que se aplica a todas las instancias con 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 tienes reglas de firewall default-http y default-https existentes, puedes aplicar la regla de firewall a las instancias existentes; para ello, habilita las opciones Permitir HTTP o Permitir HTTPS en la página de detalles de la instancia.

  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 instancia; para ello, desmarca una o ambas casillas de verificación.

Cuando permites que se etiqueten instancias específicas para el tráfico HTTP y HTTPS en lugar de crear una regla de firewall general que se aplique a todas las instancias, GCP limita las posibles consecuencias para la seguridad que surgen de permitir el tráfico externo a todas las máquinas virtuales en 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:

  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 la regla de firewall, y agrega tcp:80 en el cuadro Protocolos y puertos o 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, el siguiente comando crea un firewall que permite 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

Cómo configurar una instancia como un proxy de red

Puedes diseñar una red de VPC para que solo una instancia tenga acceso externo, y todas las demás instancias en la red de VPC utilicen 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 que utilizan 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:

  1. Configura una instancia con una dirección IP externa (estática o efímera). Para este ejemplo, asigna un nombre a la instancia gateway-instance.
  2. Configura una o más instancias sin direcciones IP externas; para ello, especifica gcloud compute instances create ... --no-address. En este ejemplo, llama a esta instancia hidden-instance.
  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:

    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 (espacios IP RFC 1918, RFC 4193 y RFC 4291). En este caso, se da por hecho que gateway-instance y hidden-instance están conectados a la misma red de VPC, lo que les permite conectarse entre sí.

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

    Habilita cualquier máquina en la red local para que utilice el servidor Squid3. Los siguientes comandos sed quitan los comentarios y habilitan las entradas acl localnet src en los archivos de configuración de Squid 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 cat <<EOF >>/etc/squid/squid.conf
    acl to_metadata dst 169.254.169.254
    http_access deny to_metadata
    EOF
    
    # Start Squid
    user@gateway:~$ sudo service squid3 start
    
  6. Configura hidden-instance para que utilice gateway-instance como su proxy. Utiliza ssh a fin de conectarte a hidden-instance y definir las direcciones URL del proxy para 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 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 actuara como proxy, apt-get no funcionaría porque hidden-instance no tiene conexión directa a Internet.

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

Cómo configurar una instancia 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, Google recomienda que utilices Cloud VPN en lugar de Strongswan. Con Cloud VPN, no tienes que crear ni configurar una instancia para ejecutar 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 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 que se comunique con los clientes en la 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 se dirige 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 la 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 \
        --allow all
    
    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 denominado ipsec.conf. Propágalo con el siguiente contenido y reemplaza los marcadores de posición con los 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
    

    A continuación, ejecuta los siguientes comandos y reemplaza [secret-key] con 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 está ejecutando un sistema operativo basado en Debian, puedes utilizar los mismos pasos para instalar y configurar Strongswan. Por ejemplo, haz una copia del archivo ipsec.conf y cambia los ID y las subredes izquierdos y derechos.

  10. Prueba el túnel VPN; para ello, haz ping a una máquina local desde la instancia test-vpn:

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

Solución de 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:

    $ sudo ipsec status
    

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

    $ sudo ipsec up myconn
    
  2. Determina si los dos extremos 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 la instancia de VM puede recibir el paquete en el puerto 4500:

    $ tcpdump -nn -n host [public-ip-of-local-VPN-gateway-machine] -i any
    
  3. Activa un registro más detallado; para ello, agrega las siguientes líneas a los archivos ipsec.conf:

    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 debería estar ubicado en /var/log/charon.log en la instancia de VM.

Cómo configurar una instancia 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 actúe 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. Etiqueta cualquier instancia de máquina virtual sin una dirección IP externa que utilice la instancia de puerta de enlace con la etiqueta no-ip, o crea una máquina virtual nueva sin una dirección IP externa y etiqueta la instancia con la etiqueta no-ip.

    • 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:

    $ sudo sysctl -w net.ipv4.ip_forward=1
    
    $ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    

    El primer comando sudo le indica a kernel que deseas permitir el reenvío de IP. El segundo comando sudo enmascara los paquetes recibidos de las instancias internas como si se enviaran desde la instancia de puerta de enlace NAT.

    Para inspeccionar las reglas de NAT de iptables, utiliza la opción de lista:

    $ 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:

    $ echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf > /dev/null
    
    $ sudo apt-get install iptables-persistent
    

Cómo compilar puertas de enlace NAT con disponibilidad alta 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 igual costo (ECMP) habilitados para una implementación más resistente y de ancho de banda alto.

GCP utiliza las direcciones IP privadas RFC 1918 para las máquinas virtuales. Si estas VM necesitan acceso a los recursos en la Internet pública, se requiere NAT. Una sola arquitectura de puerta de enlace NAT es suficiente para situaciones simples. Sin embargo, una mayor capacidad de procesamiento o una mayor disponibilidad requieren una arquitectura más resistente.

Cómo configurar las puertas de enlace

En instancias en las que varias rutas tienen la misma prioridad, GCP utiliza el enrutamiento ECMP para distribuir el tráfico. En este caso, puedes crear varias puertas de enlace NAT para recibir partes del tráfico a través de ECMP. Las puertas de enlace NAT reenvían el tráfico a los hosts externos con las direcciones IP públicas.

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. Puedes aprovisionar tres puertas de enlace NAT n1-standard-2 en este ejemplo, pero puedes utilizar 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 mayor volumen de tráfico, 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. Con Cloud Shell, crea una VPC personalizada asociada con el proyecto de GCP. Esta VPC te permite utilizar direccionamiento IP no predeterminado, pero no incluye ninguna regla de firewall predeterminada:

      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, utiliza 10.0.1.0/24 y la región us-east1:

      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 denominada 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 denominada 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 denominada 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 la 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:

      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:

      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
      

      El tipo de máquina n1-standard-2 tiene dos CPU virtuales y puede utilizar hasta 4 Gbps del 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 para cada puerta de enlace NAT:

    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:

    gcloud beta compute instance-groups managed set-autohealing nat-1 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-b
    nat_1_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-1/ { print $1 }')
    gcloud beta compute instance-groups managed set-autohealing nat-2 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-c
    nat_2_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-2/ { print $1 }')
    gcloud beta compute instance-groups managed set-autohealing nat-3 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-d
    nat_3_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-3/ { print $1 }')
    
  7. Agrega rutas predeterminadas a las instancias:

    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 que deseas que utilicen NAT:

    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 cuando realizas la dimensión.
  • Para recibir alertas de resultados inesperados, utiliza Stackdriver a fin de 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
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, sigue los pasos que se indican a continuación:

  1. Configura Cloud NAT en la misma región en la que tienes la puerta de enlace basada en una instancia.
  2. Borra la ruta estática o las rutas que envían paquetes a la puerta de enlace NAT basada en una instancia. 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.

¿Qué sigue?

¿Te sirvió esta página? Envíanos tu opinión: