Configurar una pasarela de NAT de salidas

En este documento se describe cómo configurar una pasarela de NAT de salida para Google Distributed Cloud. Esta pasarela proporciona direcciones IP de SNAT persistentes y deterministas para el tráfico de salida de tus clústeres. Cuando ejecutas cargas de trabajo que tienen tráfico de usuarios de salida (fuera de tus clústeres), tus clientes quieren identificar este tráfico mediante algunas direcciones IP deterministas. Esto permite a tus clientes establecer medidas de seguridad basadas en IP, como políticas de listas de permitidas.

Esta página está dirigida a especialistas en redes que diseñan y desarrollan la red de su organización, así como instalan, configuran y ofrecen asistencia para los equipos de red. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido de Google Cloud , consulta Roles y tareas de usuario habituales de GKE.

La pasarela de NAT de salida se habilita mediante dos recursos personalizados. En un espacio de nombres determinado, el recurso personalizado NetworkGatewayGroup especifica las direcciones IP flotantes que se pueden configurar en la interfaz de red de un nodo que se elija para actuar como pasarela. El recurso personalizado EgressNatPolicy te permite especificar políticas de enrutamiento de salida para controlar el tráfico en la puerta de enlace de salida.

Si no configura una pasarela NAT de salida o si el tráfico de salida no cumple las reglas de selección de tráfico, el tráfico de salida de un pod determinado a un destino fuera del clúster se enmascarará con la dirección IP del nodo en el que se esté ejecutando el pod. En este caso, no hay ninguna garantía de que todo el tráfico de salida de un pod concreto tenga la misma dirección IP de origen o se enmascare con la misma dirección IP de nodo.

La pasarela NAT de salida es una oferta de redes avanzadas basada en Dataplane V2.

Cómo funciona la pasarela de NAT de salida

La lógica de selección del tráfico de salida se basa en un selector de espacio de nombres, un selector de pods y un conjunto de intervalos de direcciones IP de destino en notación de bloque CIDR. Para ilustrar cómo funciona la pasarela de NAT de salida, vamos a analizar el flujo de un paquete de un pod a un consumidor externo y la respuesta correspondiente. Supongamos que la subred de nodos tiene direcciones IP en el bloque CIDR 192.168.1.0/24.

En el siguiente diagrama se muestra la arquitectura de red del tráfico de salida a través de un nodo de pasarela.

Diagrama de la pasarela de NAT de salida de Google Distributed Cloud

El flujo de paquetes a través de la pasarela de NAT de salida podría ser el siguiente:

  1. El tráfico de salida se genera desde un pod con la dirección IP 10.10.10.1 en un nodo con la dirección IP 192.168.1.1.

    La dirección de destino del tráfico es un endpoint fuera del clúster.

  2. Si el tráfico coincide con una regla de salida, el programa eBPF lo dirige al nodo de la pasarela en lugar de enmascararlo directamente con la dirección IP del nodo.

  3. El nodo de la pasarela recibe el tráfico de salida.

  4. El nodo de la pasarela enmascara la dirección IP de origen del tráfico de origen, 10.10.10.1, con la dirección IP de salida de origen, 192.168.1.100, especificada en el recurso personalizado EgressNATPolicy.

  5. El tráfico de retorno vuelve al nodo de la pasarela con el destino 192.168.1.100.

  6. El nodo de la pasarela hace coincidir el conntrack del tráfico de retorno con el del tráfico de salida original y reescribe la dirección IP de destino como 10.10.10.1.

  7. 10.10.10.1 se trata como tráfico dentro del clúster, se enruta al nodo original y se devuelve al pod original.

Configurar direcciones IP flotantes para el tráfico de nodos

El recurso personalizado NetworkGatewayGroup es un componente incluido de Google Distributed Cloud. El recurso gestiona una lista de una o más direcciones IP flotantes que se usan para el tráfico de salida de los nodos de tu clúster. Los nodos participantes se determinan mediante el espacio de nombres especificado. El grupo de pasarelas de red hace que una dirección IP flotante esté disponible en todo momento con el mejor esfuerzo posible. Si un nodo que usa una dirección IP flotante deja de funcionar, el operador de red avanzado mueve la dirección IP asignada al siguiente nodo disponible. Todo el tráfico de salida de la carga de trabajo que utilice esa dirección IP también se moverá.

Incluya los detalles del grupo de la puerta de enlace de red (anotación y especificación) en el archivo de configuración del clúster al crear un clúster 1.33.100-gke.89.

Crea el recurso personalizado NetworkGatewayGroup.

Para habilitar Network Gateway Group, defina el campo spec.clusterNetwork.advancedNetworking en true en el archivo de configuración del clúster al crear un clúster, tal como se muestra en el siguiente ejemplo:

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
spec:
  clusterNetwork:
    ...
    advancedNetworking: true
    ...

Cuando cree el recurso personalizado NetworkGatewayGroup, defina su espacio de nombres como el espacio de nombres del clúster y especifique una lista de direcciones IP flotantes, tal como se muestra en el siguiente ejemplo:

kind: NetworkGatewayGroup
apiVersion: networking.gke.io/v1
metadata:
  namespace: cluster-cluster1
  name: default
spec:
  floatingIPs:
  - 192.168.1.100
  - 192.168.1.101
  - 192.168.1.102

El operador de redes avanzadas asigna las IPs flotantes a los nodos en función de los siguientes criterios:

  • Subred del nodo: la dirección IP flotante debe coincidir con la subred del nodo.
  • Rol del nodo (plano de control, trabajador): los nodos de trabajador tienen prioridad sobre los nodos del plano de control a la hora de asignar direcciones IP flotantes.
  • Si un nodo tiene una dirección IP flotante, el operador prioriza las asignaciones a los nodos que aún no tienen una dirección IP flotante asignada.

La asignación de direcciones o nodos se encuentra en la sección status cuando obtienes el objeto NetworkGatewayGroup. Ten en cuenta que el objeto NetworkGatewayGroup está en el espacio de nombres kube-system. Si un nodo de pasarela no funciona, el operador de red avanzado asigna las direcciones IP flotantes al siguiente nodo disponible.

Verificar la configuración de la pasarela

Una vez que hayas aplicado los cambios en la configuración de la pasarela, puedes usar kubectl para comprobar el estado de la pasarela y recuperar las direcciones IP flotantes especificadas para la pasarela.

  1. Usa el siguiente comando para comprobar el estado de NetworkGatewayGroup y ver cómo se asignan las direcciones IP flotantes:

    kubectl -n kube-system get networkgatewaygroups.networking.gke.io default -o yaml

    La respuesta de un clúster con dos nodos, worker1 y worker2, podría tener este aspecto:

    kind: NetworkGatewayGroup
    apiVersion: networking.gke.io/v1
    metadata:
      namespace: kube-system
      name: default
    spec:
      floatingIPs:
      - 192.168.1.100
      - 192.168.1.101
      - 192.168.1.102
    status:
      nodes:
        worker1: Up
        worker2: Up // Or Down
      floatingIPs:
        192.168.1.100: worker1
        192.168.1.101: worker2
        192.168.1.102: worker1
    

Definir reglas de selección de tráfico

El recurso personalizado EgressNATPolicy especifica reglas de selección de tráfico y asigna una dirección IP determinista al tráfico de salida que abandona el clúster. Cuando especifique el recurso personalizado, deberá incluir egress (con al menos una regla), destinationCIDRs y egressSourceIP.

Usa kubectl apply para crear el EgressNATPolicy recurso personalizado. En las siguientes secciones se proporcionan detalles y ejemplos para definir la especificación.

Especificar reglas de enrutamiento de salida

El recurso personalizado EgressNatPolicy te permite especificar las siguientes reglas para el tráfico de salida:

  • Debe especificar una o varias reglas de selección de tráfico de salida en la sección egress.

    • Cada regla consta de un podSelector y un namespaceSelector.
    • La selección se basa en una etiqueta de espacio de nombres, namespaceSelector.matchLabels.user, y una etiqueta de pod, podSelector.matchLabels.role.
    • Si un pod coincide con alguna de las reglas (la coincidencia usa una relación OR), se selecciona para el tráfico de salida.
  • Especifique las direcciones de destino permitidas en la sección destinationCIDRs.

    • destinationCIDRs toma una lista de bloques CIDR.
    • Si el tráfico saliente de un pod tiene una dirección IP de destino que se encuentra dentro del intervalo de cualquiera de los bloques CIDR especificados, se selecciona para el tráfico de salida.

En el siguiente ejemplo, se permite el tráfico de salida de un pod cuando se cumplen los siguientes criterios:

  • El pod tiene la etiqueta role: frontend.
  • El pod está en un espacio de nombres etiquetado como user: alice o user: paul.
  • El pod se comunica con direcciones IP del bloque CIDR 8.8.8.0/24.
kind: EgressNATPolicy
apiVersion: networking.gke.io/v1
metadata:
  name: egress
spec:
  sources:
  - namespaceSelector:
      matchLabels:
        user: alice
    podSelector:
      matchLabels:
        role: frontend
  - namespaceSelector:
      matchLabels:
        user: paul
    podSelector:
      matchLabels:
        role: frontend
  action: SNAT
  destinations:
    - cidr: 8.8.8.0/24
  gatewayRef:
    name: default
    namespace: kube-system

Para obtener más información sobre el uso de etiquetas, consulta el artículo Etiquetas y selectores de la documentación de Kubernetes.

Obtener una dirección IP de origen para el tráfico de salida

El recurso personalizado EgressNATPolicy (política) usa los valores gatewayRef.name y gatewayRef.namespace para encontrar un objeto NetworkGatewayGroup (gateway). La política usa una de las direcciones IP flotantes de la pasarela como dirección IP de origen del tráfico de salida. Si hay varias direcciones IP flotantes en la pasarela coincidente, la política utiliza la primera dirección IP de la lista floatingIPs e ignora las demás. En el caso de la pasarela de ejemplo, la primera dirección de la lista floatingIPs es 192.168.1.100. Si hay campos o valores no válidos en la sección gatewayRef, no se podrá aplicar el objeto de la política.

Varias políticas de salida y varios objetos de pasarela

Como se ha descrito en la sección anterior, cada objeto egressNATPolicy (política) usa la primera dirección IP de la lista floatingIPs del objeto de pasarela que coincida con gatewayRef.name y gatewayRef.namespace. Puedes crear varias políticas y, si tienes intención de usar diferentes direcciones IP, debes crear varios objetos NetworkGatewayGroup y hacer referencia a ellos respectivamente.

Cada recurso NetworkGatewayGroup debe contener direcciones IP flotantes únicas. Para configurar varios objetos EgressNATPolicy de forma que usen la misma dirección IP, utiliza el mismo gatewayRef.name y gatewayRef.namespace para ambos.

Para configurar varias políticas de salida y varios objetos de pasarela, sigue estos pasos:

  1. Crea objetos de pasarela en el espacio de nombres kube-system para gestionar cada dirección IP flotante. Por lo general, cada política de salida debe tener un objeto de pasarela correspondiente para asegurarse de que se asigne la dirección IP correcta.

    A continuación, verifica cada objeto de pasarela con kubectl para obtener el estado de asignación de las direcciones IP flotantes:

    kind: NetworkGatewayGroup
    apiVersion: networking.gke.io/v1
    metadata:
      namespace: kube-system
      name: gateway1
    spec:
      floatingIPs:
      - 192.168.1.100
    status:
      ...
      floatingIPs:
        192.168.1.100: worker1
    ---
    kind: NetworkGatewayGroup
    apiVersion: networking.gke.io/v1
    metadata:
      namespace: kube-system
      name: gateway2
    spec:
      floatingIPs:
      - 192.168.1.101
    status:
      ...
      floatingIPs:
        192.168.1.101: worker2
    ---
    kind: NetworkGatewayGroup
    apiVersion: networking.gke.io/v1
    metadata:
      namespace: kube-system
      name: gateway3
    spec:
      floatingIPs:
      - 192.168.1.102
    status:
      ...
      floatingIPs:
        192.168.1.102: worker1
    
  2. Crea varias políticas que hagan referencia a los objetos de la pasarela, como gateway1, que se ha creado en el paso anterior:

    kind: EgressNATPolicy
    apiVersion: networking.gke.io/v1
    metadata:
      name: egress1
    spec:
      ...
      gatewayRef:
        name: gateway1
        namespace: kube-system
    ---
    kind: EgressNATPolicy
    apiVersion: networking.gke.io/v1
    metadata:
      name: egress2
    spec:
      ...
      gatewayRef:
        name: gateway2
        namespace: kube-system
    ---
    kind: EgressNATPolicy
    apiVersion: networking.gke.io/v1
    metadata:
      name: egress3
    spec:
      ...
      gatewayRef:
        name: gateway3
        namespace: kube-system
    

(Opcional) Especificar los nodos en los que se colocarán las direcciones IP flotantes

NetworkGatewayGroup recursos admiten selectores de nodos. Para especificar un subconjunto de nodos que se tienen en cuenta para alojar una dirección IP flotante, puedes añadir el selector de nodos al objeto NetworkGatewayGroup, tal como se muestra en el siguiente ejemplo:

kind: NetworkGatewayGroup
apiVersion: networking.gke.io/v1
metadata:
  namespace: cluster-cluster1
  name: default
spec:
  floatingIPs:
  - 192.168.1.100
  - 192.168.1.101
  - 192.168.1.102
  nodeSelector:
    node-type: "egressNat"

El selector de nodos coincide con los nodos que tienen la etiqueta especificada y solo se tienen en cuenta estos nodos para alojar una dirección IP flotante. Si especificas varios selectores, su lógica es aditiva, por lo que un nodo debe coincidir con cada etiqueta para que se tenga en cuenta a la hora de alojar una dirección IP flotante. Si no hay muchos nodos con etiquetas coincidentes, un selector de nodos puede reducir las cualidades de alta disponibilidad (HA) de la colocación de direcciones IP flotantes.

Reglas de selección de tráfico de salida y políticas de red

La pasarela de NAT de salida es compatible con las APIs de políticas de red. Las políticas de red se evalúan primero y tienen prioridad sobre las reglas de selección de tráfico de la pasarela de NAT de salida. Por ejemplo, si el tráfico de salida activa una política de red que provoca que se descarte el paquete, las reglas de la puerta de enlace de salida no comprobarán el paquete. Solo cuando la política de red permita que el paquete salga, se evaluarán las reglas de selección de tráfico de salida para decidir cómo se gestiona el tráfico, ya sea mediante la pasarela NAT de salida o mediante el enmascaramiento directo con la dirección IP del nodo en el que se ejecuta el pod.

Limitaciones

Estas son las limitaciones actuales de la pasarela de NAT de salida:

  • La pasarela NAT de salida solo está habilitada para el modo IPv4.

  • Las direcciones IP de salida deben estar en el mismo dominio de capa 2 que las direcciones IP de los nodos.