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 ofrecen opciones de configuración para diferentes situaciones.

En esta página se da por hecho que conoces el enmascaramiento de IP en Kubernetes.

Enmascaramiento IP de GKE

GKE puede usar el enmascaramiento de IP para cambiar las direcciones IP de origen de los paquetes enviados desde los pods. Cuando se aplica el enmascaramiento de IP a un paquete emitido por un pod, GKE cambia la dirección IP de origen del paquete de la dirección IP del pod a la dirección IP del nodo subyacente. La suplantación de la dirección IP de origen de un paquete es útil cuando un destinatario está configurado para recibir paquetes solo de las direcciones IP de los nodos del clúster.

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

No se admite el enmascaramiento de IP con los grupos de nodos de Windows Server.

Enmascaramiento de IP en 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 configuraciones de enmascaramiento de IP para clústeres de GKE estándar:

Configuración de clúster Comportamiento de 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 de los pods de origen de los paquetes enviados a los destinos especificados en la lista nonMasqueradeCIDRs.

GKE cambia las direcciones IP de los pods de origen por las direcciones IP de los nodos de origen de los paquetes enviados a destinos que no se especifican en la lista nonMasqueradeCIDRs.

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

GKE conserva las direcciones IP de los pods de origen de los paquetes enviados a un conjunto de destinos predeterminados sin enmascaramiento.

GKE cambia las direcciones IP de los pods de origen por las direcciones IP de los nodos de origen de los paquetes enviados a destinos que no son de enmascaramiento predeterminados.

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

GKE conserva las direcciones IP de los pods de origen de los paquetes enviados a un conjunto de destinos predeterminados sin enmascaramiento.

GKE cambia las direcciones IP de los pods de origen por las direcciones IP de los nodos de origen de los paquetes enviados a destinos que no son de enmascaramiento predeterminados.

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

GKE conserva las direcciones IP de los pods de origen de los paquetes enviados a todos los destinos.

Consulta Conservar la dirección IPv4 de los pods de origen a los destinos de Internet para ver consideraciones importantes sobre el enrutamiento cuando conserves las direcciones IPv4 de origen de los pods y necesites enrutar paquetes a Internet.

Enmascaramiento de IP en clústeres de Autopilot

En los clústeres de Autopilot, GKE siempre despliega un ip-masq-agent DaemonSet. Excepto en el caso de los paquetes enviados por pods a los intervalos de nodos, pods o servicios del clúster, puedes controlar el comportamiento de la suplantación de IP mediante un EgressNATPolicy. Para usar un EgressNATPolicy, tu clúster de Autopilot debe cumplir estos dos requisitos:

  • El clúster debe usar la versión 1.23.4-gke.1600 de GKE o una posterior, o la versión 1.22.7-gke.1500 o una 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 clústeres de GKE Autopilot:

Configuración de clústeres de Autopilot Comportamiento de SNAT resultante

El clúster incluye un EgressNATPolicy personalizado cuyo spec.action es NoSNAT, que contiene destinos no de enmascaramiento especificados en spec.destinations[].

GKE conserva las direcciones IP de los pods de origen de los paquetes enviados a los destinos especificados en spec.destinations[] de EgressNATPolicy. GKE lo consigue traduciendo spec.destinations[] en una lista nonMasqueradeCIDRs en un ip-masq-agent configMap.

GKE cambia las direcciones IP de los pods de origen por las direcciones IP de los nodos de origen de los paquetes enviados a destinos no especificados en spec.destinations[] de EgressNATPolicy.

El clúster no incluye un EgressNATPolicy personalizado.

Se aplican tanto la política EgressNATPolicy predeterminada como la política Gestionado por GKE, lo que da lugar al siguiente comportamiento:

  • GKE conserva las direcciones IP de los pods de origen de los paquetes enviados a un conjunto de destinos predeterminados sin enmascaramiento.
  • GKE cambia las direcciones IP de los pods de origen por las direcciones IP de los nodos de origen de los paquetes enviados a destinos que no son de enmascaramiento predeterminados.

Ejemplos de configuración

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

Referencia de configuración avanzada

Cuando la ip-masq-agent se implementa automáticamente

En los clústeres del modo Autopilot, GKE siempre despliega un ip-masq-agentDaemonSet.

En los clústeres estándar, GKE despliega un ip-masq-agent DaemonSet cuando la marca --disable-default-snat no está definida 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 intervalo de direcciones IP de pods que no se ajusta a 10.0.0.0/8.

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

Cuando hay un ip-masq-agent DaemonSet en un clúster, GKE actualiza y reconcilia un pod de servicio en cada nodo del clúster.

Destinos predeterminados sin enmascaramiento

Los destinos predeterminados sin enmascaramiento 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 pueden aplicar a clústeres con las siguientes configuraciones:

Los destinos predeterminados sin enmascaramiento no se pueden aplicar a clústeres con las siguientes configuraciones:

Efecto de la bandera --disable-default-snat

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

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

Puedes definir la marca --disable-default-snat actualizando un clúster después de que se haya creado. Siempre que el clúster no tenga ningún ip-masq-agent DaemonSet implementado, la inhabilitación de la SNAT predeterminada se aplicará después de que el clúster haya sustituido todos sus nodos, lo que puede tardar varias horas. Esto se debe a que GKE respeta las ventanas de mantenimiento que hayas configurado al sustituir nodos del clúster. Si no has configurado ninguna ventana de mantenimiento, debes reiniciar manualmente los nodos del clúster para que la marca --disable-default-snat tenga algún efecto.

Suplantación de identidad de enlace local

El intervalo 169.254.0.0/16 se usa para las direcciones IP locales con enlace. El enmascaramiento de enlace local consiste en cambiar la dirección IP de un pod de origen por la dirección IP de un 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 de los pods de origen de los paquetes enviados a destinos 169.254.0.0/16.

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

Para habilitar el enmascaramiento de IP de enlace local en un clúster estándar, debes hacer lo siguiente:

Contenedores de diagnóstico y pods con hostNetwork: true

A menos que especifiques una dirección IP de origen personalizada para los paquetes, los pods que se ejecuten con hostNetwork: true y los contenedores de diagnóstico enviarán paquetes con orígenes que coincidan con la dirección IP del nodo. En el caso de los pods que se ejecutan con hostNetwork: true, GKE asigna al pod la dirección IP del nodo. GKE no gestiona las direcciones IP de los contenedores de diagnóstico, incluidos los contenedores para depurar problemas de nodos con Toolbox.

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

Conservar las fuentes de direcciones IPv4 de los pods en los destinos de Internet

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

  • En los clústeres estándar con un ip-masq-agent DaemonSet, si has definido nonMasqueradeCIDRs como 0.0.0.0 en el ip-masq-agent ConfigMap.
  • En los clústeres estándar sin ip-masq-agent DaemonSet, si has definido la marca --disable-default-snat.
  • En los clústeres Autopilot, si edita el valor predeterminado de EgressNATPolicy de forma que spec.action sea NoSNAT y spec.destinations contenga Cidr: 0.0.0.0/0.

Las fuentes IPv4 de los pods son direcciones IPv4 internas, lo que significa que no se pueden enrutar en Internet. Por lo tanto, cuando conserves las direcciones IPv4 de los pods de origen para los paquetes enviados a Internet, tendrás que usar una técnica como una de las siguientes para enrutar los paquetes después de que salgan de los nodos del clúster:

  • Asegúrate de que tu red de VPC tenga una ruta predeterminada con el salto siguiente de la pasarela de Internet predeterminada y configura una pasarela Cloud NAT para proporcionar servicios NAT públicos a al menos los intervalos de direcciones IPv4 secundarias de la subred que usan los pods de tu clúster. Para obtener más información, consulta la sección Interacción con GKE del artículo sobre la descripción general de Cloud NAT.
  • Configura tu red de VPC para que use una ruta predeterminada personalizada cuyo siguiente salto sea una instancia de VM o un balanceador de carga de red interno de transferencia directa, donde la VM o los back-ends del balanceador de carga se hayan configurado para enrutar paquetes a Internet en nombre de los pods.

Restaurar el comportamiento predeterminado de SNAT

Para restaurar el comportamiento predeterminado de SNAT cuando hay un ip-masq-agent DaemonSet en un clúster, elimina el ip-masq-agent ConfigMap asociado. El DaemonSet ip-masq-agent restaura el comportamiento predeterminado de enmascaramiento de IP en los nodos que gestiona.

Para restaurar el comportamiento predeterminado de SNAT cuando no haya ningún DaemonSet ip-masq-agent en un clúster, tendrás que actualizar el grupo de nodos (asegúrate de que --disable-default-snat no esté definido en el clúster).

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

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

Por motivos de seguridad o de agotamiento de direcciones IP, puedes enmascarar las direcciones IP de los pods con el intervalo de direcciones IP de los nodos para el tráfico saliente a redes locales. Por ejemplo, puedes usar un intervalo que no sea RFC-1918 para los clústeres de Autopilot y un intervalo RFC-1918 para los nodos. Sin embargo, si los pods deben comunicarse con redes locales que también usan un intervalo que no es RFC 1918, las direcciones IP pueden superponerse. Para evitar la pérdida de tráfico, puedes configurar una política de NAT de salida para no anunciar los intervalos que no sean RFC-1918 de los pods a las redes on-premise. La política de NAT de salida enmascara el intervalo no RFC-1918 de los pods para usar el intervalo RFC-1918 del nodo. Asegúrate de que el intervalo de nodos no se solape con ningún intervalo local, ya que podría provocar un bucle de tráfico.

GKE aplica el comportamiento de enmascaramiento de IP en los clústeres de Autopilot mediante el siguiente proceso:

  1. GKE despliega el controlador de NAT de salida y el ip-masq-agent.
  2. Crea la política de NAT de salida.
  3. El controlador de GKE traduce la política a ip-masq-agent ConfigMap.
  4. El ip-masq-agent DaemonSet lee el ConfigMap y, a continuación, GKE aplica el comportamiento de enmascaramiento de IP.

Políticas generadas automáticamente

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

  • Valor predeterminado: estas políticas se pueden editar.
  • Gestionadas por GKE: estas políticas son fijas y no se pueden editar.

Política predeterminada

GKE predefine un conjunto de intervalos de direcciones IP predeterminados. Cuando se envían paquetes a estos destinos, tu clúster no enmascara las fuentes de direcciones IP y conserva las direcciones IP de los pods de origen. Para cambiar estos intervalos de direcciones IP predeterminados, consulta Editar e implementar la política de NAT de salida.

El siguiente manifiesto 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 intervalos de CIDR son los mismos que los intervalos de destino predeterminados sin enmascaramiento.

Gestionado por la política de GKE

La política de NAT de salida de GKE reserva un intervalo estático de direcciones IP necesarias para mantener el funcionamiento del clúster. Este intervalo estático contiene los intervalos de direcciones IP de los pods, los servicios y los nodos del clúster, y puede solaparse con la política predeterminada.

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

El siguiente manifiesto describe una política gestionada 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>

Siguientes pasos