ProxynetProxynet

O que é um arquivo PAC? FindProxyForURL, sintaxe e exemplos

Publicado:

15 min de leitura

Acar Diveroli
Autor: Acar Diveroli
Rotas em linha partem de um único nó de decisão para DIRECT, PROXY e SOCKS5; a rota PROXY até o domínio de destino é azul.

Uma pequena equipe de monitoramento de preços configura um proxy residencial como proxy do sistema no Windows. Poucos dias depois, a página de consumo mostra muito mais gigabytes do que o trabalho deveria gastar. Atualizações do navegador, videochamadas e o webmail também passaram pelo proxy, embora só duas lojas concorrentes precisassem ser vistas de outro endereço IP. A equipe precisava de uma regra que dissesse "estes sites pelo proxy, todo o resto direto". Essa regra é um arquivo PAC.

Este guia explica o que é um arquivo PAC (arquivo de configuração automática de proxy, do inglês proxy auto-config), como o navegador o executa e o que FindProxyForURL pode retornar. Ele cobre as funções auxiliares e suas armadilhas, um exemplo testado que manda só os sites de destino por um proxy, o WPAD e seus riscos, por que o arquivo não pode guardar uma senha e como a mesma regra reduz o tráfego de proxy.

O que é um arquivo PAC?

Um arquivo PAC é um arquivo JavaScript em texto puro que define uma única função: FindProxyForURL(url, host). A função recebe o endereço que o navegador está prestes a abrir e retorna uma string que indica a rota. A Netscape adicionou a configuração automática de proxy ao Navigator 2.0, a mesma versão que introduziu o JavaScript.

O PAC não tem RFC nem especificação formal. Cada navegador traz a sua própria implementação, e os detalhes variam. A referência do MDN sobre arquivos PAC (em inglês) descreve o terreno comum, incluindo o tipo MIME, application/x-ns-proxy-autoconfig. O arquivo geralmente termina em .pac; quando é encontrado via WPAD, ele se chama wpad.dat.

Uma configuração manual de proxy manda todo o tráfego para um único proxy. Um arquivo PAC decide de novo a cada requisição, então o mesmo navegador pode acessar uma loja por um proxy e a wiki do escritório diretamente.

Como o navegador usa um arquivo PAC?

  1. Busca o arquivo. O navegador o baixa do endereço que você informou ou do endereço que o WPAD encontrou. O Chrome busca o arquivo diretamente, nunca por um proxy, e precisa de uma resposta HTTP 200 em até 30 segundos, com um corpo menor que 1 MB.
  2. Chama a função antes de cada requisição. Em endereços https://, o Chrome remove antes o caminho e a query string, então a função vê https://store.example/, e não o endereço completo. O Chrome começou a fazer isso na versão 52 e, desde a versão 75, não é possível desativar.
  3. Lê a resposta da esquerda para a direita. A string é dividida nos pontos e vírgulas. O navegador tenta a primeira entrada e só passa para a seguinte se esse proxy não puder ser alcançado.
  4. Deixa de lado um proxy que falhou. Ele vai para o fim da lista por um tempo. Quanto tempo depende do navegador, então não monte regras em torno de um tempo fixo.
  5. Recorre a uma alternativa quando o arquivo falta. Se o Chrome não consegue baixar o arquivo, ele passa para a próxima opção, geralmente uma conexão direta, sem nenhum aviso. Só um script PAC marcado como obrigatório faz as requisições falharem em vez disso. No nosso teste, um arquivo com erro de sintaxe também mandou o Chrome para a conexão direta.

As regras completas estão na documentação de suporte a proxy do Chromium (em inglês).

O que FindProxyForURL pode retornar?

A função retorna uma única string. Cada entrada é uma palavra-chave seguida, no caso dos proxies, de host:port.

Valor retornadoO que fazSuporte (fonte)Atenção
DIRECTConecta sem proxyPalavra-chave padrão (MDN)Como reserva em uma regra de destino, envia a requisição a partir do seu IP real
PROXY pr.proxynet.io:8000Usa um proxy HTTPPalavra-chave padrão (MDN, Chromium)Se o proxy pedir senha, o navegador mostra uma janela de login 407
SOCKS5 pr.proxynet.io:1080Usa um proxy SOCKS5Chrome e Firefox (Chromium, MDN)O Chrome não envia credenciais SOCKS5, então o proxy precisa liberar o seu IP
HTTPS proxy.example:443Usa um proxy que você alcança por TLSChrome e Firefox (Chromium, MDN)O proxy precisa falar TLS nessa porta
SOCKS proxy.example:1080Usa um servidor SOCKSPalavra-chave padrão (MDN)O Chrome lê um SOCKS sozinho como SOCKS4

O Firefox também aceita HTTP host:port e SOCKS4 host:port, mas o parser do Chrome não conhece HTTP, então PROXY é a grafia que funciona em todos. O Chrome lê as palavras-chave em maiúsculas ou minúsculas; o MDN as escreve em maiúsculas, e nós também.

Uma cadeia como "PROXY a.example:8000; PROXY b.example:8000; DIRECT" significa: tente o primeiro proxy, depois o segundo, e conecte diretamente só se os dois estiverem fora do ar. Esse último passo serve para a navegação em geral e é errado para coleta de dados. A diferença de protocolo entre os dois tipos de proxy está em Diferença entre SOCKS e HTTP proxy.

Quais funções auxiliares um arquivo PAC pode usar?

As funções embutidas se dividem em dois grupos.

Verificações de string, rápidas e seguras: shExpMatch (padrões com * e ? no estilo do shell), dnsDomainIs, isPlainHostName (nome sem ponto), localHostOrDomainIs, dnsDomainLevels e as funções de tempo weekdayRange, dateRange e timeRange.

Funções que consultam o DNS: dnsResolve, isResolvable e isInNet quando recebe um nome de host em vez de um endereço IP. O MDN avisa que elas precisam consultar o servidor DNS e raramente são necessárias.

Verificamos três armadilhas comuns com o pacparser, que executa arquivos PAC no motor QuickJS:

  • dnsDomainIs(host, "shop.example") só compara o fim da string, então evilshop.example também corresponde.
  • dnsDomainIs(host, ".shop.example") corrige isso, mas o shop.example sozinho deixa de corresponder. Verifique os dois: host === "shop.example" || dnsDomainIs(host, ".shop.example").
  • shExpMatch(host, "*.panel.example") não corresponde ao próprio panel.example.

myIpAddress() pode retornar o endereço errado em uma máquina com várias interfaces de rede, então evite regras que dependam do IP da própria máquina.

Como escrever um arquivo PAC que manda só os sites de destino pelo proxy

Este é o cenário da introdução em um único arquivo. Os destinos do monitoramento de preços e os subdomínios deles passam por um Proxies residenciais. Um painel que precisa manter um único endereço passa por um proxy SOCKS5, com um proxy HTTP de reserva. Todo o resto vai direto. Troque os domínios .example pelos seus.

js
// proxy.pac: só os sites da lista usam proxy, todo o resto vai direto.
function FindProxyForURL(url, host) {
  host = host.toLowerCase();

  // 1. Nomes simples (intranet, impressora) e localhost: sempre direto.
  if (isPlainHostName(host) || host === "localhost") {
    return "DIRECT";
  }

  // 2. Endereços IP privados e de loopback: direto. A checagem com regex
  //    garante que isInNet só receba um endereço IP e nunca consulte o DNS.
  if (/^\d{1,3}(\.\d{1,3}){3}$/.test(host) &&
      (isInNet(host, "10.0.0.0", "255.0.0.0") ||
       isInNet(host, "172.16.0.0", "255.240.0.0") ||
       isInNet(host, "192.168.0.0", "255.255.0.0") ||
       isInNet(host, "127.0.0.0", "255.0.0.0"))) {
    return "DIRECT";
  }

  // 3. Destinos do monitoramento de preços e seus subdomínios: proxy residencial.
  //    Sem "; DIRECT" no fim: se o proxy cair, a requisição falha
  //    em vez de sair do seu próprio endereço IP.
  var targets = ["shop.example", "store.example"];
  for (var i = 0; i < targets.length; i++) {
    if (host === targets[i] || dnsDomainIs(host, "." + targets[i])) {
      return "PROXY pr.proxynet.io:8000";
    }
  }

  // 4. Um painel que precisa manter um único IP: SOCKS5 primeiro, HTTP como reserva.
  //    Coloque aqui o host e as portas do seu proxy ISP estático.
  if (host === "panel.example" || shExpMatch(host, "*.panel.example")) {
    return "SOCKS5 pr.proxynet.io:1080; PROXY pr.proxynet.io:8000";
  }

  // 5. Todo o resto: direto.
  return "DIRECT";
}

O host é convertido para minúsculas primeiro, porque as funções auxiliares comparam strings de forma exata. O isInNet só roda depois que a regex confirmou um endereço IP, então o script nunca espera pelo DNS. O código fica em var e loops simples, porque nem todo motor PAC executa JavaScript moderno. Em um arquivo PAC, a cadeia com ponto e vírgula é o mecanismo de nova tentativa; a lógica de novas tentativas em código fica no scraper (Códigos de status HTTP no web scraping).

Como testamos

Rodamos o arquivo no pacparser 1.5.2, com Python 3.13, contra dez hosts, e cada um retornou a rota esperada, incluindo WWW.Shop.Example (proxy) e notshop.example (direto). Depois servimos o arquivo localmente com o tipo application/x-ns-proxy-autoconfig, apontamos os endpoints para dois proxies de teste locais e abrimos o Chrome 154 com --proxy-pac-url. Os hosts de destino chegaram ao proxy HTTP e os outros foram direto. Para o painel, o Chrome tentou primeiro o SOCKS5, oferecendo só o método "sem autenticação", e depois passou para a reserva HTTP. Uma cópia com uma chave faltando mandou todas as requisições direto, sem aviso.

Como apontar um dispositivo ou navegador para um arquivo PAC?

Sirva o arquivo a partir de um servidor web, por HTTPS sempre que puder, com o Content-Type que o MDN pede. Depois informe o endereço dele:

Para alternar entre alguns perfis dentro de um único navegador, uma extensão costuma ser mais simples (SwitchyOmega). Se você encontrou um endereço PAC em um computador do trabalho, veja como encontrar o endereço do servidor proxy.

O que é WPAD e por que é um risco?

O WPAD (Web Proxy Auto-Discovery) está por trás da opção "Detectar configurações automaticamente": o cliente procura um arquivo PAC na rede. O rascunho do WPAD, de 1999, lista vários métodos de descoberta, e os clientes usam principalmente dois: a opção 252 do DHCP, que entrega a URL, e consultas DNS por um host chamado wpad. Uma máquina chamada pc1.sales.corp.example pergunta por wpad.sales.corp.example, depois por wpad.corp.example, e pede /wpad.dat ao primeiro nome que responder. O Chrome tenta o DHCP antes do DNS, mas só oferece o método DHCP no Windows e no ChromeOS. O rascunho expirou sem virar RFC.

O cliente confia em quem responder. Se um notebook configurado para detecção automática entra na rede de um café, ou se a consulta WPAD dele vaza para o DNS público, o servidor de um desconhecido pode entregar a ele um arquivo PAC e rotear o tráfego do notebook. O alerta TA16-144A da CISA explica como os novos domínios de primeiro nível facilitaram essas colisões de nomes.

Para proteger as suas máquinas:

  • Desligue a detecção automática onde ela não for necessária, principalmente em notebooks que saem do escritório.
  • Informe o endereço PAC explicitamente, por HTTPS.
  • No Windows 10 versão 1809, no Windows Server 2019 e em versões posteriores, defina o valor de registro DisableWpad como 1, como a Microsoft documenta, e desligue também a detecção nas Configurações, porque os navegadores leem essa opção.
  • Registre e bloqueie no firewall as requisições de saída para wpad.dat, como a CISA sugere (Proxy ou firewall).

Por que um arquivo PAC não pode guardar usuário e senha?

Um arquivo PAC responde a uma única pergunta: para onde esta requisição deve ir? Ele retorna uma palavra-chave, um host e uma porta, sem nenhum campo para credenciais.

Se um proxy HTTP pede senha, ele responde 407 e o navegador mostra uma janela de login. O Chrome não oferece nenhum método de autenticação para SOCKS5, então uma entrada SOCKS5 só funciona quando o proxy libera o seu IP. Para trabalhos automatizados e SOCKS5, a autenticação por whitelist de IP é o caminho prático: você adiciona o seu IP de saída à lista de permitidos na sua conta de proxy. Não coloque credenciais em URLs para contornar o problema. Os dois métodos, incluindo o que acontece quando o seu IP muda, estão comparados em Autenticação de proxy: user:pass ou whitelist de IP.

Como um arquivo PAC reduz o tráfego e o custo do proxy?

Proxies residenciais e móveis são cobrados por gigabyte; proxies ISP e de datacenter, por endereço IP. Com um proxy no sistema inteiro, atualizações, videochamadas e downloads também entram na conta. Um arquivo PAC manda só os domínios de destino pelo proxy residencial, então os gigabytes cobrados correspondem ao trabalho.

Para um painel que precisa manter um único endereço entre sessões, um produto cobrado por IP se encaixa melhor: um Proxies ISP ou um Proxies SOCKS5 com o seu IP na whitelist.

Casos de uso

  • Monitoramento de preços: só as lojas que você acompanha usam o proxy, dentro das regras do robots.txt delas e com uma taxa de requisições moderada (monitoramento de preços da concorrência).
  • Redes de escritório: endereços internos vão direto, e o tráfego externo passa por um proxy da empresa, como o Squid (configuração do Squid proxy).
  • Verificações por país: cada domínio de destino recebe o tipo de saída de que precisa (proxy residencial ou datacenter).
  • Testar um proxy novo: um domínio de teste passa por ele enquanto a navegação normal continua direta (como testar um proxy).
  • Verificação de vazamentos: uma regra PAC cobre as requisições do navegador, mas o WebRTC e o DNS ainda podem revelar o seu endereço (vazamentos de WebRTC e DNS).
  • Proxies locais: um proxy de depuração em 127.0.0.1:8080 recebe só os domínios que você inspeciona (porta 8080).

Erros comuns

Estes erros são específicos de arquivos PAC; para erros de conexão em geral, veja Servidor proxy não está respondendo.

  • Tipo MIME errado ou arquivo ausente. O MDN pede que os servidores enviem application/x-ns-proxy-autoconfig. O Chrome também exige exatamente 200; um 404 é uma busca que falhou e vira conexão direta.
  • Não ver mudança depois de editar. Os navegadores mantêm o script carregado na memória. Use Recarregar nas configurações de conexão do Firefox, Re-apply settings em chrome://net-internals/#proxy ou reinicie o navegador.
  • Consultar o DNS no script. isInNet com nome de host, dnsResolve e isResolvable fazem uma consulta por requisição, e um servidor DNS lento faz toda página esperar.
  • Erro de sintaxe. O Chrome vai direto sem mensagem. Teste o arquivo com o pacparser antes de colocá-lo em produção.
  • Regras de caminho em HTTPS. shExpMatch(url, "*/products/*") nunca corresponde a um endereço https:// no Chrome, porque o caminho é removido. No nosso teste, o mesmo tipo de regra correspondeu em http://. Faça a correspondência pelo host.
  • O ponto no dnsDomainIs. Sem ele, domínios parecidos correspondem; com ele, o domínio sozinho não corresponde.
  • Escrever HTTP host:port ou um SOCKS sozinho. O Chrome rejeita o primeiro e lê o segundo como SOCKS4.
  • Uma reserva DIRECT em destinos de coleta de dados. Quando o proxy cai, o site vê o seu próprio IP.

Guia de decisão

NecessidadeRecomendação
Mandar só alguns domínios por um proxyUm arquivo PAC: PROXY para os destinos, DIRECT para o resto
Todo o tráfego do navegador por um único proxyNão precisa de PAC; um proxy manual no sistema basta (Windows e Chrome)
O seu IP real nunca pode chegar a um site de destinoRetorne só PROXY para ele, sem a reserva ; DIRECT
Usar SOCKS5 no ChromeRetorne SOCKS5 host:port e coloque o seu IP na whitelist
O mesmo endereço PAC em todos os computadores do escritórioDistribua por política ou gerenciamento de dispositivos; se usar WPAD, proteja o DHCP e o DNS
Um notebook também é usado em redes de cafés e de casaDesligue a detecção automática; defina DisableWpad no Windows
Um painel precisa do mesmo IP em toda sessãoAponte esse domínio para um proxy ISP estático

Perguntas frequentes

Como abrir ou editar um arquivo PAC?

Um arquivo PAC é texto puro, então o Bloco de Notas ou qualquer editor de código o abre. Um navegador que abre a URL mostra o texto ou baixa o arquivo, conforme o tipo MIME. Outros formatos usam a mesma extensão .pac; se o arquivo parecer dados binários, ele não é uma configuração de proxy.

Onde fica o arquivo PAC no Windows?

Geralmente ele não é um arquivo local. O Windows guarda o endereço informado em Usar script de configuração e baixa o arquivo de lá. Os passos para ver ou alterar esse endereço estão em configuração de proxy no Windows e no Chrome.

Um arquivo PAC pode incluir usuário e senha?

Não. A função retorna só uma palavra-chave, um host e uma porta. Para um proxy HTTP, o navegador pede as credenciais em uma janela 407; para trabalhos automatizados e SOCKS5, use a autenticação por whitelist de IP.

Qual é a diferença entre PAC e WPAD?

O arquivo PAC contém as regras. O WPAD encontra o endereço de um arquivo PAC na rede local via DHCP ou DNS. Você pode usar um arquivo PAC sem WPAD informando o endereço você mesmo, o que também é a opção mais segura.

Um arquivo PAC pode retornar um proxy SOCKS5?

Sim, como SOCKS5 host:port; o Chrome e o Firefox seguem essa entrada. O Chrome não envia credenciais SOCKS5, então coloque o seu IP na whitelist do proxy.

Mudei o meu arquivo PAC. Por que o navegador ainda usa as regras antigas?

O navegador mantém a versão que carregou até recarregar a configuração. Clique em Recarregar no Firefox, use Re-apply settings em chrome://net-internals/#proxy ou reinicie o navegador. Um nome de arquivo novo para cada versão (proxy-v2.pac) elimina a dúvida.

Em resumo

Um arquivo PAC transforma o proxy de um interruptor liga/desliga em uma decisão para cada requisição: FindProxyForURL olha o host e retorna DIRECT, PROXY ou SOCKS5, e o navegador tenta as entradas da esquerda para a direita. Faça a correspondência pelo host, evite funções que consultam o DNS e deixe a reserva DIRECT fora das regras para destinos de coleta de dados. Informe você mesmo o endereço PAC, por HTTPS, e desligue o WPAD onde ele não for necessário. Como o arquivo não pode guardar senha, combine-o com a autenticação por whitelist de IP e escolha o tipo de proxy de cada regra nos nossos serviços de proxy.