Você está na página 1de 4

Proxy FailOver usando PAC (Proxy Auto-Configuration)

Neste artigo trataremos apenas do arquivo de configuração do proxy o .pac. Não será
abordada a configuração do protocolo WPAD (Windows Proxy Auto Discovery). Caso tenha
interesse poderá ver o artigo completo de configuração dos WPAD em
https://stato.blog.br/wordpress/criando-wpad-para-autoconfiguracao-do-squid-nopfsense/.

O arquivo .pac conterá as configurações de proxy para seu cliente, e deve ser colocado
em um local em um servidor WEB (alcançável via url), e configurado manualmente nos
browsers, ou através do WPAD com servidores DNS ou DHCP.

Há várias maneiras de usar o arquivo de configuração automática para especificar URL


de proxys automático. Veremos alguns pontos chaves, antes de vermos a configuração do
FailOver de Proxy.

Falaremos de algumas condições que podem ser usadas para configurar e ter uma
exceção em sua rede. Um bem comum é o uso de um destino de IP. Quando o destino de IP for
a rede interna, não haveria necessidade de passar por proxy, e qualquer outro destino tem q
passar pelo proxy.

Utilizamos a isInNET para isso com a seguinte sintaxe:

isInNet (host, “endereço IP”, “Mascará de Rede”)

Vejamos um exemplo abaixo. Estamos na rede 10.0.0.0/24. Então qualquer solicitação


com destino a endereços contidos nessa rede, não tem necessidade de passar pelo proxy,
qualquer outro destino é obrigado a passar pelo proxy.

function FindProxyForURL (url,host){


if (isInNET(host, “10.0.0.0”, “255.255.255.0”)
return “DIRECT”;
else
return “PROXY 10.0.0.254:3128”
}

No exemplo acima informamos através do arquivo, que destino para 10.0.0.0/24 não
passam pelo proxy (DIRECT) e qualquer outro destino usará o proxy 10.0.0.254, na porta 3128.

Podemos usar resolução de nomes também, através da configuração dnsDomainIs, ele


verifica o nome do domínio de destino. Por exemplo, se for um domínio interno
empresa.com.br não é necessário proxy, ou se for um destino especifico como
update.microsoft.com, também poderá conectar-se diretamente, e é possível usar mais de um
parâmetro por vez. Vejamos um exemplo juntando isInNet e dnsDomainIs.

function FindProxyForURL (url,host){


if (isInNET(host, “10.0.0.0”, “255.255.255.0”) || dnsDomainIs(host,
“update.microsoft.com”)
return “DIRECT”;
else
return “PROXY 10.0.0.254:3128”
}

Podemos ver acima os caracteres “||” (pipe). Eles significam OU. Dessa forma temos a
condição que se o destino for a rede 10.0.0.0/24 ou o domínio de destino for
update.microsoft.com, eles não passarão pelo proxy (DIRECT), e qualquer outro destino
passará por proxy (PROXY).

No acaso acima usamos o OU através do ||, mas temos a possibilidade de usar o AND
através &&, dependendo da sua configuração.

Tendo já uma base, veremos somente algumas opções interessantes, e


posteriormente, faremos a configuração do FailOver. Veja abaixo algumas opções:

 isPlainHostName(host) Verifica se o host é local. Especificamente o


isPlainHostName verifica se o destino tem algum ponto (.) no nome do host. Quando a
função encontra pontos, significa que o host não é local e retorna como false. Não
requer parâmetros adicionais
 shExpMatch(host, shexp) Verifica um expressão shell. Não confunda com
expressões regulares, aqui é utilizado expressões que usamos no shell, como por
exemplo *.com, *.edu.
 url.substring(inicio,fim) Nesta função é extraindo uma pedaço de uma string
maior, informado em inicio e fim. Por exemplo, poderíamos extrair 5 caracteres de
https://www.stato.blog.br, para capturar somente http e redirecionar para um
determinado proxy. As strings começam a contar em zero, então o formato para
capturar https: seria url.substring(0,6). Vejamos um exemplo para ficar mais claro.

function FindProxyForURL(url, host) {


if (url.substring(0, 5) == "http:") {
return "PROXY proxy:80";
}
else if (url.substring(0, 4) == "ftp:") {
return "PROXY fproxy:80";
}
else if (url.substring(0, 6) == "https:") {
return "PROXY secproxy:8080";
}
else {
return "DIRECT";
}
}

No exemplo acima, um pouco mais complexo, fazermos comparações com o if usando


== para comparação. Ele compara através da subtração das string se os destinos são protoco
http, https ou ftp, com isso retorno o seu proxy especifico.

Existem muitos outros como : localHostOrDomain, isResolvable, dnsResolve,


myIpAddress, weekdayRange, dateRange, timeRange, etc. Para mais informações de uma
olhada em https://developer.mozilla.org/en-
US/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_(PAC)_file

Criando o FailOver

Se você acha que é algo miraculoso, desculpe decepcionar, mas o processo é muito
simples, mas simples até o que vimos anteriormente. Vejamos inicialmente se você tiver um
único Proxy, e esse falhar, você quer que os clientes continuem navegando mesmo que
diretamente. Então faremos isso para rede 10.0.0.0/24.

function FindProxyForURL (url,host){


if (isInNET(host, “10.0.0.0”, “255.255.255.0”)
return “DIRECT”;
else
return “PROXY 10.0.0.254:3128; DIRECT”
}

Como podemos ver acima, vemos que após o retorno PROXY 10.0.0.254:3128, temos
uma outra configuração DIRECT, que significa justamente isso, se caso o proxy 10.0.0.254
falhar, ele poderão sair diretamente.

Vamos para o failover propriamente dito. Logicamente você já deve ter adivinhado né
? Vejamos:

function FindProxyForURL (url,host){


if (isInNET(host, “10.0.0.0”, “255.255.255.0”)
return “DIRECT”;
else
return “PROXY 10.0.0.254:3128;” +
“PROXY 10.0.0.253:3128”
}

Podemos ver que informei um segundo proxy. E utilizei o sinal de mais (+) para
informar que estou continuado em outra linha, mas poderia fazer na mesma linha da seguinte
forma: return “PROXY 10.0.0.254:3128; PROXY 10.0.0.253:3128”;.

E para fechar com chave de ouro, vamos fazer um balanceamento com FailOver, para
fechar:

function FindProxyForURL(url, host){


if (isPlainHostName(host) || dnsDomainIs(host, ".mydomain.com"))
return "DIRECT";
else if (shExpMatch(host, "*.com"))
return "PROXY proxy1.mydomain.com:8080; " +
"PROXY proxy4.mydomain.com:8080";
else if (shExpMatch(host, "*.edu"))
return "PROXY proxy2.mydomain.com:8080; " +
"PROXY proxy4.mydomain.com:8080";
else
return "PROXY proxy3.mydomain.com:8080; " +
"PROXY proxy4.mydomain.com:8080";
}

No exemplo acima, se o host for local ou o destino for mydomain.com, os hosts não
passarão por proxy. No caso de o destino for .com, usará o proxy1, no caso de o destino ser
.edu, usará o proxy2, e qualquer outro destino usará o proxy3. Mas além disso, se caso
qualquer proxy primário caia, será usado o proxy4. Com isso temos tanto uma balanceamento
especificado, como um FailOver em caso de falha do primário.

Espero que aproveitem.

André Stato

Você também pode gostar