Proxy transparente, anônimo e elite: qual é a diferença?

Publicado:

20 min de leitura

Acar Diveroli
Autor: Acar Diveroli
Três placas isométricas empilhadas: na de baixo, cabeçalhos com o IP real; na do meio, só Via; na de cima, nenhum deles

Ao olhar uma lista de proxies ou a página de produto de um provedor, você vê ao lado dos endereços as etiquetas "transparent", "anonymous" e "elite". Em português, fala-se em proxy transparente, anônimo e de alto anonimato (elite). Os três fazem a sua requisição passar por outro servidor, mas a requisição que chega ao site de destino não é a mesma: em uma, o seu endereço IP real vai escrito como uma linha; em outra, há apenas uma nota dizendo "existe um proxy no meio"; na terceira, não há nenhuma das duas coisas.

Neste artigo explicamos o que define o nível de anonimato, o que os cabeçalhos Via, X-Forwarded-For e Forwarded carregam e como a mesma requisição chega ao destino nos três níveis. Em seguida, vemos por que os níveis perdem o sentido no tráfego HTTPS e SOCKS5, como você pode ver o nível do seu próprio proxy e o que a etiqueta "elite" não garante. O exemplo em Python no final foi executado com um proxy de teste local nos três níveis.

O que é o nível de anonimato de um proxy?

Proxy é um servidor intermediário que encaminha a sua requisição ao destino em seu nome. Como o site de destino recebe a conexão a partir do proxy, o que ele vê é o endereço IP do proxy. O funcionamento geral está em O que é um servidor proxy e como ele funciona?; a tabela de tipos daquele artigo separa os proxies por protocolo, origem do IP e rotação. O nível de anonimato é uma quarta pergunta somada a esses três eixos: o que o proxy diz ao destino sobre você ao encaminhar a requisição?

A resposta não está no endereço IP, e sim nas linhas de cabeçalho da requisição. Um proxy HTTP consegue abrir e ler uma requisição sem criptografia e acrescentar linhas a ela antes de encaminhar. Conforme o que ele acrescenta, há três resultados:

  • O destino fica sabendo que há um proxy em uso e também qual é o seu endereço IP real (transparente).
  • O destino fica sabendo que há um proxy em uso, mas não o seu endereço real (anônimo).
  • O destino não fica sabendo de nada pelos cabeçalhos (elite).

Daí sai também a resposta curta para "o que é proxy anônimo?": é o proxy que não repassa o seu endereço IP real ao destino. Nessa definição cabem tanto o segundo quanto o terceiro nível. No uso do dia a dia, "proxy anônimo" costuma ser dito nesse sentido amplo; já a etiqueta "anonymous" das listas indica, em sentido estrito, o segundo nível, ou seja, o proxy que esconde o endereço mas se denuncia.

Essa classificação não é um padrão. Nenhuma RFC define um termo como "proxy elite"; os nomes são um costume dos sites de listas de proxies. O que é padronizado são os próprios cabeçalhos que dão origem aos níveis.

Quais cabeçalhos HTTP definem o nível?

Via

Via registra por quais intermediários a requisição passou. A seção Via da RFC 9110 compara o cabeçalho às linhas Received do e-mail: cada intermediário acrescenta ao fim da lista a versão do protocolo com que recebeu a requisição e o próprio nome.

text
Via: 1.1 proxy-a.example, 1.1 cache-2

O padrão é claro nesse ponto: um proxy deve acrescentar um cabeçalho Via adequado a toda mensagem que encaminha. A mesma seção permite escrever um pseudônimo no lugar do nome real quando o nome do servidor é considerado informação sensível. Ou seja, Via não carrega o seu endereço IP real; apenas diz "esta requisição passou por um intermediário". É esse o cabeçalho que dá origem ao nível anônimo. Os proxies chamados de elite não acrescentam essa linha em momento algum e, com isso, descumprem de propósito esse item do padrão.

X-Forwarded-For

X-Forwarded-For carrega o endereço IP do cliente que se conectou ao proxy. Nunca chegou a ser um padrão oficial, mas, nas palavras da página da MDN sobre X-Forwarded-For, é um padrão de fato. Havendo mais de um intermediário, os endereços são enfileirados com vírgulas: mais à esquerda fica o cliente que iniciou a requisição, mais à direita o último intermediário.

text
X-Forwarded-For: 203.0.113.7, 198.51.100.24

O cabeçalho nasceu, na verdade, para balanceadores de carga e reverse proxies: a aplicação que fica atrás lê o endereço do visitante nessa linha. Até que ponto o site de destino pode confiar nessa linha está na seção "Dá para confiar no cabeçalho X-Forwarded-For?" de Forward proxy e reverse proxy: qual é a diferença?. Do lado do forward proxy, a mesma linha funciona no sentido inverso: se o proxy acrescenta esse cabeçalho, o endereço que você queria esconder fica gravado em texto puro no log do destino. É esse o cabeçalho que dá origem ao nível transparente.

Forwarded

Forwarded é a versão padronizada do mesmo trabalho. A RFC 7239 define quatro parâmetros em um único cabeçalho: for (quem enviou a requisição), by (o intermediário que a recebeu), host e proto.

text
Forwarded: for=203.0.113.7;proto=http;by=198.51.100.24

A RFC diz que esse cabeçalho é opcional e que, por causa da sensibilidade da informação que carrega, deve vir desativado por padrão. Na introdução há ainda uma frase direta: se a finalidade do proxy é dar anonimato ao cliente, o proxy não usa esse recurso. Duas soluções intermediárias estão definidas: o intermediário pode escrever for=unknown ou usar um identificador aleatório que começa com sublinhado (for=_hidden). Nos dois casos o destino não descobre o seu endereço, mas descobre que há um intermediário; isso corresponde ao nível anônimo.

Outros rastros

As ferramentas que testam listas de proxies olham também algumas linhas fora do padrão: X-Real-IP, Client-IP e Proxy-Connection, que o cliente envia ao proxy e que um proxy descuidado repassa ao destino do jeito que veio. Se chegam ao destino, dizem uma das mesmas duas coisas: ou o seu endereço, ou que há um intermediário.

Como a mesma requisição chega ao destino nos três níveis?

O caminho de uma requisição http:// sem criptografia é este:

  1. O cliente envia a requisição inteira ao proxy. O endereço de destino, os cabeçalhos e, se houver, o corpo ficam legíveis para o proxy.
  2. O proxy confere as suas credenciais e retira apenas as linhas destinadas a ele (como Proxy-Authorization).
  3. Conforme a configuração, acrescenta linhas novas à requisição ou não acrescenta nada. O nível é decidido neste passo.
  4. Abre uma conexão nova com o destino a partir do próprio endereço IP e encaminha a requisição.
  5. O destino vê duas informações juntas: o endereço de onde veio a conexão (o IP de saída do proxy) e o que está escrito nos cabeçalhos.

Executamos o nosso proxy de teste local com três configurações diferentes e enviamos a mesma requisição a um endpoint de eco. Endpoint de eco é um servidor que devolve, do jeito que recebeu, os cabeçalhos da requisição. Com o cliente em 127.0.0.1 e o endereço de saída do proxy em 127.0.0.2, os três resultados estão abaixo; encurtamos as linhas sem relação com o tema, como Accept.

Configuração transparente:

text
Host: 127.0.0.1:8318
User-Agent: python-requests/2.34.2
Via: 1.1 test-proxy
X-Forwarded-For: 127.0.0.1
Forwarded: for=127.0.0.1;proto=http

Configuração anônima:

text
Host: 127.0.0.1:8318
User-Agent: python-requests/2.34.2
Via: 1.1 test-proxy

Configuração elite:

text
Host: 127.0.0.1:8318
User-Agent: python-requests/2.34.2

Nos três casos o servidor de eco informou que a conexão veio de 127.0.0.2; a diferença estava só nos cabeçalhos.

Quais são as diferenças entre proxy transparente, anônimo e elite?

Transparente (transparent)Anônimo (anonymous)Elite (alto anonimato)
IP que o destino vêEndereço do proxyEndereço do proxyEndereço do proxy
O IP real vai em um cabeçalho?Sim (X-Forwarded-For, Forwarded: for=)NãoNão
Os cabeçalhos revelam que é um proxy?SimSim (Via, for=unknown)Não
Regra do Via na RFC 9110CumpreCumpreNão cumpre
Onde costuma aparecerRedes de escolas, escritórios e hotéis, servidores de cacheSoftware de proxy com a configuração padrão alterada pela metadeServiços de proxy comerciais
Nome em inglês nas listasTransparentAnonymous, "distorting" (a variante que escreve um endereço falso)Elite, high anonymity

Como os nomes mudam de uma lista para outra, é mais seguro olhar os próprios cabeçalhos do que a etiqueta. O tipo intermediário chamado "distorting" escreve na linha X-Forwarded-For um endereço inventado no lugar do real. Para o destino, o resultado é o mesmo do nível anônimo: ele não descobre o seu endereço, mas descobre que existe um intermediário.

O que é proxy transparente e onde você o encontra?

"Proxy transparente" é usado com dois sentidos diferentes, que se confundem com frequência.

O primeiro é o sentido no nível da rede. A seção 3.7 da RFC 9110, que descreve os intermediários, chama de "interception proxy" a estrutura que o cliente não escolheu, em que a própria rede desvia o tráfego, e registra que o nome comum disso é "transparent proxy". Segundo a mesma seção, ela aparece sobretudo em pontos de acesso públicos que pedem login antes de liberar a internet e em firewalls corporativos que aplicam regras de uso. No seu navegador você não configura nada. A relação dessas montagens com o firewall está em Proxy ou firewall: qual é a diferença?.

O segundo é o sentido das listas de proxies: o proxy que repassa o seu endereço IP real ao destino por meio de um cabeçalho. Os dois sentidos costumam se encontrar no mesmo servidor, porque o proxy da rede de uma organização não está ali para esconder você, e sim para cache, filtragem e registro.

Um bom exemplo é o Squid, software de proxy de código aberto bastante difundido. Segundo a documentação de forwarded_for do Squid (a diretiva existe na v7 e em versões anteriores), o valor padrão é on, e nesse caso o endereço IP do cliente é acrescentado à linha X-Forwarded-For. Com o valor off a linha sai como unknown; com delete, o cabeçalho é removido por inteiro. Nessas mesmas versões o cabeçalho Via também vem ativado por padrão. Por isso, um proxy desses instalado com a configuração padrão trabalha no nível transparente; um proxy ser "anônimo" ou "elite" não depende do tipo de software, e sim de poucas linhas de configuração de quem o administra.

O que é proxy elite (de alto anonimato)?

Proxy elite é aquele que, mesmo em requisições sem criptografia, não repassa ao destino nem o seu endereço nem o rastro de um intermediário. Ele recebe a requisição, retira as linhas que são dele e envia o resto sem mexer, a partir do próprio endereço IP.

Nos serviços de proxy pagos esse comportamento não é privilégio, é o normal: um serviço que escrevesse o endereço do cliente no destino não faria sentido. A palavra "elite" ganha o seu sentido real nas listas gratuitas: entre aqueles endereços há servidores deixados na configuração padrão, mal configurados ou invadidos, e qual deles acrescenta cabeçalhos não dá para saber por nada além da etiqueta. O lado de segurança dessas listas está em Proxies gratuitos e sites de web proxy são seguros?.

Elite não diz que o proxy é rápido, que o endereço IP está limpo nem que o seu tráfego não é registrado. Diz apenas que duas linhas não estão na requisição encaminhada.

Por que os níveis perdem o sentido em HTTPS e SOCKS5?

Os três níveis partem do pressuposto de que o proxy consegue ler e alterar a requisição. Esse pressuposto só vale para HTTP sem criptografia.

Em uma requisição HTTPS, o cliente diz ao proxy, com o método CONNECT: "abra um túnel para a porta 443 deste servidor". Segundo a RFC 9110, depois que o túnel é estabelecido, o trabalho do proxy se resume a retransmitir os dados às cegas nos dois sentidos. O handshake TLS acontece entre o cliente e o destino; os cabeçalhos ficam dentro do canal criptografado e o proxy não consegue acrescentar linhas a eles. Testamos isso também no ambiente local: o proxy na configuração transparente acrescentou três linhas à requisição http://, e na requisição https:// feita pelo mesmo proxy nenhuma linha extra chegou ao servidor de eco. A exceção são os proxies corporativos de inspeção, que abrem o tráfego e criptografam de novo; nem eles conseguem fazer isso sem que o certificado raiz deles seja instalado no seu dispositivo.

No SOCKS5 a situação é essa desde o início. Um proxy SOCKS não fala HTTP, transporta bytes; não existe uma camada em que ele possa acrescentar cabeçalhos. A diferença entre os protocolos está em Diferença entre SOCKS e HTTP proxy: qual escolher?. À medida que a web migrou para HTTPS, o espaço prático da distinção por níveis encolheu: páginas sem criptografia, APIs antigas e as chamadas HTTP simples feitas por dispositivos. Nas páginas de Proxies HTTPS e Proxies SOCKS5 você vê qual protocolo combina com cada trabalho.

Isso não quer dizer que em HTTPS o destino não consiga deduzir nada. O que se fecha é só o caminho dos cabeçalhos; os outros sinais, descritos mais abaixo, continuam no lugar.

Como ver o nível do seu próprio proxy?

Só é preciso um endpoint de eco. O httpbin.org, de código aberto, é muito usado para isso. Dois detalhes definem o resultado:

  • O endereço precisa começar com http://. Em um endereço https:// o proxy não consegue acrescentar cabeçalhos, então qualquer proxy parece elite.
  • É preciso acrescentar o parâmetro show_env=1. Por padrão, o httpbin retira da resposta linhas como Via e X-Forwarded-For. Em uma requisição sem o parâmetro não vimos esses cabeçalhos na resposta, embora os tivéssemos enviado; com o parâmetro, eles apareceram.

Para testar sem escrever código, basta configurar o proxy no navegador e abrir http://httpbin.org/get?show_env=1. Na seção headers da página, veja se existe uma linha Via ou alguma linha com o seu próprio endereço. Na linha de comando, a mesma requisição fica assim (as opções de proxy do cURL estão em Como usar cURL com proxy: comandos e exemplos):

bash
curl -s -x http://user:pass@pr.proxynet.io:8000 "http://httpbin.org/get?show_env=1"

Um detalhe pode enganar na leitura da resposta: o httpbin roda atrás de um balanceador de carga, e esse balanceador escreve na linha X-Forwarded-For o endereço que se conectou a ele. Você vê essa linha até em uma requisição sem proxy. Se na linha houver só o endereço de saída do proxy, não há vazamento; vazamento é quando o seu próprio endereço também aparece na linha.

O script abaixo faz essa distinção sozinho. Primeiro descobre o seu endereço com uma requisição sem proxy; depois vai ao mesmo endpoint pelo proxy e classifica os cabeçalhos que chegaram. Como testa os dois endereços, mostra o efeito do túnel.

python
import requests

PROXY = "http://user:pass@pr.proxynet.io:8000"
ECHO_URLS = [
    "http://httpbin.org/get?show_env=1",   # HTTP simples: o proxy consegue ler a requisição e acrescentar cabeçalhos
    "https://httpbin.org/get?show_env=1",  # HTTPS: a requisição passa por dentro do túnel CONNECT
]
# Cabeçalhos conhecidos que servidores intermediários acrescentam à requisição
PROXY_HEADERS = ["via", "forwarded", "x-forwarded-for", "x-real-ip", "client-ip", "proxy-connection"]


def echo(url, proxies=None):
    """Devolve o endereço e os cabeçalhos que o endpoint de eco viu."""
    data = requests.get(url, proxies=proxies, timeout=20).json()
    headers = {name.lower(): value for name, value in data["headers"].items()}
    return data["origin"], headers


def classify(real_ip, origin, headers):
    exit_ip = origin.split(",")[-1].strip()
    found = {name: headers[name] for name in PROXY_HEADERS if name in headers}
    # O balanceador de carga na frente do serviço de eco escreve o IP de saída em X-Forwarded-For; isso não conta como vazamento
    if found.get("x-forwarded-for", "").strip() == exit_ip:
        del found["x-forwarded-for"]
    if exit_ip == real_ip:
        level = "proxy fora de uso (o IP de saída é o seu próprio endereço)"
    elif real_ip in origin or any(real_ip in value for value in found.values()):
        level = "transparente (o IP real chega ao destino)"
    elif found:
        level = "anônimo (IP escondido, dá para ver que é proxy)"
    else:
        level = "elite (sem rastro nos cabeçalhos)"
    return level, exit_ip, found


def main():
    proxies = {"http": PROXY, "https": PROXY}
    for url in ECHO_URLS:
        real_ip = echo(url)[0].split(",")[-1].strip()  # requisição sem proxy: o seu próprio endereço
        level, exit_ip, found = classify(real_ip, *echo(url, proxies))
        print(f"{url}\n  IP de saída: {exit_ip}\n  nível      : {level}")
        for name, value in found.items():
            print(f"  {name}: {value}")


main()

Ao executar o script com a configuração transparente do nosso proxy de teste local e com um servidor de eco local que responde no mesmo formato, a saída foi esta:

text
http://127.0.0.1:8318/get
  IP de saída: 127.0.0.2
  nível      : transparente (o IP real chega ao destino)
  via: 1.1 test-proxy
  forwarded: for=127.0.0.1;proto=http
  x-forwarded-for: 127.0.0.1
https://127.0.0.1:8319/get
  IP de saída: 127.0.0.2
  nível      : elite (sem rastro nos cabeçalhos)

Na configuração anônima, só a linha via ficou no primeiro bloco; na configuração elite, nenhuma linha foi listada. O segundo bloco foi igual nas três configurações. As outras verificações, como velocidade, localização e DNS, estão em ordem em Seu proxy está funcionando? Como testar um proxy.

Por que a etiqueta "elite" não é garantia?

Para decidir se uma conexão vem de um proxy, os sites raramente precisam dos cabeçalhos. Eles têm em mãos informações independentes dos cabeçalhos, que o proxy não consegue mudar:

Por isso os endereços "elite" das listas gratuitas dão, na prática, o pior resultado: os cabeçalhos estão limpos, mas, como o endereço foi publicado em uma lista aberta a qualquer pessoa, é muito provável que tenha entrado nos bancos de dados de IP como "proxy aberto". Se aparece na tela o aviso "Anonymous proxy detected" ("proxy anônimo detectado"), o motivo costuma ser esse também: o site não leu cabeçalho nenhum, consultou o seu endereço em um banco de dados. Se você recebe esse aviso sem usar proxy algum, as causas possíveis e o que fazer estão passo a passo em VPN ou proxy detectado: o que significa esse erro.

Cabeçalhos limpos são necessários, porque um proxy que repassa o seu endereço como uma linha já não serve ao propósito desde o início. Suficientes eles não são: como um site vai avaliar a sua conexão depende menos do nível e mais de a quem pertence o endereço IP e do histórico dele. Os termos de uso de uma plataforma continuam valendo do mesmo jeito atrás de um proxy.

Em qual trabalho cada nível importa?

  • Inteligência de ameaças e pesquisa OSINT: o endereço corporativo de uma equipe de segurança que analisa um servidor suspeito não deve ficar no log desse servidor. A configuração transparente faz exatamente o contrário. O desenho desse trabalho está na página de solução de segurança de dados.
  • Monitoramento de preço e estoque em dados públicos: o endereço do seu escritório não deve chegar ao destino como uma linha; um Proxies residenciais que não acrescenta cabeçalhos é a ferramenta usual para isso.
  • Sessões longas com login: tanto quanto o nível, importa que o endereço continue o mesmo. Proxies ISP entrega um endereço fixo registrado em nome de um provedor de internet.
  • Verificação de anúncios e teste de localização: se você mede como a página aparece para um visitante comum daquele país, uma requisição com a linha Via diz ao destino "vim por um intermediário", e a medição deixa de representar esse visitante.
  • Restrição de acesso à sua própria API: se a lista de permissões funciona por IP, o que decide não são os cabeçalhos, e sim o endereço de onde vem a conexão; o detalhe está em IP estático para acesso a API.

Erros comuns

  • Testar o nível com um endereço https://. Não dá para acrescentar cabeçalho dentro do túnel, então todo proxy sai como elite e o teste não diz nada.
  • Esquecer o parâmetro show_env=1 no httpbin. As linhas Via e X-Forwarded-For são retiradas da resposta e um proxy transparente parece limpo.
  • Confundir a etiqueta "elite" com qualidade de IP. A etiqueta fala de cabeçalhos; não diz se o endereço está em uma lista negra.
  • Deixar na configuração padrão um proxy que você mesmo montou. Nos softwares de proxy mais difundidos, repassar o endereço do cliente é o comportamento padrão.
  • Olhar só os cabeçalhos e esquecer o navegador. Um endereço exposto por WebRTC ou DNS tira o valor dos cabeçalhos mais limpos.

Guia de decisão

NecessidadeRecomendação
Filtragem de conteúdo ou cache na rede de uma escola ou empresaProxy transparente; nada está sendo escondido do usuário
Que o seu próprio endereço não chegue ao destinoUm serviço que não acrescenta cabeçalhos (elite); confirme com um teste de eco em http://
Trabalhar só com sites HTTPSNão surge diferença de nível; escolha por tipo de IP e localização
Avaliar um endereço "elite" achado em uma listaNão use; mesmo com cabeçalho limpo, é muito provável que o endereço esteja marcado, e o seu tráfego passa pelo servidor de um desconhecido
Entender o aviso "Anonymous proxy detected"Não é problema de cabeçalho, e sim de reputação do IP; veja nosso artigo sobre o tema
Montar um proxy no seu próprio servidorEscolha com consciência as diretivas de endereço do cliente e de Via no arquivo de configuração e depois faça um teste de eco

Perguntas frequentes

O que significa proxy anônimo?

É o proxy que não repassa o seu endereço IP real ao site de destino. O site vê a conexão a partir do endereço do proxy. Em sentido estrito, isto é, como a etiqueta "anonymous" das listas de proxies, indica o segundo nível: o que esconde o endereço mas revela que é um proxy com um cabeçalho como Via.

Qual é a diferença entre proxy elite e proxy anônimo?

Os dois escondem o seu endereço real. A diferença está em uma única linha: o proxy anônimo deixa na requisição o rastro de um intermediário (Via, Forwarded: for=unknown), o proxy elite não deixa. No primeiro caso o site de destino lê nos cabeçalhos que "esta requisição passou por um proxy"; no segundo, não consegue ler isso nos cabeçalhos.

O proxy transparente esconde meu endereço IP?

Não. O destino recebe a conexão a partir do endereço do proxy, mas o seu endereço real vai escrito na linha X-Forwarded-For ou Forwarded e fica no log do servidor.

Se eu usar um proxy elite, o site não consegue saber que uso proxy?

Pelos cabeçalhos não, por outros caminhos sim: o endereço IP estar registrado em nome de uma empresa de hospedagem, a pontuação de reputação, os registros em listas negras e os sinais incoerentes vindos do navegador não dependem dos cabeçalhos.

O nível do proxy faz diferença em sites HTTPS?

Na prática, não. A requisição HTTPS passa por dentro do túnel CONNECT e o proxy não consegue acrescentar cabeçalhos ao tráfego criptografado. A diferença só aparece em requisições http:// sem criptografia.

Como descubro o nível do meu proxy sem escrever código?

Configure o proxy no navegador e abra http://httpbin.org/get?show_env=1. Se na seção headers da resposta houver Via, o proxy está se denunciando; se em alguma linha houver o seu próprio endereço IP, ele trabalha no nível transparente. Se não houver nenhuma das duas coisas, ele não deixa rastro no nível dos cabeçalhos.

Em resumo

A distinção entre transparente, anônimo e elite são três respostas para uma única pergunta: o que o proxy acrescenta a uma requisição sem criptografia ao encaminhá-la? Se acrescenta o seu endereço real, é transparente; se acrescenta só o rastro de um intermediário, é anônimo; se não acrescenta nada, é elite. Via está definido na RFC 9110 e Forwarded na RFC 7239; X-Forwarded-For é um padrão de fato. Em HTTPS e SOCKS5 o proxy não consegue mexer nos cabeçalhos, então a distinção some sozinha. Dá para conferir o nível em poucos segundos com um teste de eco em um endereço http://. O resultado, sozinho, não promete nada: na avaliação dos sites, o peso real está no dono e no histórico do endereço IP. Você pode comparar o tipo de IP que combina com o seu trabalho em nossos serviços de proxy.