Agente de mascaramento de IP

Nesta página, explicamos como o agente de mascaramento de IP do Google Kubernetes Engine funciona.

Visão geral

O mascaramento de IP é uma forma de conversão de endereços de rede (NAT, na sigla em inglês) de muitos para um. Ele mascara vários endereços IP de origem por trás de um único endereço.

Com o mascaramento de IP, é possível aumentar a segurança dos clusters, porque ele impede que endereços IP individuais do pod fiquem expostos ao tráfego de fora do intervalo de link-local (169.254.0.0/16) e de outros intervalos de IPs arbitrários.

Além disso, o mascaramento de IP permite que você configure a comunicação entre os intervalos de IP, sem máscaras, como pods no intervalo 192.168.0.0/16 que interagem com recursos de rede no intervalo CIDR (10.0.0.0/8).

Antes de começar

Prepare-se para a tarefa tomando as seguintes medidas:

  • Verifique se você ativou a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Verifique se o SDK do Cloud está instalado.
  • Defina o ID do projeto padrão:
    gcloud config set project [PROJECT_ID]
  • Se você estiver trabalhando com clusters zonais, defina a zona do Compute padrão:
    gcloud config set compute/zone [COMPUTE_ZONE]
  • Se você estiver trabalhando com clusters regionais, defina a região do Compute padrão:
    gcloud config set compute/region [COMPUTE_REGION]
  • Atualize a gcloud para a versão mais recente:
    gcloud components update

Como o ip-masq-agent funciona

O mascaramento de IP no GKE é processado pela ferramenta ip-masq-agent. O ip-masq-agent é ativado automaticamente no GKE v1.7 e versões superiores quando uma ou mais das seguintes condições extras são atendidas:

  • O cluster tem uma política de rede.
  • O intervalo CIDR do pod não está dentro de 10.0.0.0/8.

Se o seu cluster usa GKE v1.7 ou superior, mas não está em conformidade com as outras condições necessárias para ativar ip-masq-agent automaticamente, crie o agente ip-masq-agent manualmente.

O ip-masq-agent configura regras iptables para processar o mascaramento de endereços IP de nó/pod ao enviar tráfego para destinos fora dos intervalos de IP do nó e do cluster. Os endereços IP do pod são mascarados pelo endereço do nó.

Por padrão, o agente é configurado para tratar os três intervalos de IP particulares especificados em RFC 1918 (link em inglês) como CIDRs sem mascaramento:

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

Por padrão, o mascaramento de IP também trata o intervalo de link-local (169.254.0.0/16) como um CIDR sem mascaramento.

A cada 60 segundos, por padrão, o agente recarrega o próprio arquivo de configuração a partir do arquivo /etc/config/ip-masq-agent no contêiner.

Veja abaixo o conjunto padrão de regras iptables aplicado 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 as versões 1.14.1-gke.14, 1.14.2-gke.1 e superiores do GKE, ip-masq-agent é implantado pelo GKE com a opção --nomasq-all-reserved-ranges ativada por padrão. Essa opção adiciona os seguintes intervalos de IP às regras padrão não mascaradas: 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 e 240.0.0.0/4. Também é possível adicionar a sinalização ao seu arquivo de manifesto ao implantar o agente manualmente para adicionar os intervalos de IP.

Como configurar o agente usando um ConfigMap

Se o conjunto padrão de regras mostrado acima não for suficiente para seu cluster, você poderá usar um ConfigMap para personalizar os intervalos de IP afetados.

É preciso escrever o arquivo ConfigMap em YAML ou JSON e nomeá-lo como config.

Ele precisa conter três chaves, todas opcionais:

  • nonMasqueradeCIDRs: uma lista de strings na notação CIDR que especifica os intervalos de endereços IP que não usam mascaramento de IP.
  • masqLinkLocal: um valor booleano que indica se haverá mascaramento do tráfego para o prefixo link-local (169.254.0.0/16). O padrão é false.
  • resyncInterval: um valor inteiro que representa o intervalo em que o agente tenta sincronizar o próprio arquivo ConfigMap a partir do disco. O formato é Nx, em que N é um número inteiro e x é uma unidade de tempo, como s ou ms.

Por exemplo, o seguinte ConfigMap, config, permite que 10.0.0.0/8 seja excluído por ip-masq-agent:

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s

Por padrão, o intervalo de link-local (169.254.0.0/16) está isento do mascaramento de IP.

Para que ip-masq-agent ative o mascaramento de IP para o intervalo de link-local, defina o valor da chave masqLinkLocal como true no ConfigMap.

Por exemplo:

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

Como adicionar um ConfigMap ao cluster

Para adicionar um ConfigMap ao cluster, execute o comando a seguir no shell ou na janela de terminal:

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

em que:

  • [CONFIGMAP_NAME] é o nome que você escolher para o recurso ConfigMap, como ip-masq-agent.

Por exemplo:

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

Quando a sincronização é concluída, as alterações aparecem em 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

Como criar um recurso ip-masq-agent manualmente (opcional)

Talvez você precise criar e configurar ip-masq-agent manualmente. Para fazer isso, é preciso implantar um recurso ip-masq-agent no seu cluster.

Primeiro, salve o seguinte código localmente em um arquivo chamado ip-masq-agent.yaml:

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"

Em seguida, execute o comando:

kubectl apply -f ip-masq-agent.yaml

Isso criará um daemonset chamado ip-masq-agent que será executado em todos os nós do cluster.

Para configurar a ferramenta ip-masq-agent, consulte Como configurar o agente usando um ConfigMap.

A seguir

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Kubernetes Engine