O enigma do IP de origem do balanceador de carga … Entrar … Protocolo de proxy

Houve uma época em que os dinossauros vagavam pela Terra; os seres humanos começaram a trabalhar com ferramentas como pedras e balanceadores de carga baseados em DSR de camada 4.

Na época, essas ferramentas eram úteis porque você podia acessar os servidores com elas e também porque era fácil garantir que o servidor de aplicativos fosse apresentado com o endereço IP real do cliente.

Um balanceador de carga fica entre o cliente e o aplicativo, portanto, olhando para trás a partir do aplicativo, quem é o remetente? O cliente (sim, por favor) ou o balanceador de carga?

Isso foi bastante fácil e você tinha algumas opções à sua disposição.

Modo DSR – Retorno direto do servidor.

  1. O cliente se conectaria ao balanceador de carga.
  2. O balanceador de carga o enviaria para o aplicativo com o IP de origem do cliente.
  3. O aplicativo enviaria uma resposta diretamente para o cliente. Ele provavelmente notaria que o SourceIP é um IP externo e, em seguida, encaminharia a resposta para o gateway, ignorando assim o balanceador de carga na resposta.

Assim, os dinossauros gostaram dessa abordagem, pois ela usava menos recursos na infraestrutura, e o aplicativo obtinha o IP real do cliente

A desvantagem é que você precisa fazer uma configuração de rede especial no servidor de aplicativos E a grande revelação… O balanceador de carga não recebe nem vê a resposta, portanto, qualquer SSL ou troca de conteúdo está fora de questão.

A outra desvantagem é que o LB não tem ideia de como está o desempenho do servidor de aplicativos, portanto, é mais difícil fazer o balanceamento de carga para servidores que provavelmente teriam um desempenho melhor. O ADC usaria a resposta mais rápida ou o menor número de conexões. (O Stone Age Man pode instalar um agente no servidor de aplicativos para informar isso.) Ou um ADC poderia usar o SNMP para obter isso.

De qualquer forma, essa configuração funcionou bem por muitos anos, como o cavalo e a carroça, e, de fato, ainda há situações em que essa é a melhor opção, como corridas de carruagem ou alguns protocolos mais antigos, por exemplo.

O próximo é:

Modo de gateway

  • O cliente se conectaria ao balanceador de carga
  • O balanceador de carga o enviaria ao App Server com o IP de origem do cliente
  • O aplicativo enviaria uma resposta diretamente para o cliente, MAS ATRAVÉS do balanceador de carga, porque você alterou o gateway padrão do App Server para o do balanceador de carga. Isso significa que o balanceador de carga receberá a resposta.

Isso é muito melhor em alguns aspectos, mas TODO o tráfego externo do servidor de aplicativos, como as atualizações de software, é executado por meio do balanceador de carga, o que torna as coisas confusas.

Isso era mais comum quando os balanceadores de carga se pareciam com switches e tudo era conectado diretamente com links de rede de alta velocidade.

O homem aprende a cultivar e usar o balanceamento de carga baseado em proxy

Nessa época, as redes e as velocidades da CPU estavam ficando mais rápidas, e começamos a ver a abordagem de proxy.

Decidimos ser honestos e começar a usar o balanceador de carga como o IP de origem em vez de enganar o servidor de aplicativos. Fizemos isso por vários motivos, incluindo o desempenho do TCP, a segurança e a capacidade de fornecer serviços adicionais no balanceador de carga.

Mas esse afastamento da coleta de caçadores teve um grande preço e um grande desafio.

Como você envia o IP do cliente para o servidor de aplicativos?

Felizmente, o bom e velho HTTP tinha uma ótima resposta, desde que você estivesse usando HTTP.

X_Forwarded_For Header – permite que você coloque o IP do cliente no cabeçalho e depois o envie.

Não vou explicar isso em muitos detalhes, pois é bastante simples, mas basta dizer que é um cabeçalho que qualquer pessoa pode definir facilmente. Além disso, ele pode se tornar complexo. Por exemplo, o que acontece se o balanceador de carga já tiver recebido um IP X_Forwareded_For? Você deve usá-lo ou usar o IP de origem e alterá-lo? Normalmente, isso é possível de ser configurado em um LB decente, mas todos eles têm considerações de segurança, etc.

De qualquer forma, 99% das vezes, sempre que um aplicativo da Web precisa do código-fonte, é assim que você o obtém (Observação: 99% das estatísticas são inventadas)

E quanto a outros protocolos?

Alguns têm alguns hacks específicos de protocolo, mas não há nada genérico que seja mais amplamente adotado.

Bem, isso foi até que o Proxy Protocol foi proposto e amplamente adotado.

Explicação do protocolo proxy

O protocolo proxy resolve esse problema adicionando um cabeçalho à solicitação encaminhada que contém os detalhes da conexão do cliente original.

Já existem duas versões desse protocolo.

  • Protocolo de proxy v1: Usa um formato de texto simples e legível por humanos.
  • Protocolo de proxy v2: Usa um formato binário, que é mais eficiente e pode suportar recursos adicionais como IPv6 e endereços de soquete Unix.

O que é diferente é que a maioria dos servidores de aplicativos será interrompida se você ativar isso sem configurá-los para aceitá-lo. Isso ocorre porque o Proxy Protocol literalmente adiciona os detalhes necessários ao início dos dados.

No entanto, a adoção está crescendo e muitos fornecedores agora oferecem suporte a isso.

Ele é ótimo para proxy de DNS, por exemplo.

Assim como no caso do X_Forwardard_For, ainda há algumas decisões a serem tomadas:

Por exemplo, o que você deseja que o balanceador de carga faça se for apresentado a um cabeçalho de protocolo proxy? Removê-lo e definir um novo, ou mantê-lo? Se você não espera que um seja enviado, deve ignorá-lo e obter o seu próprio, mas essas decisões devem ser consideradas.

O protocolo proxy é uma maneira simples de obter o IP do cliente e agora tem amplo suporte, portanto, você pode aproveitar.

Vou voltar a pensar em alta disponibilidade na nuvem, Ciao!

About Jay Savoor