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

El enmascaramiento de IP es una forma de traducción de direcciones de red de origen (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 estándar

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 los clústeres de GKE estándar:

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

El DaemonSet ip-masq-agent está presente en el clúster, y existe una lista nonMasqueradeCIDRs personalizada en el ConfigMap 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 dirección IPv4 de Pod a los destinos de Internet para obtener consideraciones de enrutamiento importantes cuando conservas las direcciones de origen IPv4 del 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 de ip-masq-agent. Excepto por los paquetes enviados por los pods al rango de nodos, pod 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 estos requisitos:

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

En la siguiente tabla, se resumen las configuraciones de enmascaramiento de IP para los clústeres de GKE Autopilot:

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

El clúster incluye un EgressNATPolicy personalizado cuyo spec.action es NoSNAT que 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. GKE logra esto mediante la traducción de spec.destinations[] en 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 un EgressNATPolicy personalizado.

Se aplican las EgressNATPolicy predeterminadas 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 enmascaramiento de IP y configuración 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 modo Autopilot, GKE siempre implementa un DaemonSet de 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

El destino predeterminado sin enmascarar es el siguiente:

  • 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 las siguientes configuraciones:

Los destinos predeterminados sin enmascarar no se aplican a los clústeres con las siguientes configuraciones:

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 configurar 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 tus períodos de mantenimiento configurados cuando reemplazan nodos en el clúster. Si no configuraste ningún período de mantenimiento, debes completar un ciclo de los nodos en el clúster de forma manual antes de que la marca --disable-default-snat tenga efecto.

Enmascaramiento local de vínculos

El rango 169.254.0.0/16 se usa para las direcciones IP de vínculo local. El enmascaramiento de vínculo local 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 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 las direcciones IP para los contenedores de diagnóstico, incluidos los contenedores de depuración de 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 dirección IP de los Pods 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 de IPv4 de Pods 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.

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 rangos 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 NAT de salida generadas de forma automática:

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