Configura un redireccionamiento HTTP a HTTPS para el balanceo de cargas de HTTP(S)

En esta página, se describen los redireccionamientos de HTTP a HTTPS. Para obtener información sobre otros tipos de redireccionamientos, consulta Redireccionamientos de URL.

Si quieres configurar un redireccionamiento de HTTP a HTTPS mediante Terraform, consulta la pestaña de redireccionamiento de HTTP a HTTPS en la página de ejemplos del módulo de Terraform para balanceadores de cargas de HTTP(S) externos. .

En este ejemplo, se muestra cómo redireccionar todas las solicitudes del puerto 80 al puerto 443.

En un alto nivel, para redireccionar el tráfico de HTTP a HTTPS, debes hacer lo siguiente:

  1. Crea el LB1 de HTTPS (aquí llamado web-map-https).
  2. Prueba el LB1.
  3. Crea el LB2 de HTTP (sin backend) (aquí llamado web-map-http) con la misma dirección IP que se usó en el LB1 y un redireccionamiento configurado en el mapa de URL.
  4. Prueba el redireccionamiento.

Como se muestra en el siguiente diagrama, el LB1 es un balanceador de cargas de HTTPS normal con los componentes del balanceador de cargas esperados.

El LB2 es un balanceador de cargas de HTTP con la misma dirección IP que se usa en el LB1, una instrucción de redireccionamiento en el mapa de URL y ningún backend.

Configuración de redireccionamiento de HTTP a HTTPS (haz clic para ampliar)
Configuración del redireccionamiento de HTTP a HTTPS

Si quieres obtener información sobre cómo configurar el redireccionamiento de HTTP a HTTPS para el balanceo de cargas interno, consulta Configura el redireccionamiento de HTTP a HTTPS para balanceadores de cargas de HTTP(S) internos.

Configura un balanceador de cargas de HTTPS básico (LB1)

En este ejemplo, se explica cómo configurar y probar un balanceador de cargas de HTTPS.

En esta guía de configuración, se muestra cómo crear un balanceador de cargas HTTP(S) externo y un backend de Compute Engine con los siguientes recursos:

Si este ejemplo no coincide con tu caso de uso, consulta una de las siguientes páginas:

Para conocer los conceptos generales, consulta la Descripción general del balanceo de cargas de HTTP(S) externo.

Topologías de balanceador de cargas

Para un balanceador de cargas HTTPS, crea la configuración que se ilustra en el siguiente diagrama.

Balanceador de cargas HTTPS con un backend de Compute Engine (haz clic para ampliar)
Balanceador de cargas HTTPS con un backend de Compute Engine (haz clic para ampliar)

Para un balanceador de cargas HTTP, crea la configuración que se ilustra en el siguiente diagrama.

Balanceador de cargas HTTP con un backend de Compute Engine (haz clic para ampliar)
Balanceador de cargas HTTP con un backend de Compute Engine (haz clic para ampliar)

La secuencia de eventos de los diagramas es la siguiente:

  1. Un cliente envía una solicitud de contenido a la dirección IPv4 externa que se define en la regla de reenvío.
  2. Para un balanceador de cargas HTTPS, la regla de reenvío dirige la solicitud al proxy HTTPS de destino.

    Para un balanceador de cargas HTTP, la regla de reenvío dirige la solicitud al proxy HTTP de destino.

  3. El proxy de destino usa la regla en el mapa de URL para determinar si un único servicio de backend recibe todas las solicitudes.

  4. El balanceador de cargas determina que el servicio de backend tiene solo un grupo de instancias y dirige la solicitud a una instancia de máquina virtual (VM) en ese grupo.

  5. La VM entrega el contenido que solicitó el usuario.

Antes de comenzar

Asegúrate de que tu configuración cumpla con los requisitos previos.

Configura un recurso de certificado SSL

Para un balanceador de cargas HTTPS, crea un recurso de certificado SSL como se describe a continuación:

Recomendamos que uses un certificado administrado por Google.

En este ejemplo, se supone que ya tienes un recurso de certificado SSL llamado www-ssl-cert.

Configura los permisos

A fin de completar los pasos de esta guía, debes tener permiso para crear instancias de Compute Engine, reglas de firewall y direcciones IP reservadas en un proyecto. Debes tener la función de propietario o editor del proyecto, o las siguientes funciones de IAM de Compute Engine:

Tarea Función requerida
Crear instancias Administrador de instancias
Agregar y quitar reglas de firewall Administrador de seguridad
Crear componentes del balanceador de cargas Administrador de redes
Crear un proyecto (opcional) Creador de proyectos

Si deseas obtener más información, consulta las siguientes guías:

Crea un grupo de instancias administrado

Para configurar un balanceador de cargas con un backend de Compute Engine, tus VM deben estar en un grupo de instancias. En esta guía, se describe cómo crear un grupo de instancias administrado con las VM de Linux en las que se ejecuta Apache y, luego, configurar el balanceo de cargas.

El grupo de instancias administrado proporciona VM que ejecutan los servidores de backend de un balanceador de cargas de HTTP(S) externo. A modo de demostración, los backends entregan sus propios nombres de host.

Console

  1. En Google Cloud Console, ve a la página Grupos de instancias.

    Ir a la página Grupos de instancias

  2. Haz clic en Crear grupo de instancias.
  3. A la izquierda, elige Nuevo grupo de instancias administrado.
  4. En Nombre, ingresa lb-backend-example.
  5. En Ubicación, selecciona Zona única.
  6. En Región, selecciona tu región preferida. En este ejemplo, se usa us-east1.
  7. En Zona, selecciona us-east1-b.
  8. En Plantilla de instancias, selecciona Crear una nueva plantilla de instancias.
  9. En Nombre, ingresa lb-backend-template.
  10. Asegúrate de que el disco de arranque esté establecido en una imagen de Debian, como Debian GNU/Linux 9 (stretch). En estas instrucciones, se usan comandos que solo están disponibles en Debian, como apt-get.
  11. No configures la opción Firewall.

    Debido a que el balanceador de cargas HTTP(S) externo es un proxy, no es necesario seleccionar Permitir tráfico HTTPS ni Permitir tráfico HTTP en Firewall. En Configura una regla de firewall, debes crear la única regla de firewall necesaria para este balanceador de cargas.

  12. En Administración, seguridad, discos, redes, usuario único, que se encuentra en la pestaña Administración, inserta la siguiente secuencia de comandos en el campo Secuencia de comandos de inicio.

    #! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    
  13. En la pestaña Herramientas de redes, agrega las siguientes etiquetas de red: allow-health-check

  14. Haz clic en Guardar y continuar.

  15. En Modo de ajuste de escala automático, selecciona Sin ajuste de escala automático.

  16. En Cantidad de instancias, ingresa 2.

  17. Para crear el grupo de instancias nuevo, haz clic en Crear.

gcloud

  1. Crea la plantilla.

    gcloud compute instance-templates create lb-backend-template \
       --region=us-east1 \
       --network=default \
       --subnet=default \
       --tags=allow-health-check \
       --image-family=debian-9 \
       --image-project=debian-cloud \
       --metadata=startup-script='#! /bin/bash
         apt-get update
         apt-get install apache2 -y
         a2ensite default-ssl
         a2enmod ssl
         vm_hostname="$(curl -H "Metadata-Flavor:Google" \
         http://169.254.169.254/computeMetadata/v1/instance/name)"
         echo "Page served from: $vm_hostname" | \
         tee /var/www/html/index.html
         systemctl restart apache2'
    
  2. Crea el grupo de instancias administrado en función de la plantilla.

    gcloud compute instance-groups managed create lb-backend-example \
       --template=lb-backend-template --size=2 --zone=us-east1-b
    

Agrega un puerto con nombre al grupo de instancias

En el grupo de instancias, define un servicio HTTP y mapea un nombre de puerto al puerto pertinente. Una vez configurado, el servicio de balanceo de cargas reenvía el tráfico al puerto con nombre.

Console

  1. En Google Cloud Console, ve a la página Grupos de instancias.

    Ir a la página Grupos de instancias

  2. Haz clic en el nombre del grupo de instancias (en este ejemplo, lb-backend-example).
  3. En la página Descripción general del grupo de instancias, haz clic en Editar .
  4. Haz clic en Especificar la asignación del nombre de puerto.
  5. Haz clic en Agregar elemento.
  6. En el nombre de puerto, ingresa http. En el número de puerto, ingresa 80.
  7. Haz clic en Guardar.

gcloud

Usa el comando gcloud compute instance-groups set-named-ports.

gcloud compute instance-groups set-named-ports lb-backend-example \
    --named-ports http:80 \
    --zone us-east1-b

Configura una regla de firewall

En este ejemplo, se crea la regla de firewall fw-allow-health-check. Esta es una regla de entrada que permite el tráfico de los sistemas de verificación de estado de Google Cloud (130.211.0.0/2235.191.0.0/16). En este ejemplo, se usa la etiqueta de destino allow-health-check para identificar las VM.

Console

  1. En Google Cloud Console, ve a la página Firewall.

    Ir a la página Firewall

  2. Haz clic en Crear regla de firewall para crear la segunda regla de firewall:
  3. En Nombre, ingresa fw-allow-health-check.
  4. En Red, selecciona Predeterminado.
  5. En Destinos, selecciona Etiquetas de destino especificadas.
  6. Propaga el campo Etiquetas de destino con allow-health-check.
  7. Establece Filtro de fuente en Rangos de IP.
  8. Establece Rangos de IP de origen en 130.211.0.0/2235.191.0.0/16.
  9. En Protocolos y puertos, selecciona Protocolos y puertos especificados.
  10. Selecciona la casilla de verificación tcp y, luego, escribe 80 para los números de puerto.
  11. Haz clic en Crear.

gcloud

gcloud compute firewall-rules create fw-allow-health-check \
    --network=default \
    --action=allow \
    --direction=ingress \
    --source-ranges=130.211.0.0/22,35.191.0.0/16 \
    --target-tags=allow-health-check \
    --rules=tcp:80

Reserva una dirección IP externa

Ahora que tus instancias están en funcionamiento, configura una dirección IP externa, estática y global que tus clientes usarán para llegar al balanceador de cargas.

Console

  1. En Google Cloud Console, ve a la página Direcciones IP externas.

    Ir a la página Direcciones IP externas

  2. Para reservar una dirección IPv4, haz clic en Reservar dirección estática.
  3. En Nombre, ingresa lb-ipv4-1.
  4. En Nivel de servicio de red, establece Premium.
  5. Configura Versión de IP como IPv4.
  6. Establece Tipo en Global.
  7. Haz clic en Reservar.

gcloud

gcloud compute addresses create lb-ipv4-1 \
    --ip-version=IPV4 \
    --global

Préstale atención a la dirección IPv4 que estaba reservada:

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

Configura el balanceador de cargas

En este ejemplo, se usa HTTP o HTTPS entre el cliente y el balanceador de cargas. Para HTTPS, necesitas uno o más recursos de certificado SSL a fin de configurar el proxy. Recomendamos que uses un certificado administrado por Google.

Incluso si usas HTTPS en el frontend, puedes usar HTTP en el backend. Google encripta de forma automática el tráfico entre Google Front Ends (GFE) y los backends que residen en las redes de VPC de Google Cloud.

Console

  1. En Google Cloud Console, ve a la página Balanceo de cargas.

    Ir a la página Balanceo de cargas

  2. Haz clic en Crear balanceador de cargas.
  3. En Balanceo de cargas de HTTP(S), haz clic en Iniciar configuración.
  4. Selecciona De Internet a mis VM y, luego, haz clic en Continuar.
  5. En el campo Nombre del balanceador de cargas, ingresa algo como web-map-https o web-map-http.
  6. Haga clic en Configuración de backend.
    1. En Crear o seleccionar servicios y buckets de backend, selecciona Servicios de backend > Crear un servicio de backend.
    2. Agrega un nombre al servicio de backend, como web-backend-service.
    3. En Protocolo, selecciona HTTP.
    4. En Puerto con nombre, ingresa http.
    5. En Backends > Nuevo backend > Grupo de instancias, selecciona el grupo de instancias lb-backend-example.
    6. En Números de puerto, ingresa 80.
    7. Mantén la configuración predeterminada.
    8. En Verificación de estado, selecciona Crear una verificación de estado y, luego, agrega un nombre para la verificación de estado, como http-basic-check.
    9. Configura el protocolo como HTTP y, luego, haz clic en Guardar y continuar.
    10. Mantén la configuración predeterminada.
    11. Haz clic en Crear.
  7. En Reglas de host y de ruta de acceso, mantén la configuración predeterminada.
  8. En Configuración de frontend, usa los siguientes valores:
    1. Configura el campo Protocolo como HTTPS o HTTP.
    2. Configura el campo Dirección IP como lb-ipv4-1 (la que creaste antes).
    3. Asegúrate de que el valor de Puerto esté configurado como 443 para permitir el tráfico HTTPS, o bien 80 para el tráfico HTTP.
    4. Si seleccionaste 443, haz clic en la lista desplegable Certificado y selecciona tu certificado SSL principal.
    5. Haz clic en Listo.
  9. Haz clic en Revisar y finalizar.
  10. Cuando termines de configurar el balanceador de cargas, haz clic en Crear.
  11. Espera a que se cree el balanceador de cargas.
  12. Haz clic en el nombre del balanceador de cargas.
  13. En la pantalla Detalles del balanceador de cargas, toma nota del valor de IP:Puerto de tu balanceador de cargas.

gcloud

  1. Crea una verificación de estado.
    gcloud compute health-checks create http http-basic-check \
        --port 80
    
  2. Crea un servicio de backend.
    gcloud compute backend-services create web-backend-service \
        --protocol=HTTP \
        --port-name=http \
        --health-checks=http-basic-check \
        --global
    
  3. Agrega tu grupo de instancias como backend al servicio de backend:
    gcloud compute backend-services add-backend web-backend-service \
        --instance-group=lb-backend-example \
        --instance-group-zone=us-east1-b \
        --global
    

Configura un frontend de HTTPS

Omite esta sección para los balanceadores de cargas HTTP.

  1. Para HTTPS, crea un mapa de URL a fin de enrutar las solicitudes entrantes al servicio de backend predeterminado.
    gcloud compute url-maps create web-map-https \
        --default-service web-backend-service
    
  2. Para HTTPS, si aún no lo hiciste, crea el recurso de certificado SSL global, como se muestra en:

    En el siguiente ejemplo, se supone que ya tienes un archivo de certificado llamado certificate-file y un archivo de clave privada llamado private-key-file. En el ejemplo, se crea un recurso de certificado SSL llamado www-ssl-cert.

    gcloud compute ssl-certificates create www-ssl-cert \
        --certificate=certificate-file \
        --private-key=private-key-file \
        --global
    
  3. En el caso de HTTPS, crea un proxy HTTPS de destino para enrutar las solicitudes a tu mapa de URL. El proxy es la parte del balanceador de cargas que contiene el certificado SSL para el balanceador de cargas de HTTPS, por lo que también debes cargar el certificado en este paso.
    gcloud compute target-https-proxies create https-lb-proxy \
        --url-map=web-map-https \
        --ssl-certificates=www-ssl-cert
    
  4. Para HTTPS, crea una regla de reenvío global a fin de enrutar las solicitudes entrantes al proxy.
    gcloud compute forwarding-rules create https-content-rule \
        --address=lb-ipv4-1 \
        --global \
        --target-https-proxy=https-lb-proxy \
        --ports=443
    

Configura un frontend de HTTP

Omite esta sección para los balanceadores de cargas HTTPS.

  1. Para HTTP, crea un mapa de URL a fin de enrutar las solicitudes entrantes al servicio de backend predeterminado.
    gcloud compute url-maps create web-map-http \
        --default-service web-backend-service
    
  2. En el caso de HTTP, crea un proxy HTTP de destino para enrutar las solicitudes a tu mapa de URL.
    gcloud compute target-http-proxies create http-lb-proxy \
        --url-map=web-map-http
    
  3. Para HTTP, crea una regla de reenvío global a fin de enrutar las solicitudes entrantes al proxy.
    gcloud compute forwarding-rules create http-content-rule \
        --address=lb-ipv4-1 \
        --global \
        --target-http-proxy=http-lb-proxy \
        --ports=80
    

Prueba el tráfico enviado a las instancias

Ahora que el servicio de balanceo de cargas está en ejecución, puedes enviar tráfico a la regla de reenvío y ver cómo este se dispersa en las diferentes instancias.

Console

  1. En Google Cloud Console, ve a la página Balanceo de cargas.

    Ir a la página Balanceo de cargas

  2. Haz clic en el balanceador de cargas que acabas de crear.
  3. En la sección Backend, confirma que las VM estén en buen estado. La columna En buen estado debe propagarse, lo que indica que ambas VM están en buen estado (2/2). Si ves lo contrario, primero vuelve a cargar la página. Puede tomar unos minutos que Cloud Console indique que las VM están en buen estado. Si los backends no se muestran en buen estado después de unos minutos, revisa la configuración del firewall y la etiqueta de red asignada a tus VM de backend.
  4. Para HTTPS, si usas un certificado administrado por Google, confirma que el estado de tu recurso de certificado sea ACTIVO. Para obtener más información, consulta Estado de los recursos de certificado SSL administrado por Google.
  5. Después de que en Cloud Console se muestre que las instancias de backend están en buen estado, puedes probar tu balanceador de cargas con un navegador web en https://IP_ADDRESS (o http://IP_ADDRESS). Reemplaza IP_ADDRESS por la dirección IP del balanceador de cargas.
  6. Si usaste un certificado autofirmado para las pruebas de HTTPS, el navegador mostrará una advertencia. Debes indicar de manera explícita a tu navegador que acepte un certificado autofirmado.
  7. El navegador debe renderizar una página con contenido que muestre el nombre de la instancia que entregó la página, junto con su zona (por ejemplo, Page served from: lb-backend-example-xxxx). Si el navegador no renderiza esta página, revisa las opciones de configuración que aparecen en esta guía.

Cuando termines, Cloud Console mostrará información sobre el balanceador de cargas de HTTPS de la siguiente manera.

Balanceador de cargas de HTTPS

Redirecciona el tráfico al balanceador de cargas de HTTPS

Ahora que creaste el LB1 y verificaste que funciona, puedes crear el LB2 (un balanceador de cargas de HTTP parcial sin backend) para redireccionar tu tráfico HTTP hacia el LB1.

En este ejemplo, se usa el código de respuesta 301. En cambio, puedes usar un código de respuesta diferente.

Para configurar el redireccionamiento, debes importar un archivo YAML y asegurarte de que tu proxy HTTP de destino apunte al mapa de URL que redirecciona el tráfico.

Console

Por el momento, esta función no se admite en Google Cloud Console.

gcloud

  1. Crea un archivo YAML /tmp/web-map-http.yaml. En este ejemplo, se usa MOVED_PERMANENTLY_DEFAULT como código de respuesta.

    kind: compute#urlMap
    name: web-map-http
    defaultUrlRedirect:
       redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
       httpsRedirect: True
    tests:
    - description: Test with no query parameters
      host: foobar
      path: /test/
      expectedOutputUrl: https://foobar/test/
      expectedRedirectResponseCode: 301
    - description: Test with query parameters
      host: foobar
      path: /test/?parameter1=value1&parameter2=value2
      expectedOutputUrl: https://foobar/test/?parameter1=value1&parameter2=value2
      expectedRedirectResponseCode: 301
    
  2. Valida el mapa de URL.

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    Si las pruebas pasan y el comando genera un mensaje de éxito, guarda los cambios en el mapa de URL.

  3. Crea el mapa de URL del balanceador de cargas de HTTP mediante la importación del archivo YAML. El nombre de este mapa de URL es web-map-http.

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

    Si actualizas un mapa de URL existente, aparecerá el siguiente mensaje:

    Url Map [web-map-http] will be overwritten.
    
    Do you want to continue (Y/n)?
    

    Para continuar, presiona Y.

  4. Verifica que el mapa de URL esté actualizado. El mapa de URL de tu balanceador de cargas de HTTP debería ser similar al siguiente:

    gcloud compute url-maps describe web-map-http
    
    creationTimestamp: '2020-03-23T10:53:44.976-07:00'
    defaultUrlRedirect:
     httpsRedirect: true
     redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
    fingerprint: 3A5N_RLrED8=
    id: '2020316695093397831'
    kind: compute#urlMap
    name: web-map-http
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    
  5. Crea un proxy HTTP de destino nuevo o actualiza uno existente con web-map-http como el mapa de URL.

    gcloud compute target-http-proxies create http-lb-proxy \
       --url-map=web-map-http \
       --global
    

    O

    gcloud compute target-http-proxies update http-lb-proxy \
       --url-map=web-map-http \
       --global
    
  6. Crea una regla de reenvío global para enrutar las solicitudes entrantes al proxy. La marca --address especifica lb-ipv4-1, que es la misma dirección IP que se usa para el balanceador de cargas de HTTPS externo.

    gcloud compute forwarding-rules create http-content-rule \
       --address=lb-ipv4-1 \
       --global \
       --target-http-proxy=http-lb-proxy \
       --ports=80
    

Cuando termines, Cloud Console mostrará dos balanceadores de cargas de la siguiente manera.

Ambos balanceadores de cargas

Cloud Console muestra información sobre tu balanceador de cargas web-map-http de la siguiente manera.

Balanceador de cargas de HTTP

Agrega un encabezado personalizado

De forma opcional, agrega el encabezado HTTP Strict-Transport-Security al servicio de backend de tu balanceador de cargas de HTTPS, de la siguiente manera:

  • Nombre del encabezadoStrict-Transport-Security
  • Valor del encabezadomax-age=31536000; includeSubDomains; preload

Esta configuración envía el encabezado personalizado al cliente para que la próxima vez que el cliente intente acceder a la URL a través de HTTP, el navegador realice el redireccionamiento.

Para agregar el encabezado personalizado a la configuración del servicio de backend, usa la marca --custom-response-header, como se muestra aquí:

gcloud compute backend-services update web-backend-service \
    --global \
    --custom-response-header='Strict-Transport-Security:max-age=31536000; includeSubDomains; preload'

Para obtener más información, consulta Crea encabezados personalizados.

Prueba el redireccionamiento de HTTP a HTTPS

Ten en cuenta la dirección IP reservada que usas para ambos balanceadores de cargas.

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

En este ejemplo, supongamos que la dirección IP reservada es 34.98.77.106. La URL http://34.98.77.106/ se redirecciona a https://34.98.77.106/.

Después de unos minutos, puedes ejecutar el siguiente comando curl para probarla. Asegúrate de reemplazar 34.98.77.106 por la dirección IP reservada.

curl 34.98.77.106:80

Resultado de muestra:

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://34.98.77.106/">here</A>.
</BODY></HTML>

¿Qué sigue?