Agente de enmascaramiento de IP

En esta página, se explica cómo funciona el agente de enmascaramiento de IP de Google Kubernetes Engine.

Descripción general

masquerading de IP es una forma de traducción de direcciones de red (NAT) que se usa para realizar traducciones de direcciones IP de muchos a uno. Masquerading enmascara múltiples direcciones IP de origen en una sola dirección.

El uso de masquerading de IP en tus clústeres puede aumentar tu seguridad, ya que se evita que las direcciones IP de Pod individuales se expongan al tráfico fuera del rango de vínculo local(169.254.0.0/16) y rangos de IP arbitrarios adicionales.

Además, el masquerading de IP te permite configurar la comunicación entre rangos de IP sin enmascaramiento, como pods en el rango 192.168.0.0/16 que interactúan con los recursos de red en el rango CIDR (10.0.0.0/8).

Antes de comenzar

Sigue estos pasos a fin de prepararte para esta tarea:

  • Asegúrate de haber habilitado la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Asegúrate de haber instalado el SDK de Cloud.
  • Establece tu ID del proyecto predeterminado:
    gcloud config set project [PROJECT_ID]
  • Si trabajas con clústeres zonales, establece tu zona de procesamiento predeterminada:
    gcloud config set compute/zone [COMPUTE_ZONE]
  • Si trabajas con clústeres regionales, establece tu región de procesamiento predeterminada:
    gcloud config set compute/region [COMPUTE_REGION]
  • Actualiza gcloud a la versión más reciente:
    gcloud components update

Cómo funciona ip-masq-agent

Masquerading de IP en GKE se controla con la herramienta ip-masq-agent. ip-masq-agent se habilita de forma automática en GKE v1.7 y superior cuando se cumple una o más de las siguientes condiciones adicionales:

  • El clúster tiene una política de red.
  • El rango CIDR del Pod no está dentro de 10.0.0.0/8

Si tu clúster usa GKE v1.7 o superior, pero no cumple con las otras condiciones para que ip-masq-agent se habilite de forma automática, puedes crear el agente de manera manual.

ip-masq-agent configura las reglas iptables para controlar el masquerading de direcciones IP de nodo/pod cuando se envía el tráfico a destinos fuera de los rangos de IP del nodo y del clúster. Las direcciones IP del pod están enmascaradas detrás de la dirección de tu nodo.

Según la configuración predeterminada, el agente está configurado para tratar los tres rangos de IP privados especificados por RFC 1918 como CIDRs sin enmascarar:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16

Según la configuración predeterminada, masquerading de IP también trata el rango de vínculo local (169.254.0.0/16) como un CIDR sin enmascaramiento.

Según la configuración predeterminada, el agente vuelve a cargar su archivo de configuración desde el archivo /etc/config/ip-masq-agent en su contenedor cada 60 segundos.

A continuación, se muestra el conjunto predeterminado de reglas iptables aplicadas por ip-masq-agent:

iptables -t nat -L IP-MASQ
RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             172.16.0.0/12        /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             192.168.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL

Para la versión GKE 1.14.1-gke.14, 1.14.2-gke.1 o superior, GKE implementa ip-masq-agent con la opción --nomasq-all-reserved-ranges habilitada de forma predeterminada. Esta opción agrega los siguientes rangos de IP a las reglas sin enmascaramiento predeterminadas: 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. También puedes agregar estos rangos de IP si agregas la marca a tu archivo de manifiesto cuando implementas el agente de forma manual.

Configura el Agente con un ConfigMap

Si el conjunto predeterminado de reglas que se muestra arriba no son suficientes en tu clúster, puedes usar ConfigMap para personalizar los rangos de IP afectados.

El archivo ConfigMap debe estar escrito en YAML o JSON y debe llamarse config.

El archivo puede contener tres claves, que todas son opcionales:

  • nonMasqueradeCIDRs: Una lista de strings en notación CIDR que especifica los rangos de direcciones IP que no usa masquerading de IP.
  • masqLinkLocal: Un valor booleano que indica si se debe enmascarar el tráfico al prefijo del vínculo local (169.254.0.0/16). El valor predeterminado es false.
  • resyncInterval: Un valor de número entero que representa el intervalo en el que el agente intenta sincronizar su archivo ConfigMap desde el disco. El formato es Nx, en el que N es un número entero y x es una unidad de tiempo, como s o ms.

Por ejemplo, la ConfigMap siguiente, config, permite que ip-masq-agent excluya a 10.0.0.0/8.

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s

Según la configuración predeterminada, el rango de vínculo local (169.254.0.0/16) está exento de masquerading de IP.

Para hacer que ip-masq-agent habilite el masquerading de IP en el rango de vínculo local, establece el valor de la clave masqLinkLocal en true en ConfigMap.

Por ejemplo:

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s
masqLinkLocal: true

Agrega un ConfigMap a tu clúster

Para agregar un ConfigMap a tu clúster, ejecuta el comando siguiente desde tu shell o ventana de la terminal:

kubectl create configmap [CONFIGMAP_NAME] \
--from-file config \
--namespace kube-system

en el que:

  • [CONFIGMAP_NAME] es lo que eliges para el recurso ConfigMap, como ip-masq-agent.

Por ejemplo:

kubectl create configmap ip-masq-agent --from-file config --namespace kube-system

Una vez completada la sincronización, deberías ver los cambios en iptables:

iptables -t nat -L IP-MASQ
Chain IP-MASQ (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local */
MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL

Crea un recurso ip-masq-agent de forma manual (opcional)

Es posible que debas crear y configurar ip-masq-agent de forma manual. Para hacerlo, debes implementar un recurso ip-masq-agent en tu clúster.

Primero, guarda lo siguiente en un archivo con nombre ip-masq-agent.yaml de forma local.

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: ip-masq-agent
  namespace: kube-system
spec:
  template:
    metadata:
      labels:
        k8s-app: ip-masq-agent
    spec:
      hostNetwork: true
      containers:
      - name: ip-masq-agent
        image: gcr.io/google-containers/ip-masq-agent-amd64:v2.4.1
        args:
            - --masq-chain=IP-MASQ
            # To non-masquerade reserved IP ranges by default, uncomment the line below.
            # - --nomasq-all-reserved-ranges
        securityContext:
          privileged: true
        volumeMounts:
          - name: config
            mountPath: /etc/config
      volumes:
        - name: config
          configMap:
            # Note this ConfigMap must be created in the same namespace as the daemon pods - this spec uses kube-system
            name: ip-masq-agent
            optional: true
            items:
              # The daemon looks for its config in a YAML file at /etc/config/ip-masq-agent
              - key: config
                path: ip-masq-agent
      tolerations:
      - effect: NoSchedule
        operator: Exists
      - effect: NoExecute
        operator: Exists
      - key: "CriticalAddonsOnly"
        operator: "Exists"

Luego, ejecuta el comando siguiente:

kubectl apply -f ip-masq-agent.yaml

Este debería crear un daemonset con el nombre ip-masq-agent que se ejecute en todos los nodos de tu clúster.

Para configurar la herramienta ip-masq-agent, consulta la sección sobre cómo configurar el agente con un ConfigMap.

Pasos siguientes

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Kubernetes Engine