Wpad no pfsense



  • boa noite pessoal

    estou configurando um wpad.dat, mas estou com duvida na configuração esta configuração que tenho esta funcionando

    
    function FindProxyForURL(url, host)
    {
    	var host_ip;
    		host_ip= dnsResolve(host);
    			if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
    				return "DIRECT";
    			if (isInNet(myIpAddress(), "192.168.15.0", "255.255.255.0"))
    				return "PROXY 192.168.15.1:3128";
    			else
    				return "DIRECT";
    }
    
    

    aqui já possui uma opção para ignorar as rede localhost, mas como posso para fazer se tenho alguns site que quero não passe pelo proxy e como configurar mais uma rede, pois este arquivo vou usar em duas rede

    a rede 192.168.15.0 usa o proxy 192.168.15.1:3128 já a rede 192.168.2.0 usa o proxy 192.168.2.1:3128

    a perguntas para os amigos é como posso estar configurando isso neste scripts.



  • 
    function FindProxyForURL(url,host){
    
      // resolve o ip do host
      var host_ip=dnsResolve(host);
    
      // If the requested website is hosted within the internal network, send direct.
      if (isPlainHostName(host) ||
        isInNet(host_ip, "10.0.0.0", "255.0.0.0") ||
        isInNet(host_ip, "172.16.0.0",  "255.240.0.0") ||
        isInNet(host_ip, "192.168.0.0",  "255.255.0.0") ||
        isInNet(host_ip, "127.0.0.0", "255.255.255.0"))
      return "DIRECT";
    
      // Dominio sem proxy
      //if (shExpMatch(host, "site.a.b.c") || shExpMatch(host, "site.x.y.z")) return "DIRECT";
    
      // IP sem proxy
      //if (myIpAddress(), "0.0.0.0.0", "255.255.255.0") return "DIRECT";
    
      // Regra deafult com proxy 
      return "PROXY 192.168.1.1:3128";
    }
    
    

    Esse que uso pra uma rede, só fazer as adaptações.
    Observe que se quiser usar uma regra de bypass precisa descomentar a linha removendo os "//";



  • boa noite Tomas Waldow

    se o wpad for para uma outra rede sendo que o proxy é diferente sabes como posso fazer?

    é que tenho duas rede e cada é independente mais irá usar o pfsense como base.



  • Isaias tenho este funcionando para várias redes:

    
    function FindProxyForURL(url, host){
       var host_ip;
    
       host_ip= dnsResolve(host);
       if (isInNet(myIpAddress(), "192.168.7.0", "255.255.255.0"))
          if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
             return "DIRECT";
          else if (isInNet(host_ip, "192.168.7.0", "255.255.255.0"))
             return "DIRECT";
          else 
             return "PROXY 192.168.7.1:3128";
       else if (isInNet(myIpAddress(), "192.168.12.0", "255.255.255.0"))
          if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
             return "DIRECT";
          else if (isInNet(host_ip, "192.168.12.0", "255.255.255.0"))
             return "DIRECT";
          else 
             return "PROXY 192.168.12.1:3128";
       else if (isInNet(myIpAddress(), "192.168.13.0", "255.255.255.0"))
          if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
             return "DIRECT";
          else if (isInNet(host_ip, "192.168.13.0", "255.255.255.0"))
             return "DIRECT";
          else 
             return "PROXY 192.168.13.1:3128";
       else if (isInNet(myIpAddress(), "192.168.14.0", "255.255.255.0"))
          if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
             return "DIRECT";
          else if (isInNet(host_ip, "192.168.14.0", "255.255.255.0"))
             return "DIRECT";
          else 
             return "PROXY 192.168.14.1:3128";
       else if (isInNet(myIpAddress(), "192.168.15.0", "255.255.255.0"))
          if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
             return "DIRECT";
          else if (isInNet(host_ip, "192.168.15.0", "255.255.255.0"))
             return "DIRECT";
          else 
             return "PROXY 192.168.15.1:3128";
       else if (isInNet(myIpAddress(), "192.168.16.0", "255.255.255.0"))
          if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
             return "DIRECT";
          else if (isInNet(host_ip, "192.168.16.0", "255.255.255.0"))
             return "DIRECT";
          else 
             return "PROXY 192.168.16.1:3128";
       else if (isInNet(myIpAddress(), "172.16.0.0", "255.255.0.0"))
          if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
             return "DIRECT";
          else if (isInNet(host_ip, "172.16.0.0", "255.255.0.0"))
             return "DIRECT";
          else 
             return "PROXY 172.16.0.1:3128";
       else
          return "DIRECT";
    }
    
    


  • Reinaldo bacana seu script

    você o tomas recomendo usar como, tenho sites e ips não não vão usar o proxy, é melhor usar no script ou fazer uma outro processo no pfsense se houver

    como posso usar aptar uma parte do Tomas

    
     // Dominio sem proxy
      //if (shExpMatch(host, "site.a.b.c") || shExpMatch(host, "site.x.y.z")) return "DIRECT";
    
      // IP sem proxy
      //if (myIpAddress(), "0.0.0.0.0", "255.255.255.0") return "DIRECT";
    
    

    podes dar uma dica



  • 
    function FindProxyForURL(url,host){
    
      // If the requested website is hosted within the internal network, send direct.
      if (isPlainHostName(host) ||
        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") ||
        isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
      return "DIRECT";
    
      // Dominio sem proxy
      //if (shExpMatch(host, "site.a.b.c") || shExpMatch(host, "site.x.y.z")) return "DIRECT";
    
      // IP sem proxy
      //if (myIpAddress(), "0.0.0.0.0", "255.255.255.0") return "DIRECT";
    
      // Regra deafult com proxy em ordem de fail-ver 
      return "PROXY 1.2.3.4:3128; PROXY 5.6.7.8:3128";
    }
    
    

    Pode usar esse, muda conforme precisa.
    Na ultima linha coloca as redes que vai usar, no caso ele tante o primeiro e se não encontra vai no segundo.

    E os ips que não vão usar cria uma linha fazendo o bypass para cada IP.



  • vou testar tomas

    obrigado fera



  • @isaiasbertin:

    Reinaldo bacana seu script

    você o tomas recomendo usar como, tenho sites e ips não não vão usar o proxy, é melhor usar no script ou fazer uma outro processo no pfsense se houver

    como posso usar aptar uma parte do Tomas

    
     // Dominio sem proxy
      //if (shExpMatch(host, "site.a.b.c") || shExpMatch(host, "site.x.y.z")) return "DIRECT";
    
      // IP sem proxy
      //if (myIpAddress(), "0.0.0.0.0", "255.255.255.0") return "DIRECT";
    
    

    podes dar uma dica

    Tem várias formas pra fazer isso é uma questão de lógica.

    Fiz uma alteração na primeira rede com o exemplo do Tomas junto.

    
    function FindProxyForURL(url, host){
       var host_ip;
    
       host_ip= dnsResolve(host);
       if (isInNet(myIpAddress(), "192.168.7.0", "255.255.255.0")) 
          if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
             return "DIRECT";
          else if (isInNet(host_ip, "192.168.7.0", "255.255.255.0"))
             return "DIRECT";
          else if (shExpMatch(host, "site.a.b.c") || shExpMatch(host, "site.x.y.z")) 
             return "DIRECT";
          else if myIpAddress() = "0.0.0.0.0"
             return "DIRECT";
          else
             return "PROXY 192.168.7.1:3128";
       else if (isInNet(myIpAddress(), "192.168.12.0", "255.255.255.0"))
          if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
             return "DIRECT";
          else if (isInNet(host_ip, "192.168.12.0", "255.255.255.0"))
             return "DIRECT";
          else 
             return "PROXY 192.168.12.1:3128";
       else if (isInNet(myIpAddress(), "192.168.13.0", "255.255.255.0"))
          if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
             return "DIRECT";
          else if (isInNet(host_ip, "192.168.13.0", "255.255.255.0"))
             return "DIRECT";
          else 
             return "PROXY 192.168.13.1:3128";
       else if (isInNet(myIpAddress(), "192.168.14.0", "255.255.255.0"))
          if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
             return "DIRECT";
          else if (isInNet(host_ip, "192.168.14.0", "255.255.255.0"))
             return "DIRECT";
          else 
             return "PROXY 192.168.14.1:3128";
       else if (isInNet(myIpAddress(), "192.168.15.0", "255.255.255.0"))
          if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
             return "DIRECT";
          else if (isInNet(host_ip, "192.168.15.0", "255.255.255.0"))
             return "DIRECT";
          else 
             return "PROXY 192.168.15.1:3128";
       else if (isInNet(myIpAddress(), "192.168.16.0", "255.255.255.0"))
          if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
             return "DIRECT";
          else if (isInNet(host_ip, "192.168.16.0", "255.255.255.0"))
             return "DIRECT";
    }
    
    

    Eu separei o proxy por rede, mas poderia ser mesmo pra todas as redes. Seria o exemplo do Tomas com uma observação o proxy teria que ser a primeira linha, pois na ultima sem nenhum condição ele vai retornar o proxy para os ips e redes que passou para direct nas condições acima
    o correto seria:

    
    function FindProxyForURL(url,host){
    
      // Regra deafult com proxy em ordem de fail-ver 
      return "PROXY 1.2.3.4:3128; PROXY 5.6.7.8:3128";
    
      // If the requested website is hosted within the internal network, send direct.
      if (isPlainHostName(host) ||
        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") ||
        isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
      return "DIRECT";
    
    

    // Dominio sem proxy
      //if (shExpMatch(host, "site.a.b.c") || shExpMatch(host, "site.x.y.z")) return "DIRECT";

    // IP sem proxy
      //if (myIpAddress(), "0.0.0.0.0", "255.255.255.0") return "DIRECT";

    }



  • Bacana Reinaldo

    vou fazer os teste feras.



  • Não está errado não, a regra default tem que ser a última, não pode ser a primeira.
    Senão não faz sentido a outras linhas, pois elas verificam o destino se é local, etc.

    A regra lá é em fail over, vai tentar um e caso não encontre tenta o segundo, sem precisar como "if" para ver que rede está.

    Pode ver no site: http://findproxyforurl.com/example-pac-file/



  • @Tomas:

    Não está errado não, a regra default tem que ser a última, não pode ser a primeira.
    Senão não faz sentido a outras linhas, pois elas verificam o destino se é local, etc.

    A regra lá é em fail over, vai tentar um e caso não encontre tenta o segundo, sem precisar como "if" para ver que rede está.

    Pode ver no site: http://findproxyforurl.com/example-pac-file/

    Tomas, analisando a lógica do java script ele retorna o valor da functcion no return e não no final da function como outra linguagens.

    Se foce como o pascal por exemplo o return teria sempre o ultimo valor, por isso fiz esta confusão. Pelo que analisei no primeiro return que ele encontra ja termina a function com o retorno. Desta forma no meu script não precisa de tantos else if, pois eu usei isso pra isolar cada condição.

    Vou rescrever o meu script e posto aqui



  • Então, eu não gosto desses "if", acho que acaba complicando.
    Da forma que passei fica mais simples.



  • @reinaldo.feitosa:

    // Regra deafult com proxy em ordem de fail-ver
      return "PROXY 1.2.3.4:3128; PROXY 5.6.7.8:3128";

    aqui você está chamando a função return e não definindo um valor pra ela, por isso seu script parava sempre no primeiro teste.



  • Marcello, este exemplo peguei do site: http://findproxyforurl.com/example-pac-file/

    La consta como abaixo:
    // DEFAULT RULE: All other traffic, use below proxies, in fail-over order.
    return "PROXY 4.5.6.7:8080; PROXY 7.8.9.10:8080";

    Pra mim está funcionando.



  • No final, não no começo.



  • Certo, entendi.



  • colocar esta condição sempre no final do script certo

    // DEFAULT RULE: All other traffic, use below proxies, in fail-over order.
    return "PROXY 4.5.6.7:8080; PROXY 7.8.9.10:8080";



  • Sim, mas só se for usar mais de uma rede.
    Para uma rede só não precisa colocar os dois IPs.

    Para ma rede pode ser: return "PROXY 192.168.1.1:3128";



  • @marcelloc:

    @reinaldo.feitosa:

    // Regra deafult com proxy em ordem de fail-ver
      return "PROXY 1.2.3.4:3128; PROXY 5.6.7.8:3128";

    aqui você está chamando a função return e não definindo um valor pra ela, por isso seu script parava sempre no primeiro teste.

    Sim Marcelo, agora entendi, em outras linguagens o valor é definido e o return só acontece no final da function, por isso fiz confusão. Agora entendi que o return esta saindo da funciona então não precisa de tantos else if.



  • Tomas para colocar mais de um ip fora do proxy

    if (myIpAddress(), "192.168.2.2", "255.255.255.0", "192.168.2.3", "255.255.255.0") return "DIRECT";

    é desta forma?



  • @isaiasbertin:

    Tomas para colocar mais de um ip fora do proxy

    if (myIpAddress(), "192.168.2.2", "255.255.255.0", "192.168.2.3", "255.255.255.0") return "DIRECT";

    é desta forma?

    Teste dessa forma ou faça um ip por linha.

    if (myIpAddress(), "192.168.2.2", "255.255.255.0") || (myIpAddress(), "192.168.2.3", "255.255.255.0")) return "DIRECT";



  • OK posso adicionar máquinas por máquinas nesta opção, outra coisa será que tem como criar uma lista de máquinas um aquivo com todos os IPS e chamar este arquivo via este scripts



  • Não é mais facil somente desmarcar a opção no navegador dessas máquinas?



  • @isaiasbertin:

    OK posso adicionar máquinas por máquinas nesta opção, outra coisa será que tem como criar uma lista de máquinas um aquivo com todos os IPS e chamar este arquivo via este scripts

    Isaias, não seria mais fácil criar uma regra liberando tudo para as máquinas do que tirar eles do proxy?
    Qual a necessidade de tirar algumas máquinas do proxy?



  • Na realidade estou testando pois tem momentos que tenho que colocação máquinas fora do proxy e tirar site do proxy exemplo conectividade social

    Estou fazendo teste quero ter todas as possibilidades  o melhor é liberar no proxy mesmo

    Vou fazer os tese e posto



  • @isaiasbertin:

    Na realidade estou testando pois tem momentos que tenho que colocação máquinas fora do proxy e tirar site do proxy exemplo conectividade social
    Estou fazendo teste quero ter todas as possibilidades  o melhor é liberar no proxy mesmo
    Vou fazer os tese e posto

    Pra que? Tenho escritório de contabilidade sem problema com Conectividade, não precisa "tirar" do proxy….
    Só fazer uma regra liberando a porta se estiver usando o programa antigo e se for a ver~soa web funciona sem problema  via proxy.



  • @isaiasbertin:

    tirar site do proxy exemplo conectividade social

    Seria mais simples colocar o site da conectividade social na exception no lugar de ficar escrevendo um livro no wpad.

    Outro detalhe importante é que o navegador faz cache do wpad, o que dificulta o processo de atualização do script.



  • Tomas
    quando eu tiro o comentário deta linha e coloco o ip da maquina que é para estar fora do proxy e libero ela no rules esta aquina funciona mas as demais maquinas não navegam mais e nao solicita o proxy eu acho que da um erro ai não funciona mais o script wpad.dat, muito estranho

    if (myIpAddress(), "192.168.2.2", "255.255.255.0") return "DIRECT";

    function FindProxyForURL(url,host){

    // If the requested website is hosted within the internal network, send direct.
      if (isPlainHostName(host) ||
        isInNet(dnsResolve(host), "192.168.2.0",  "255.255.0.0") ||
        isInNet(dnsResolve(host), "192.168.15.0",  "255.255.0.0") ||
        isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
      return "DIRECT";

    // Dominio sem proxy
      //if (shExpMatch(host, "site.a.b.c") || shExpMatch(host, "site.x.y.z")) return "DIRECT";

    // IP sem proxy

    if (myIpAddress(), "192.168.2.2", "255.255.255.0") return "DIRECT";

    // Regra deafult com proxy em ordem de fail-ver
      return "PROXY 192.168.2.1:3128; PROXY 192.168.15.1:3128";

    }

    Bem como sou novo em pfsense estou apreendendo todos os dias com a turma do forum, mas Marcelo vc poderia me mostrar como posso fazer o que vc mencionou com o site da caixa pois isso é uma das coisa que dão dor de cabeça, como posso faze no pfsense.



  • Não tenho problema com site da caixa, funciona normal com proxy.
    Quer problema tem?



  • conectividade social esta sempre gera uns stress

    Tomas sabes como fazer o que o Marcello mencionou **"Seria mais simples colocar o site da conectividade social na exception no lugar de ficar escrevendo um livro no wpad.

    Outro detalhe importante é que o navegador faz cache do wpad, o que dificulta o processo de atualização do script."**



  • @isaiasbertin:

    Tomas
    quando eu tiro o comentário deta linha e coloco o ip da maquina que é para estar fora do proxy e libero ela no rules esta aquina funciona mas as demais maquinas não navegam mais e nao solicita o proxy eu acho que da um erro ai não funciona mais o script wpad.dat, muito estranho

    if (myIpAddress(), "192.168.2.2", "255.255.255.0") return "DIRECT";

    function FindProxyForURL(url,host){

    // If the requested website is hosted within the internal network, send direct.
      if (isPlainHostName(host) ||
        isInNet(dnsResolve(host), "192.168.2.0",  "255.255.0.0") ||
        isInNet(dnsResolve(host), "192.168.15.0",  "255.255.0.0") ||
        isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
      return "DIRECT";

    // Dominio sem proxy
      //if (shExpMatch(host, "site.a.b.c") || shExpMatch(host, "site.x.y.z")) return "DIRECT";

    // IP sem proxy

    if (myIpAddress(), "192.168.2.2", "255.255.255.0") return "DIRECT";

    // Regra deafult com proxy em ordem de fail-ver
      return "PROXY 192.168.2.1:3128; PROXY 192.168.15.1:3128";

    }

    Bem como sou novo em pfsense estou apreendendo todos os dias com a turma do forum, mas Marcelo vc poderia me mostrar como posso fazer o que vc mencionou com o site da caixa pois isso é uma das coisa que dão dor de cabeça, como posso faze no pfsense.

    Esta linha esta errada
    if (myIpAddress(), "192.168.2.2", "255.255.255.0") return "DIRECT";

    o correto seria:

    
    if (isInNet(myIpAddress(), "192.168.2.2", "255.255.255.255")) return "DIRECT";
    
    

    ou pode ser:

    
    if (myIpAddress() == "192.168.2.2") return "DIRECT";
    
    

    Com relação ao conectividade antigo, esta configuração ja resolve, pois o CNS utiliza o ip 127.0.0.1 (localhost) e ai ja esta sem proxy para este ip. Você só precisa liberar o ip do servidor da caixa nas regras do firewall

    CIDR servidor CNS = 200.201.173.0/20



  • Como prometi, refiz o script para várias redes, retornando DIRECT só para localhost e endereços dentro da mesma rede do cliente.

    
    function FindProxyForURL(url, host){
       var host_ip;
    
       host_ip= dnsResolve(host);
    
       if (isInNet(host_ip, "127.0.0.1", "255.255.255.255"))
          return "DIRECT";
    
       if (isInNet(myIpAddress(), "192.168.7.0", "255.255.255.0"))
          if (isInNet(host_ip, "192.168.7.0", "255.255.255.0"))
             return "DIRECT";
    
       if (isInNet(myIpAddress(), "192.168.12.0", "255.255.255.0"))
          if (isInNet(host_ip, "192.168.12.0", "255.255.255.0"))
             return "DIRECT";
    
       if (isInNet(myIpAddress(), "192.168.13.0", "255.255.255.0"))
          if (isInNet(host_ip, "192.168.13.0", "255.255.255.0"))
             return "DIRECT";
    
       if (isInNet(myIpAddress(), "192.168.14.0", "255.255.255.0"))
          if (isInNet(host_ip, "192.168.14.0", "255.255.255.0"))
             return "DIRECT";
    
       if (isInNet(myIpAddress(), "192.168.15.0", "255.255.255.0"))
          if (isInNet(host_ip, "192.168.15.0", "255.255.255.0"))
             return "DIRECT";
    
       if (isInNet(myIpAddress(), "192.168.16.0", "255.255.255.0"))
          if (isInNet(host_ip, "192.168.16.0", "255.255.255.0"))
             return "DIRECT";
    
       if (isInNet(myIpAddress(), "172.16.0.0", "255.255.0.0"))
          if (isInNet(host_ip, "172.16.0.0", "255.255.0.0"))
             return "DIRECT";
    
       return "PROXY 192.168.7.1:3128";
    }