Um arquivo de Proxy Auto-Configuration (PAC) é um arquivo JavaScript que navegadores e outros user agents executam para determinar qual servidor proxy, se algum, deve ser usado para uma determinada URL. Esse mecanismo permite um controle dinâmico e granular sobre como o tráfego do cliente é roteado através da infraestrutura de proxy.
Entendendo os arquivos PAC
Um arquivo PAC centraliza a lógica de configuração de proxy em um servidor web, eliminando a necessidade de configurações manuais de proxy no lado do cliente. Quando um cliente está configurado para usar um arquivo PAC, ele baixa e executa o script antes de cada requisição HTTP/HTTPS. A função principal do script, FindProxyForURL(url, host), retorna uma string indicando se deve conectar diretamente, usar um proxy específico ou usar um proxy SOCKS.
Benefícios de usar arquivos PAC
Implementar arquivos PAC oferece várias vantagens operacionais:
- Controle granular: defina regras de roteamento específicas com base em padrões de URL, hostnames, endereços IP, horário do dia ou localização de rede.
- Balanceamento de carga: distribua o tráfego entre múltiplos servidores proxy para evitar sobrecarga.
- Failover: especifique servidores proxy alternativos caso o primário fique indisponível, aumentando a confiabilidade.
- Bypass de tráfego específico: direcione certos domínios internos ou confiáveis para ignorar o proxy completamente, reduzindo latência e consumo de recursos.
- Configuração simplificada do cliente: os clientes precisam apenas da URL do arquivo PAC, o que simplifica implantação e atualizações. Mudanças na lógica de proxy são feitas uma vez no servidor, não em cada cliente.
Estrutura e sintaxe do arquivo PAC
Um arquivo PAC é um arquivo de texto puro escrito em JavaScript, normalmente chamado proxy.pac ou wpad.dat. O núcleo de um arquivo PAC é a função FindProxyForURL(url, host), que precisa estar presente.
Função FindProxyForURL(url, host)
Essa função recebe dois argumentos:
* url: a URL completa do objeto requisitado (por exemplo, http://www.example.com/index.html).
* host: o hostname extraído da URL (por exemplo, www.example.com).
A função deve retornar um valor string:
DIRECT: conecta diretamente ao destino sem usar proxy.PROXY <host>:<port>: usa o servidor proxy HTTP especificado.SOCKS <host>:<port>: usa o servidor proxy SOCKS especificado.- Múltiplas opções: separe vários servidores proxy, ou um proxy e a conexão direta, com ponto e vírgula (por exemplo,
PROXY proxy1.example.com:8080; PROXY proxy2.example.com:8080; DIRECT). O cliente tenta as conexões na ordem especificada.
Funções JavaScript comuns em arquivos PAC
Funções JavaScript padrão estão disponíveis, junto com várias funções específicas de navegador projetadas para a autoconfiguração de proxy:
isPlainHostName(host): retornatruesehostnão contiver um nome de domínio (por exemplo,localhost,intranet-server).dnsDomainIs(host, domain): retornatruesehostpertencer adomain(por exemplo,dnsDomainIs("www.example.com", ".example.com")).shExpMatch(str, pattern): retornatruesestrcorresponder apatternusando correspondência de expressão shell (por exemplo,shExpMatch("http://www.example.com/index.html", "http://*.example.com/*")).isInNet(host, pattern, mask): retornatruese o endereço IP dehostestiver dentro da rede IP especificada porpatternemask(por exemplo,isInNet(host, "192.168.1.0", "255.255.255.0")).hostpode ser um hostname ou um endereço IP.myIpAddress(): retorna o endereço IP da máquina que executa o navegador. Útil para decisões de proxy baseadas em localização.dnsResolve(host): resolve o hostnamehostpara um endereço IP. Retorna uma string vazia se a resolução falhar.weekdayRange(wd1, wd2, gmt): retornatruese o dia da semana atual estiver no intervalo especificado.wd1,wd2são abreviações (por exemplo, "MON", "FRI").gmté opcional, para horário GMT.dateRange(day1, month1, year1, day2, month2, year2, gmt): retornatruese a data atual estiver no intervalo especificado.timeRange(hour1, min1, sec1, hour2, min2, sec2, gmt): retornatruese a hora atual estiver no intervalo especificado.
Exemplo de arquivo PAC
Este exemplo demonstra como ignorar domínios internos, rotear tráfego específico e implementar failover.
function FindProxyForURL(url, host) {
// Defina seus servidores proxy
var PRIMARY_PROXY = "PROXY proxy.example.com:8080";
var SECONDARY_PROXY = "PROXY backup-proxy.example.com:8080";
var SOCKS_PROXY = "SOCKS socks.example.com:1080";
// 1. Conexao direta para hosts locais e dominios internos
// Ignora o proxy para hostnames simples (ex.: "localhost", "intranet-server")
if (isPlainHostName(host)) {
return "DIRECT";
}
// Ignora o proxy para um dominio interno especifico
if (dnsDomainIs(host, ".internal-domain.com")) {
return "DIRECT";
}
// Ignora o proxy para faixas de IP internas especificas
// Nota: myIpAddress() retorna o IP do cliente. Isto verifica se o *destino* e interno.
// Para verificar o IP do cliente, use myIpAddress() e isInNet.
if (isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0")) {
return "DIRECT";
}
// 2. Usa proxy SOCKS para aplicacoes ou protocolos especificos
// Exemplo: rotear todo o trafego FTP por um proxy SOCKS
if (url.substring(0, 4) == "ftp:") {
return SOCKS_PROXY;
}
// 3. Roteia dominios externos especificos pelo proxy primario com failover
// Exemplo: rotear o trafego para partner-site.com pelo proxy primario,
// com fallback para um proxy secundario.
if (dnsDomainIs(host, ".partner-site.com")) {
return PRIMARY_PROXY + "; " + SECONDARY_PROXY;
}
// 4. Bloqueia URLs especificas (retornando um proxy inexistente ou um erro)
// Nota: alguns navegadores podem tratar "PROXY 0.0.0.0:0" como bloqueio.
// Um mecanismo de bloqueio mais robusto normalmente e tratado pelo proprio proxy.
if (shExpMatch(url, "*bad-site.com*")) {
// Retorna um proxy inexistente para bloquear de fato, ou use um proxy de bloqueio dedicado
return "PROXY 127.0.0.1:1"; // Ou um proxy de bloqueio dedicado
}
// 5. Regra padrao: todo o restante do trafego passa pelo proxy primario com failover
return PRIMARY_PROXY + "; " + SECONDARY_PROXY + "; DIRECT";
}
Implantação e distribuição
Para que os clientes usem um arquivo PAC, eles precisam estar configurados para obtê-lo.
Via servidor HTTP/HTTPS
O método mais comum é hospedar o arquivo PAC em um servidor web padrão (Apache, Nginx, IIS) e configurar os navegadores ou sistemas operacionais dos clientes com a sua URL.
* Configuração do servidor: garanta que o servidor entregue o arquivo PAC com o MIME type correto: application/x-ns-proxy-autoconfig.
* Configuração do cliente: nas configurações do navegador (ou nas configurações de rede do SO), selecione a opção "Usar script de configuração automática de proxy" e informe a URL completa (por exemplo, http://proxyconfig.example.com/proxy.pac).
Web Proxy Auto-Discovery Protocol (WPAD)
O WPAD permite que os clientes descubram automaticamente a URL do arquivo PAC sem configuração manual. Isso normalmente envolve:
1. DNS: criar uma entrada DNS para wpad.<domain> que aponte para o servidor web que hospeda o wpad.dat.
2. DHCP: configurar uma opção DHCP (opção 252) para fornecer a URL do arquivo PAC.
Embora conveniente, o WPAD tem implicações de segurança (por exemplo, potencial para servidores WPAD maliciosos) e muitas vezes é desabilitado ou usado com cautela. A configuração direta da URL é geralmente preferida por segurança e controle explícito.
Group Policy Objects (GPO) para Windows
Em domínios Windows, as URLs de arquivos PAC podem ser distribuídas centralmente para as máquinas cliente via Group Policy:
* Navegue até User Configuration > Policies > Windows Settings > Internet Explorer Maintenance > Connection > Proxy Settings.
* Habilite "Automatic configuration" e informe a URL do arquivo PAC.
Solução de problemas com arquivos PAC
Problemas com arquivos PAC geralmente vêm de erros de sintaxe, cache ou problemas de rede.
- Erros de sintaxe: até erros mínimos de JavaScript podem impedir o funcionamento do arquivo PAC. Use um linter JavaScript ou um validador dedicado de arquivos PAC. Os navegadores podem registrar erros no console de desenvolvedor (por exemplo, F12 no Chrome/Firefox).
- MIME type incorreto: se o servidor web entregar o arquivo PAC com um MIME type incorreto, os clientes podem não processá-lo corretamente. Verifique
application/x-ns-proxy-autoconfig. - Problemas de cache: os navegadores fazem cache agressivo de arquivos PAC. Ao fazer alterações, limpe o cache do navegador ou force uma atualização (por exemplo,
Ctrl+F5). Alguns navegadores oferecem uma opção para desabilitar o cache de arquivos PAC durante a depuração. - Acessibilidade de rede: garanta que o cliente consiga alcançar o servidor web que hospeda o arquivo PAC. Verifique a resolução DNS e as regras de firewall.
- Função
FindProxyForURL: confirme que a funçãoFindProxyForURL(url, host)está corretamente definida e retorna strings de proxy válidas. - Ferramentas de teste: as ferramentas de desenvolvedor do navegador (aba Network) mostram qual proxy foi usado em uma requisição. Testadores online de arquivos PAC podem simular requisições contra o seu script.
Arquivo PAC vs. outros métodos de configuração de proxy
| Recurso | Arquivo PAC | Configurações diretas de proxy | WPAD |
|---|---|---|---|
| Método de configuração | URL de script JavaScript | Entrada manual de IP/porta | Descoberta automática via DNS/DHCP |
| Controle granular | Alto (baseado em lógica) | Baixo (todo o tráfego vai para um proxy ou direto) | Alto (usa arquivo PAC) |
| Failover/balanceamento | Sim (embutido na lógica do script) | Não (proxy único) | Sim (embutido na lógica do arquivo PAC) |
| Regras de bypass | Sim (embutidas na lógica do script) | Lista manual de exclusões | Sim (embutidas na lógica do arquivo PAC) |
| Complexidade de implantação | Moderada (hospedar arquivo no servidor web, configurar URL) | Baixa (manual por cliente) | Alta (configuração DNS/DHCP, servidor web) |
| Manutenção | Centralizada (editar script no servidor) | Descentralizada (manual por cliente) | Centralizada (editar script no servidor, DNS/DHCP) |
| Considerações de segurança | Injeção de script, distribuição não criptografada | Básicas | Spoofing de DNS/DHCP (risco maior), injeção de script |
Considerações de segurança
- Integridade: arquivos PAC contêm informações sensíveis de roteamento. Garanta que o arquivo PAC esteja hospedado em um servidor web seguro e confiável e seja entregue por HTTPS, para evitar adulteração ou interceptação durante o download.
- Scripts maliciosos: um arquivo PAC comprometido pode redirecionar o tráfego do cliente para proxies maliciosos, facilitando ataques man-in-the-middle, coleta de credenciais ou exfiltração de dados. Use apenas arquivos PAC de fontes confiáveis.
- Divulgação de informações: evite incluir detalhes sensíveis da rede interna em arquivos PAC de acesso público. Embora o arquivo em si seja código, sua lógica pode revelar a topologia da rede.
- Vulnerabilidades do WPAD: o mecanismo de descoberta automática do WPAD pode ser explorado se um atacante controlar respostas DNS ou DHCP, direcionando clientes para um servidor WPAD malicioso. Use WPAD com cautela e com medidas de segurança adequadas.
