Agente de enmascaramiento de IP


En esta página, se explica cómo funciona el enmascaramiento de IP en Google Kubernetes Engine (GKE) y se proporcionan opciones de configuración para diferentes situaciones.

Descripción general del enmascaramiento de IP

masquerading de IP es una forma de traducción de direcciones de red (SNAT) que realiza traducciones de direcciones IP de muchos a uno. GKE puede usar el enmascaramiento de IP para cambiar las direcciones IP de origen de los paquetes que se envían desde los Pods.

Si quieres obtener una descripción general más general del enmascaramiento de IP en cualquier implementación de Kubernetes, consulta la guía del usuario del agente de enmascaramiento de IP.

Enmascaramiento de IP de GKE

Cuando el enmascaramiento de IP se aplica a un paquete emitido por un Pod, GKE cambia la dirección IP de origen del paquete de la IP del Pod a la dirección IP del nodo subyacente. Enmascarar la dirección IP de origen de un paquete es útil cuando un destinatario está configurado para recibir paquetes solo de las direcciones IP del nodo del clúster.

En los nodos de Linux, GKE configura reglas de iptables. GKE usa el DaemonSet ip-masq-agent para configurar el plano de datos adecuado.

El enmascaramiento de IP no es compatible con los grupos de nodos de Windows Server.

Enmascaramiento de IP para clústeres de Standard

En los clústeres estándar, el comportamiento de enmascaramiento de IP del clúster se rige por tres factores:

En la siguiente tabla, se resumen las opciones de configuración de enmascaramiento de IP para clústeres de GKE Standard:

Configuración del clúster Comportamiento resultante de la SNAT

El DaemonSet ip-masq-agent está presente en el clúster, y existe una lista nonMasqueradeCIDRs personalizada en el ConfigMap de ip-masq-agent.

GKE conserva las direcciones IP del Pod de origen para los paquetes enviados a los destinos especificados en la lista de nonMasqueradeCIDRs.

GKE cambia las direcciones IP del Pod de origen por las direcciones IP del nodo de origen para los paquetes enviados a destinos no especificados en la lista de nonMasqueradeCIDRs.

El DaemonSet ip-masq-agent está presente en el clúster, pero una lista nonMasqueradeCIDRs personalizada no existe en el ConfigMap ip-masq-agent o el ConfigMap de ip-masq-agent no está presente.

GKE conserva las direcciones IP del Pod de origen para los paquetes enviados a un conjunto de destinos predeterminados sin enmascarar.

GKE cambia las direcciones IP del Pod de origen por las direcciones IP de nodo de origen para los paquetes enviados a destinos fuera de los destinos predeterminados sin enmascarar.

El DaemonSet ip-masq-agent no está presente en el clúster, y creaste el clúster sin la marca --disable-default-snat.

GKE conserva las direcciones IP del Pod de origen para los paquetes enviados a un conjunto de destinos predeterminados sin enmascarar.

GKE cambia las direcciones IP del Pod de origen por las direcciones IP de nodo de origen para los paquetes enviados a destinos fuera de los destinos predeterminados sin enmascarar.

El DaemonSet ip-masq-agent no está presente en el clúster, y creaste el clúster con la marca --disable-default-snat.

GKE conserva las direcciones IP del Pod de origen para los paquetes enviados a todos los destinos.

Revisa Preserva las fuentes de direcciones IPv4 del Pod a los destinos de Internet para obtener consideraciones de enrutamiento importantes cuando conservas las direcciones de origen IPv4 de Pod y necesitas enrutar paquetes a Internet.

Enmascaramiento de IP para clústeres de Autopilot

En los clústeres de Autopilot, GKE siempre implementa un DaemonSet ip-masq-agent. Excepto por los paquetes que envían los Pods a los rangos de nodos, Pods o servicios del clúster, puedes controlar el comportamiento de enmascaramiento de IP con un EgressNATPolicy. Para usar un EgressNATPolicy, tu clúster de Autopilot debe cumplir con los siguientes requisitos:

  • El clúster debe usar la versión 1.23.4-gke.1600 de GKE o una posterior, o 1.22.7-gke.1500 o posterior.
  • El clúster se debe haber creado con GKE Dataplane V2 habilitado.

En la siguiente tabla, se resumen las opciones de configuración de enmascaramiento de IP para los clústeres de GKE de Autopilot:

Configuración del clúster de Autopilot Comportamiento resultante de la SNAT

El clúster incluye una EgressNATPolicy personalizada cuyo spec.action es NoSNAT y contiene destinos sin enmascarar especificados en spec.destinations[].

GKE conserva las direcciones IP del Pod de origen para los paquetes enviados a los destinos especificados en spec.destinations[] de EgressNATPolicy. Para lograrlo, GKE traduce spec.destinations[] a una lista nonMasqueradeCIDRs en un configMap ip-masq-agent.

GKE cambia las direcciones IP del Pod de origen por las direcciones IP del nodo de origen para los paquetes enviados a destinos no especificados en spec.destinations[] de EgressNATPolicy.

El clúster no incluye una EgressNATPolicy personalizada.

Se aplican la política predeterminada EgressNATPolicy y la política administrada por GKE, lo que da como resultado el siguiente comportamiento:

  • GKE conserva las direcciones IP del Pod de origen para los paquetes enviados a un conjunto de destinos predeterminados sin enmascarar.
  • GKE cambia las direcciones IP del Pod de origen por las direcciones IP de nodo de origen para los paquetes enviados a destinos fuera de los destinos predeterminados sin enmascarar.

Ejemplos de configuración

Expande las siguientes secciones para ver ejemplos de configuración y enmascaramiento de IP según el tipo de clúster.

Referencia de configuración avanzada

Cuando ip-masq-agent se implementa de forma automática

En los clústeres de Autopilot, GKE siempre implementa un DaemonSet ip-masq-agent.

En los clústeres estándar, GKE implementa un DaemonSet ip-masq-agent cuando la marca --disable-default-snat no está configurada y el clúster usa una de las siguientes combinaciones de configuración:

  • El clúster no usa GKE Dataplane V2 y la aplicación de la política de red está habilitada.

  • El clúster usa un rango de direcciones IP de Pod que no se ajusta a 10.0.0.0/8.

Para que el DaemonSet ip-masq-agent sea eficaz, también debes especificar la lista nonMasqueradeCIDRs en el ConfigMap de ip-masq-agent. Para obtener más información, consulta cómo configurar un agente de enmascaramiento de IP.

Cuando un DaemonSet ip-masq-agent está presente en un clúster, GKE actualiza y concilia un Pod de entrega en cada nodo del clúster.

Destinos predeterminados sin enmascarar

Los destinos predeterminados sin enmascarar son los siguientes:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16
  • 100.64.0.0/10
  • 192.0.0.0/24
  • 192.0.2.0/24
  • 192.88.99.0/24
  • 198.18.0.0/15
  • 198.51.100.0/24
  • 203.0.113.0/24
  • 240.0.0.0/4

Los destinos predeterminados sin enmascarar se aplican a los clústeres con la siguiente configuración:

Los destinos predeterminados sin enmascarar no se aplican a los clústeres con la siguiente configuración:

Efecto de la marca --disable-default-snat

La marca --disable-default-snat cambia el comportamiento predeterminado de GKE SNAT para que las direcciones IP de Pod de origen se conserven para los paquetes enviados a todos los destinos. GKE implementa el comportamiento de SNAT predeterminado sin implementar ningún DaemonSet ip-masq-agent en el clúster.

La marca --disable-default-snat no tiene efecto cuando un clúster incluye un DaemonSet ip-masq-agent:

  • Debido a que los clústeres de Autopilot siempre incluyen un DaemonSet ip-masq-agent, la marca --disable-default-snat no tiene efecto en los clústeres de Autopilot.

Para establecer la marca --disable-default-snat, actualiza un clúster después de crearlo. Siempre que el clúster no tenga un DaemonSet ip-masq-agent implementado, se inhabilita la SNAT predeterminada después de que el clúster haya reemplazado todos sus nodos, a veces horas después. Esto se debe a que GKE respeta los períodos de mantenimiento configurados cuando reemplaza los nodos en el clúster. Si no configuraste ningún período de mantenimiento, debes reiniciar de forma manual los nodos del clúster antes de que la marca --disable-default-snat tenga efecto.

Enmascaramiento de vínculo local

El rango 169.254.0.0/16 se usa para las direcciones IP de vínculo local. El enmascaramiento de vínculos locales hace referencia al cambio de una dirección IP de Pod de origen a una dirección IP de nodo de origen para los paquetes enviados a los destinos de 169.254.0.0/16.

Los clústeres de Autopilot siempre conservan las direcciones IP del Pod de origen para los paquetes enviados a destinos 169.254.0.0/16.

De forma predeterminada, los clústeres estándar también conservan las direcciones IP del Pod de origen para los paquetes enviados a destinos 169.254.0.0/16.

Para habilitar el enmascaramiento de IP de vínculo local en un clúster estándar, haz lo siguiente:

Pods y contenedores de diagnóstico con hostNetwork: true

A menos que especifiques una dirección IP de origen personalizada para los paquetes, los Pods que se ejecutan con hostNetwork: true y los contenedores de diagnóstico envían paquetes con fuentes que coinciden con la dirección IP del nodo. En los Pods que se ejecutan con hostNetwork: true, GKE asigna al Pod la dirección IP del nodo. GKE no administra direcciones IP para contenedores de diagnóstico, incluidos los contenedores para depurar problemas de nodos mediante la caja de herramientas.

Los clústeres de Autopilot no admiten la ejecución de Pods con spec.hostNetwork: true. Debido a que no se puede acceder a los nodos de un clúster de Autopilot mediante SSH, no puedes ejecutar contenedores de diagnóstico en ellos.

Preserva las fuentes de dirección IPv4 del Pod a los destinos de Internet

Si la configuración de enmascaramiento de IP de tu clúster es una de las siguientes opciones, GKE conserva las fuentes de direcciones IP del Pod para los paquetes enviados a todos los destinos, incluidos los de Internet:

  • En clústeres estándar con un DaemonSet ip-masq-agent, si configuraste nonMasqueradeCIDRs en 0.0.0.0 en el ConfigMap ip-masq-agent.
  • En clústeres estándar sin un DaemonSet ip-masq-agent, si configuraste la marca --disable-default-snat.

En los clústeres públicos y privados, las fuentes IPv4 de Pod son direcciones IPv4 internas, lo que significa que no se pueden enrutar en Internet. Por lo tanto, cuando conservas las direcciones IPv4 del Pod de origen para los paquetes enviados a Internet, debes usar una técnica como una de las siguientes para enrutar paquetes después de que salgan de los nodos del clúster:

  • Asegúrate de que la red de VPC tenga una ruta predeterminada con el siguiente salto de la puerta de enlace de Internet predeterminada y configura una puerta de enlace de Cloud NAT para proporcionar servicios NAT al menos a los rangos de direcciones IPv4 secundarios de la subred que usan los Pods el clúster. Para obtener más detalles, consulta Interacción de GKE en la descripción general de Cloud NAT.
  • Configura la red de VPC para usar una ruta predeterminada personalizada cuyo siguiente salto sea una instancia de VM o un balanceador de cargas de red interno, en el que la VM o los backends del balanceador de cargas están configurados para enrutar paquetes a Internet en nombre de los Pods.

Cómo restablecer el comportamiento predeterminado de SNAT

Para restablecer al comportamiento de SNAT predeterminado cuando hay un DaemonSet ip-masq-agent presente en un clúster, borra el ConfigMap de ip-masq-agent asociado. El DaemonSet ip-masq-agent restablece el comportamiento predeterminado de enmascaramiento de IP en los nodos que administra.

Para restablecer el comportamiento predeterminado de SNAT cuando un DaemonSet ip-masq-agent no está presente en un clúster, deberás actualizar el grupo de nodos (asegúrate de que --disable-default-snat no esté configurado en el clúster).

Efecto de la política de NAT de salida en los clústeres Autopilot

La política de NAT de salida de GKE te permite configurar el enmascaramiento de IP en clústeres Autopilot. Puedes usar la definición de recurso personalizado (CRD) de la política de salida de GKE para cambiar las direcciones IP de origen de los paquetes que se envían desde los Pods.

Por razones de seguridad o de agotamiento de direcciones IP, puedes enmascarar direcciones IP de Pods a un rango de direcciones IP de nodos para el tráfico saliente a redes locales. Por ejemplo, puedes usar un rango que no sea RFC-1918 en clústeres Autopilot y usar un rango RFC-1918 para los nodos. Sin embargo, si los Pods deben comunicarse con redes locales que también usen rangos que no son RFC-1918, las direcciones IP pueden superponerse. Para evitar la pérdida de tráfico, puedes configurar una política de NAT de salida a fin de no anunciar los rangos de Pods que no son RFC-1918 en redes locales. La política de NAT de salida enmascara el rango que no es RFC-1918 de los Pods para usar el rango RFC-1918 del nodo en su lugar. Asegúrate de que un rango de nodos no se superponga con ningún rango local, ya que puede causar un bucle de tráfico.

GKE aplica el comportamiento de enmascaramiento de IP para los clústeres Autopilot a través del siguiente proceso:

  1. GKE implementa el controlador de NAT de salida y el ip-masq-agent.
  2. Creas la política de NAT de salida.
  3. El controlador de GKE traduce la política en el ConfigMap de ip-masq-agent.
  4. El DaemonSet ip-masq-agent lee el ConfigMap y, luego, GKE aplica el comportamiento de enmascaramiento de IP.

Políticas generadas de forma automática

GKE admite las siguientes dos políticas de NAT de salida generadas automáticamente:

  • Predeterminadas: Estas políticas se pueden editar.
  • Administradas por GKE: Estas políticas son fijas y no se pueden editar.

Política predeterminada

GKE predefine un conjunto de rangos de direcciones IP predeterminados. Cuando se envían paquetes a estos destinos, tu clúster no enmascara las fuentes de las direcciones IP y conserva las direcciones IP del Pod de origen. Para cambiar estos rangos de direcciones IP predeterminados, consulta Edita e implementa la política de NAT de salida.

En el siguiente manifiesto, se describe una política de NAT de salida predeterminada:

    Name:         default
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         EgressNATPolicy
    Metadata:
      Creation Timestamp:  2022-03-16T21:05:45Z
      Generation:          2
      Managed Fields:
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            .:
            f:action:
          f:status:
        Manager:      egress-nat-controller
        Operation:    Update
        Time:         2022-03-16T21:05:45Z
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            f:destinations:
        Manager:         kubectl
        Operation:       Update
        Time:            2022-03-17T01:58:13Z
      Resource Version:  189346
      UID:               06acbb5a-23ba-4c2a-bb34-9b6ed8c4a87f
    Spec:
      Action:  NoSNAT
      Destinations:
        Cidr:  10.0.0.0/8
        Cidr:  172.16.0.0/12
        Cidr:  192.168.0.0/16
        Cidr:  240.0.0.0/4
        Cidr:  192.0.2.0/24
        Cidr:  198.51.100.0/24
        Cidr:  203.0.113.0/24
        Cidr:  100.64.0.0/10
        Cidr:  198.18.0.0/15
        Cidr:  192.0.0.0/24
        Cidr:  192.88.99.0/24
    Status:
    Events:  <none>

Los rangos CIDR son los mismos que los rangos de destino predeterminados sin enmascarar.

Política administrada por GKE

La política de NAT de salida de GKE reserva un rango estático de direcciones IP necesarias para preservar el funcionamiento del clúster. Este rango estático contiene los rangos de direcciones IP del Pod, del Service y del nodo del clúster y puede superponerse con la política predeterminada.

Puedes identificar esta política mediante un hash dinámico de 8 bytes (gke-{CLUSTER_SHORT_HASH}) que GKE asigna. No puedes editar esta política.

En el siguiente manifiesto, se describe una política administrada por GKE llamada gke-bbfa6c0e-1:

    Name:         gke-bbfa6c0e-1
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         EgressNATPolicy
    Metadata:
      Creation Timestamp:  2022-03-16T21:05:46Z
      Generation:          1
      Managed Fields:
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            .:
            f:action:
            f:destinations:
          f:status:
        Manager:         egress-nat-controller
        Operation:       Update
        Time:            2022-03-16T21:05:46Z
      Resource Version:  11699
      UID:               0201b5de-a6f6-4926-822b-31ed7cdee2c6
    Spec:
      Action:  NoSNAT
      Destinations:
        Cidr:  10.119.128.0/17
        Cidr:  10.120.0.0/22
        Cidr:  10.128.0.0/20
    Status:
    Events:  <none>

¿Qué sigue?