Forward proxy e reverse proxy: qual é a diferença?

Publicado:

13 min de leitura

Acar Diveroli
Autor: Acar Diveroli
Duas faixas: um computador que chega à web por um forward proxy e a internet que chega a um rack de servidores por um reverse proxy

A palavra "proxy" é usada para duas configurações diferentes, e elas se confundem o tempo todo. Quando um desenvolvedor diz "colocamos um proxy na frente do site", está falando de um reverse proxy. Quando uma equipe de dados diz "as nossas requisições passam por um proxy", está falando de um forward proxy. Os dois são intermediários entre duas partes; a diferença está em em nome de quem trabalham e quem os configura.

Este artigo define cada configuração separadamente, mostra passo a passo como uma requisição passa por cada uma e reúne as diferenças em uma tabela. Depois, vemos para que serve um reverse proxy (balanceamento de carga, terminação TLS, cache), onde as CDNs entram nessa história e uma configuração curta de Nginx.

O que é um forward proxy?

O forward proxy é o intermediário que um ou mais clientes usam para chegar à internet. O cliente conhece o endereço do proxy e envia as requisições para lá; o proxy as encaminha aos sites de destino com o próprio endereço IP. O site de destino vê a conexão como vinda do proxy.

No dia a dia, "proxy" quase sempre significa forward proxy. Os proxies residenciais, de datacenter e móveis vendidos pelos provedores são todos forward proxies. Explicamos o mecanismo básico em detalhe em O que é um servidor proxy e como ele funciona?.

Este é o caminho de uma requisição por um forward proxy:

  1. O usuário configura o endereço do proxy no navegador ou no código.
  2. O cliente se conecta ao proxy em vez de ao site de destino e, para HTTPS, envia uma requisição CONNECT target.com:443.
  3. O proxy autentica o cliente, se necessário, e se conecta ao site de destino com o próprio endereço IP.
  4. O site de destino registra a requisição como vinda do IP do proxy e envia a resposta para ele.
  5. O proxy devolve a resposta ao cliente.

Usar um forward proxy na linha de comando é uma única opção:

bash
curl -x "http://user:pass@pr.proxynet.io:8000" https://httpbin.org/ip

Aqui o cliente sabe que há um proxy, porque ele mesmo informou o endereço.

O que é um reverse proxy?

O reverse proxy é um intermediário colocado na frente de um ou mais servidores. Quando um visitante se conecta a example.com, na verdade está se conectando ao reverse proxy; o reverse proxy encaminha a requisição a um dos servidores de aplicação por trás dele e devolve a resposta ao visitante. O visitante não sabe qual máquina respondeu, e nem precisa saber.

O padrão HTTP, RFC 9110, chama essa configuração de "gateway" ou "reverse proxy" e a descreve como um intermediário que age como servidor de origem do ponto de vista do cliente. Para o cliente, o reverse proxy é o site.

Este é o caminho de uma requisição por um reverse proxy:

  1. O visitante abre example.com; o DNS resolve o nome para o endereço IP do reverse proxy.
  2. O reverse proxy aceita a conexão e geralmente descriptografa o TLS nesse ponto.
  3. Ele escolhe um dos servidores de backend com base no caminho da requisição, no nome do host ou na carga atual.
  4. Encaminha a requisição a esse servidor e adiciona o IP real do visitante em um cabeçalho X-Forwarded-For ou Forwarded.
  5. Recebe a resposta do servidor de aplicação, armazena em cache se estiver configurado e envia ao visitante.

Qual é a diferença entre eles?

As duas configurações recebem tráfego de uma ponta e passam para a outra. O jeito mais rápido de ver a diferença é perguntar a quais interesses o intermediário serve.

CritérioForward proxyReverse proxy
Quem ele representa?O clienteO servidor
Onde fica?Entre o cliente e a internetEntre a internet e os servidores
Quem configura?O usuário ou o administrador de redeO dono do site ou a equipe de infraestrutura
O cliente sabe que ele existe?Sim, o cliente define o endereçoNão, o cliente acha que está falando com o site
Qual IP fica oculto?O do clienteO dos servidores de backend
Quantos destinos?Qualquer site da internetServidores específicos por trás dele
TLSTunela o HTTPS e não vê o conteúdoGeralmente termina o TLS ele mesmo
CachePossível com HTTP sem criptografiaMuito usado
Software típicoSquid, serviços de proxy comerciaisNginx, HAProxy, Envoy, CDNs
Uso típicoControle de acesso, acesso por localização, coleta de dadosBalanceamento de carga, segurança, cache

A linha mais importante é a do TLS. O forward proxy só abre um túnel para o tráfego HTTPS e transporta bytes criptografados. O reverse proxy tem o certificado do site, então descriptografa o tráfego, lê a requisição e pode roteá-la de acordo com o conteúdo.

Para que serve um reverse proxy?

O reverse proxy assume trabalhos com os quais a aplicação não deveria precisar lidar:

  • Balanceamento de carga. Distribui as requisições recebidas entre vários servidores de aplicação. Se um servidor para de responder, o tráfego vai para os outros e os visitantes não percebem.
  • Terminação TLS. O gerenciamento de certificados e a descriptografia ficam em um só lugar. Os servidores de backend podem falar HTTP simples na rede interna ou usar um certificado interno separado.
  • Cache e compressão. Armazena páginas e arquivos estáticos pedidos com frequência e comprime as respostas, então menos requisições chegam ao servidor de aplicação.
  • Camada de segurança. Aplica regras de firewall de aplicações web (WAF), limites de taxa e filtros de bots. Os endereços IP dos servidores de backend não ficam expostos diretamente a ataques.
  • Roteamento por caminho. Envia as requisições de /api para um serviço e as de /blog para outro, e assim várias aplicações rodam sob um mesmo domínio.
  • Deploy sem interrupção. Publicar uma versão nova em servidores novos e deslocar o tráfego aos poucos é feito pelo reverse proxy.

Como um reverse proxy trabalha junto com um firewall está em Proxy ou firewall: qual é a diferença?.

Como configurar um reverse proxy simples com Nginx?

A diretiva central de um reverse proxy no Nginx é proxy_pass. A configuração abaixo distribui o tráfego que chega na porta 443 entre dois servidores de aplicação e repassa o IP real do visitante ao backend:

nginx
upstream app {
    server 10.0.0.11:3000;
    server 10.0.0.12:3000;
}

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate     /etc/ssl/example.com/fullchain.pem;
    ssl_certificate_key /etc/ssl/example.com/privkey.pem;

    location / {
        proxy_pass http://app;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

O que cada linha faz:

  • O bloco upstream define os servidores de backend. Por padrão, o Nginx distribui as requisições em rodízio; diretivas como least_conn ou ip_hash mudam o método.
  • listen 443 ssl e as linhas do certificado terminam o TLS no reverse proxy.
  • proxy_pass encaminha a requisição ao grupo app.
  • Sem as linhas proxy_set_header, a aplicação de backend vê todas as requisições como vindas do IP do reverse proxy, o que torna os registros e os limites de taxa inúteis.

A lista completa de diretivas está na documentação do ngx_http_proxy_module do Nginx.

Dá para confiar no cabeçalho X-Forwarded-For?

Uma aplicação atrás de um reverse proxy lê o IP do visitante no cabeçalho X-Forwarded-For. Esse cabeçalho é texto simples, e o cliente também pode enviá-lo. Se a aplicação confia nele cegamente, um visitante pode escrever um IP falso e escapar de limites de taxa ou restrições por IP.

A abordagem correta:

  • Só considerar o cabeçalho em conexões que vêm de reverse proxies conhecidos. No Nginx, isso é feito com as diretivas set_real_ip_from e real_ip_header.
  • Se houver vários intermediários, ler a lista da direita para a esquerda e pegar o endereço anterior ao último intermediário confiável.
  • Onde a infraestrutura permitir, preferir o cabeçalho padronizado Forwarded (RFC 7239).

A mesma lógica vale do lado do forward proxy: um site de destino pode olhar os cabeçalhos adicionados por um proxy e ver o cliente real. Por isso a maioria dos serviços de proxy não adiciona cabeçalhos com o IP do cliente.

CDN é um reverse proxy?

Sim. Uma rede de distribuição de conteúdo (CDN) é formada por servidores reverse proxy espalhados pelo mundo. Quando você coloca um site atrás de uma CDN, o seu domínio passa a resolver para os IPs da CDN; os visitantes se conectam ao servidor da CDN mais próximo, e a CDN encaminha ao seu servidor (a origem) as requisições que não estão no cache.

Por isso as CDNs assumem em grande escala todos os trabalhos de um reverse proxy: terminação TLS, cache, absorção de ataques DDoS, WAF e gerenciamento de bots. Os limites de taxa e as páginas de verificação de bots que um scraper encontra geralmente não vêm do próprio site de destino, mas dessa camada de reverse proxy na frente dele. Para um exemplo de como essa camada classifica o tráfego de bots, veja Cloudflare Precursor.

Forward e reverse proxy são usados juntos?

A maioria das requisições passa pelos dois. Quando o script de uma equipe de dados coleta preços de uma loja online, o caminho é este:

  1. O script envia a requisição ao forward proxy da equipe.
  2. O forward proxy resolve o domínio do site e se conecta à CDN (reverse proxy) na frente do site.
  3. A CDN avalia a requisição e, se não estiver em cache, encaminha ao servidor de aplicação do site.
  4. A resposta volta ao script pela mesma cadeia.

Aqui o site vê o IP de saída do forward proxy, e o script vê o IP da CDN; nenhum dos lados conhece a máquina real por trás do outro. Em redes corporativas a cadeia é ainda mais longa: computador do funcionário → proxy da empresa → firewall → internet → CDN do site → servidor de aplicação.

Casos de uso

  • Equipe de coleta de dados: usa um forward proxy para ver preços em países diferentes e distribuir as requisições. Para esse trabalho, configura-se um Proxies rotativos, que dá um IP diferente a cada conexão por um único endereço. A escala de rastreamentos está na nossa página de solução de web crawler.
  • Equipe de TI corporativa: usa um forward proxy para fazer o tráfego dos funcionários sair por um único ponto e manter registros, e um reverse proxy para expor aplicações internas. O lado da proteção de dados está na nossa página de solução de segurança de dados.
  • Desenvolvedor de aplicações web: coloca a aplicação atrás do Nginx ou de uma CDN e deixa o balanceamento de carga e o TLS fora do código da aplicação.
  • Equipe de testes de software: usa um forward proxy para ver como uma aplicação abre em outros países e um reverse proxy para reunir serviços de teste sob um mesmo domínio.
  • Usuário individual: configura um forward proxy como um Proxies HTTPS para passar o tráfego do navegador por outra localização. Se também precisar de criptografia, a ferramenta é uma VPN; a diferença está em Proxy ou VPN.

Erros comuns

  • Tratar o reverse proxy como ferramenta de anonimato. O reverse proxy protege o dono do site; ele não esconde o IP do visitante e, na verdade, repassa esse IP ao backend com X-Forwarded-For.
  • Não repassar o cabeçalho Host. Por padrão, o Nginx envia o nome do servidor do endereço em proxy_pass. Se a aplicação de backend depende do nome de domínio, ela retorna o site errado ou uma página de erro.
  • Deixar o servidor de backend acessível diretamente. As regras de segurança do reverse proxy perdem o sentido quando o servidor de aplicação pode ser acessado pelo próprio IP. A porta da aplicação só deveria estar aberta para o endereço interno do reverse proxy.
  • Levar identidade em cabeçalhos no forward proxy. Um proxy Squid que você mesmo roda pode adicionar os cabeçalhos X-Forwarded-For e Via com a configuração padrão, e aí o site de destino vê o endereço real do cliente.
  • Timeouts incompatíveis. Se o timeout do reverse proxy for menor que o da aplicação, requisições longas são cortadas com 504 Gateway Timeout.

Guia de decisão

Sua necessidadeRecomendação
Enviar requisições a partir de outro endereço IPForward proxy
Ver conteúdo de outros paísesForward proxy (com escolha de localização)
Controlar o tráfego dos funcionários em um pontoForward proxy (corporativo)
Distribuir o seu site entre vários servidoresReverse proxy
Gerenciar certificados TLS em um só lugarReverse proxy
Proteger o seu site de ataques e tráfego de botsReverse proxy ou CDN
Servir conteúdo estático rápido no mundo todoCDN

Perguntas frequentes

"Reverse proxy" é o mesmo que "proxy reverso"?

Sim, são dois nomes para a mesma coisa. A documentação técnica e as configurações de software usam quase sempre "reverse proxy".

VPN é um forward proxy?

Na função, são parecidos: os dois fazem o seu tráfego sair por outro servidor, e o site de destino vê o IP desse servidor. Mas a VPN funciona no nível do sistema operacional e criptografa todo o tráfego entre o seu dispositivo e o servidor VPN. O forward proxy é configurado por aplicativo e não criptografa nada sozinho.

O Nginx pode ser usado como forward proxy?

O Nginx consegue encaminhar requisições HTTP simples, mas a versão padrão não suporta o método CONNECT necessário para HTTPS; para isso é preciso um módulo de terceiros. Forward proxies costumam ser montados com software dedicado, como o Squid.

O reverse proxy deixa o site mais lento?

Na teoria, adiciona um pequeno atraso porque há um salto a mais. Na prática, a maioria dos sites carrega mais rápido atrás de um reverse proxy ou de uma CDN graças ao cache, à compressão, à reutilização de conexões e à proximidade dos visitantes.

Um site revela que está atrás de um reverse proxy?

Muitas vezes, sim. Aparecem cabeçalhos de resposta como Server, Via ou cabeçalhos próprios da CDN, e o IP do domínio pertence a uma CDN. Mesmo assim, essa informação não revela o endereço do servidor por trás.

Que tipo de proxy os serviços de proxy vendem?

Os serviços de proxy residencial, de datacenter, ISP e móvel são todos forward proxies. Você recebe um endereço de entrada, e as suas requisições saem por um dos IPs de saída do provedor.

Em resumo

O forward proxy representa o cliente e o reverse proxy representa o servidor. O usuário configura o forward proxy de propósito, e o site de destino vê o IP do proxy; o dono do site configura o reverse proxy, e os visitantes nunca veem os servidores por trás dele. Os reverse proxies cuidam do balanceamento de carga, da terminação TLS, do cache e da segurança, e as CDNs são a mesma ideia em escala global. Se você precisa enviar requisições a partir de endereços IP e localizações diferentes, o que procura é um forward proxy; as opções estão nos nossos serviços de proxy.