Port Forward - Multiplas URLS



  • Caros amigos,

    O PfSense é o melhor firewall que existe. Mas infelizmente, ou felizmente(Se alguem conseguir me ajudar) ele não publica mais de uma url com portas iguais. EX:

    IP DMZ 1 : 192.168.2.2
    IP DMZ 2 : 192.168.2.3

    IP WAN: X.X.X.X

    No dyndns criei as seguintes urls como ex:
    http://testepagina.dyndns-remote.com
    http://testepagina1.dyndns-remote.com
    Todas as duas urls apontam pro endereço wan.

    Quando crio a regra de NAT port forward no Sense na porta 80, o que acontece:

    interface:wan
    protocolo: tcp
    destination: wan address
    destination port range: 80
    redirect target ip: 192.168.2.2

    E digito no browser http://testepagina.dyndns-remote.com, ele abre a pagina do 192.168.2.2, mas quando crio uma segunda regra para 192.168.2.3, ele continua abrindo a pagina do 192.168.2.2.

    O Sense não consegue vincular o endereço de url ao ip da maquina interna??O ISA faz isso.

    Ficaria assim:

    wan -> x.x.x.x -> 192.168.2.2 -> http://testepagina.dyndns-remote.com
    wan -> x.x.x.x -> 192.168.2.3 -> http://testepagina1.dyndns-remote.com

    Se alguem souber como me ajudar…Por favor...rs

    abraços



  • vromero.rj,,

    Nat é e sempre será o mapeamento de alguma coisa externa para outra interna e não de uma para várias.
    Se ainda sim quiser o nat, use a porta 80 para um servidor web e a 81 para o outro.

    O que você precisa realmente é instalar um proxy reverso/load balancer.

    No pfsense 2.0, se voce não precisar de https, sugiro o varnish. Ele faz o que você precisa além de deixar seu site muito mais rápido.

    Outras opções são o apache+mod_security e o haproxy.

    Utilizo em alguns clientes a combinação do Varnish(http) + haproxy(https).

    att,
    Marcello Coutinho



  • Marcelo,

    Obrigado pelo feedback. Mas no caso de colocar uma porta 80 e a outra 81, seria ao digitar no browser?
    ex: www.teste.com.br:81 , ou poderia indicar essa porta no endereço interno somente e automaticamente o NAT atribuiria esse endereço para www.teste.com.br ?

    abcs



  • Com nat ficaria o :81 mesmo.

    Mas a melhor solução de longe é usar o proxy reverso.

    Da uma olhada no pacote do varnish.



  • Show de bola Marcelo.

    Vou dar uma olhada.

    Forte abraço



  • Marcelo,

    Dei uma lida sobre o Varnish, mas acho que não é o que eu quero. Pedi para um usuario no velox, acessar o endereço e a pagina nao abre.
    Ela só abre se eu inserir o NAT. Vou printar as telar para você entender melhor.








  • Com essas configuraçoes acima, o usuario externo digita http://omsteste.dyndns-remote.com e http://omsteste1.dyndns-remote.com e abre a mesma pagina. Eu queria que ela abrisse, de acordo com a relação dos meus servidores internos, mas pelo que vejo, o NAT pega semprea primeira regra.



  • se voce conseguiu ver a mesma página quer dizer que voce já conseguiu:

    • desativar o nat

    • desativar o http redirect da gui do pfsense

    • criar a regra na wan que libera acesso a porta 80

    • criar os backends.

    Muito bom.

    O proximo passo é definir que paginas cada backend responde.
    Vi nas suas telas que voce configurou a probe url.

    A probe url define que parte do site o varnish vai testar para saber se o servidor esta no ar ou não.
    precisar ser uma url completa e não o mapeamento do site:
    ex: http://www.meusite.com.br/index.php

    configura agora o backend mappings
    sua configuracao pode ficar assim:
    host equal omsteste1.dyndns-remote.com para um backend e
    host equal omsteste.dyndns-remote.com para o segundo backend

    Na nomeclatura do varnish, backend significa servidor web.
    Uma cofiguracao mais avançada é criar o backends sem nenhum mapeamento e atribuir os sites na aba load balancer.

    att,
    Marcello Coutinho



  • Marcelo,

    Mais uma vez obrigado pela atenção. Estarei efetuando os testes e te retorno com o feedback. Sua atenção foi de grande valia.

    Abraços



  • Marcelo,

    Segui todas as dicas que me passou, mas não funciona..nao sei o que estou fazendo de errado. Agora nao abre a pagina. Só esta brindo quando coloco NAT.

    Segue o print das telas.

    abcs










  • Posta o arquivo de configuracao(aba view configuration)



  • Varnish configuration file

    Automatically generated by the pfSense package system

    This file is located in /var/etc/default.vcl

    sub vcl_error {
    if (obj.status == 503 && req.restarts < 1) {
    restart;
    }

    set obj.http.Content-Type = "text/html; charset=utf-8";
    synthetic {"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

    <title>"} obj.status " " obj.response {"</title>

    We are very sorry but an error occurred during this request.

    Please press refresh in your browser to try again.

    Varnish Error "} obj.status " " obj.response {"

    "} obj.response {"

    Guru Meditation:

    XID: "} req.xid {"

    "};
    return(deliver);

    }

    backend omstesteBACKEND {

    used in catch_all

    .host = "192.168.2.5";
    .port = "80";
    .first_byte_timeout = 300s;
    .connect_timeout = 25s;
    .probe = {
    .url = "http://omsteste.dyndns-remote.com/testando.htm";
    .interval = 1s;
    .timeout = 1s;
    .window = 5;
    .threshold = 5;
    }
    }

    backend omsteste1BACKEND {

    used in catch_all

    .host = "192.168.2.6";
    .port = "80";
    .first_byte_timeout = 300s;
    .connect_timeout = 25s;
    .probe = {
    .url = "http://omsteste1.dyndns-remote.com/index.htm";
    .interval = 1s;
    .timeout = 1s;
    .window = 5;
    .threshold = 5;
    }
    }

    sub vcl_recv {

    #BASIC VCL RULES SETTING
    #set X-forward
    set req.http.X-Forwarded-For = client.ip;

    if (req.http.host == "omsteste.dyndns-remote.com") {
    set req.backend = omstesteBACKEND;
    }
    else if (req.http.host == "omsteste1.dyndns-remote.com") {
    set req.backend = omsteste1BACKEND;
    }

    #respect client wish to refresh the page
    if (req.http.Pragma ~ "no-cache")
    {
    return(pass);
    }

    #BASIC VCL RULES ACTIONS
    #Disable session cache
    if (req.http.Cookie && req.http.Cookie ~ "(PHPSESSID|phpsessid)") {
    return(pass);
    }
    if (req.http.Cookie && req.http.Cookie ~ "(JSESSION|jsession)") {
    return(pass);
    }
    if (req.http.X-Requested-With == "XMLHttpRequest" || req.url ~ "nocache") {
    return(pass);
    }
    #Enable static cache
    if (req.request=="GET" && req.url ~ ".(css|js|txt|zip|pdf|rtf|flv|swf|html|htm)$") {
    unset req.http.cookie;
    return(lookup);
    }
    if (req.request=="GET" && req.url ~ ".(gif|jpg|jpeg|bmp|png|ico|img|tga|wmf|mp3|ogg)$") {
    unset req.http.cookie;
    return(lookup);
    }
    if (req.request != "GET" && req.request != "HEAD") {return(pipe);}

    return(lookup);
    }

    sub vcl_pipe {

    If we don't set the Connection: close header, any following

    requests from the client will also be piped through and

    left untouched by varnish. We don't want that.

    set req.http.connection = "close";

    Note: no "pipe" action here - we'll fall back to the default

    pipe method so that when any changes are made there, we

    still inherit them.

    }

    sub vcl_fetch {

    #Disable cache when backend is starting a session
    if (beresp.http.Set-Cookie && beresp.http.Set-Cookie ~ "(PHPSESSID|phpsessid)") {
    return(pass);
    }
    if (beresp.http.Set-Cookie && beresp.http.Set-Cookie ~ "(JSESSION|jsession)") {
    return(pass);
    }
    if (beresp.http.X-Requested-With == "XMLHttpRequest" || req.url ~ "nocache") {
    return(pass);
    }

    Varnish respects the wishes of the backend application.

    if (beresp.http.Pragma ~ "no-cache" || beresp.http.Cache-Control ~ "(no-cache|no-store|private)") {
    return(pass);
    }
        ## If the request to the backend returns a code other than 200, restart the loop
        ## If the number of restarts reaches the value of the parameter max_restarts,
        ## the request will be error'ed.  max_restarts defaults to 4.  This prevents
        ## an eternal loop in the event that, e.g., the object does not exist at all.
        if (beresp.status != 200 && beresp.status != 403 && beresp.status != 404 &&
        beresp.status != 303 && beresp.status != 302 && beresp.status != 301) {
    restart;
            }

    return(deliver);
    }

    sub vcl_deliver {
    ##set resp.http.X-Served-By = server.hostname;
      if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
        set resp.http.X-Cache-Hits = obj.hits;
      } else {
        set resp.http.X-Cache = "MISS";
      }
    return(deliver);
    }



  • Marcelo,

    Voce tem skype ou msn?

    O meu msn é vromero_rj@hotmail.com e victor-romero1



  • Percebi um bug na probe url quando o site tem caracteres especiais '-', tenta mudar somente para
    /index.htm  e vê se funciona.

    o probe deve ficar assim:
      .probe = {
         .url = "/index.htm";
         .interval = 1s;

    Se o probe der errado, voce vai receber a tela de erro 503 do varnish.



  • Fala Marcelo,

    Não foi nao. Só consigo abrir a url externamente, quando habilito o NAT forward. Fora isso a pagina nao abre? Voce chegou a verificar a regra que criei de WAN?Voce havia me dito que não posso deixar nenhuma regra de NAT forward habilitada. Mas como vou conseguir fazer a acesso externo na porta 80? Pela regra normal em firewall- rules- wan eu consigo?

    abcs



  • vai na console e vê se o varnish tá rodando

    ps ax | grep -i varnish



  • você habilitou o varnish na porta 80 na aba 'settings'



  • Fala Marcelo,

    Cara consegui. O serviço do Varnish, nao tava subindo. Olhei o log e fiz o seguinte:

    Em settings, alterei Storage Type de memory para disk.

    Depois coloquei Cache storage size in megabytes para 9046. O Serviço do Vanish subiu. Olha que beleza!!!

    Muito obrigado cara pelas informações. Forte abraço



  • Excelente! 8)

    Depois volta ele para cache em memória e testa a diferença de performance.

    Parabéns pela configuração.



  • Fala Marcelo.

    Ta show de bola cara. Fiz o Varnish funcionar direito. Meus servidores estao em cluster tambem. Agora to querendo publicar um endereço na porta https. Ex: https://omsteste.dyndns-remote.com . No meu IIS configurei  a porta TCP 80 e a porta SSL 443. Internamente funciona. Externamente não. Gostaria de saber se o Varnish faz isso tambem. Um aoutra dúvida é a seguinte. Eu consigo digitar por exemplo, http://omsteste.dyndns-remote.com no meu browser e fazer um redirecionamento automatico para https://omsteste.dyndns-remote.com ? Se não meu engano você me disse que o HAPROXY faz isso certo?

    abraços



  • Olá vromero.rj,

    É gratificante ver a evolução das configurações do pfsense aqui na lista.

    Agora vamos aos pontos:
    @vromero.rj:

    Agora to querendo publicar um endereço na porta https.

    Se for só em um dos sites, pode usar o nat mesmo, caso contrário você vai precisar do Haproxy para fazer isso.
    Outra solução seria o apache+modsecurity, mas nesse caso você teria que colocar os certificados ssl no firewall também.
    Fazendo uma escala de complexidade/funcionalidade, ficaria assim:

    • NAT (mais facil porem restrito a um host)

    • HAPROXY (intermediario)

    • apache+mod_security(dificil porem mais seguro)

    @vromero.rj:

    Eu consigo digitar por exemplo, http://omsteste.dyndns-remote.com no meu browser e fazer um redirecionamento automatico para https://omsteste.dyndns-remote.com ?

    O redirect é feito na programação da página, voce verifica o protocolo que o cliente chamou e se for o caso,faz um redirect para a mesma página com https

    att,
    Marcello Coutinho



  • Opa…Estamos todos evoluindo. Sua ajuda tem sido de grande valia para todos nós.Sempre usei o ISA SERVER. Mas ele tem me desapontado, principalmente no quesito performance. Na verdade, segmentei minha rede toda. Estou usando o PfSense com cluster para publicar serviços web e usando o Endian Firewall para serviço de proxy, visto que considero ele o melhor nesse sentido. Ele faz autenticação NTLM.
    Estou efetuando os testes que me falou. Vou instalar o hpaproxy!!abcsss



  • @vromero.rj:

    usando o Endian Firewall para serviço de proxy, visto que considero ele o melhor nesse sentido. Ele faz autenticação NTLM.

    Nao considero instalar o samba no firewall uma boa solução, mas enfim. Se Voce quiser o squid do pfsense autenticando NTLM, basta instalar o winbind, o samba e colocar o pf no domínio.



  • Marcelo,

    Usei o NAT mesmo. Como só tenho esse endereço na porta https, não terei problema.

    Eu consigo fazer aquele redirect pelo NAT na porta 80 pra 443?

    abraçosss



  • Infelizmente nao, so via programação mesmo.

    Usa JavaScript. O google Te ajuda.



  • Humm.. tranquilo meu camarada.

    Mas ja foi uma ajuda e tanto.

    Forte abraço



  • Fala Marcelo,

    Fiz o seguinte. Criei a regra de NAT na porta 443 para o IP de nat 192.168.2.5(IP do servidor WEB)
    Depois criei uma regra no varnish na porta 443 ao inves da 80.

    Quando tentava acessar esse endereço pela web ele dava erro do Varnish.

    Pois bem, fui na configuraçao do varnish na customização da pagina de erro e inseri o seguinte:

    Quando digito no browser, ele automaticamente redireciona para a pagina desejada….

    Agora ta fechado!!!!

    abraçossss



  • Essa configuração Nao esta correta.
    Voce esta forcando um erro no Varnish para conseguir o redirect.



  • Pois é..mas como sei que esse endereço é o unico https que temos, não terei problema. Quando o usuario digitar a pagina www.omsteste.dyndns-remote.com ela, teoricamente apareceria o erro do varnish, mas automaticamente ela redireciona para a pagina solicitada.



  • Aproveitando o embalo,
    tenho algumas dúvidas/problemas.
    Tenho o ambiente
    WAN -> Ip válido
    DMZ1 -> 192.168.200.0/29

    SRV01 -> 192.168.200.2 (Servidor WEB interno)

    O problema/dúvida é quanto ao apache_mod_security
    Fiz a instalação, que aparentemente ocorreu sem problemas.
    Fui verificar o status do serviço e o mesmo encontra-se parado (Stopped).
    Tento iniciar manualmente e o pfsense exibe a mensagem "apache_mod_security has been started."
    mas… nos logs

    Nov 30 19:57:39 php: /pkg_edit.php: The command '/usr/local/sbin/httpd -t' returned exit code '1', the output was 'httpd: Syntax error on line 95 of /usr/local/etc/apache22/httpd.conf: Cannot load /usr/local/libexec/apache22/mod_proxy.so into server: Cannot open "/usr/local/libexec/apache22/mod_proxy.so"'

    Nov 30 19:57:39 php: /pkg_edit.php: apache_mod_security_package: There was an error parsing the Apache configuration: 1

    tudo bem, entendi que não existe o mod_proxy.
    Como não quero mexer no sistema fora da interface GUI, gostaria de saber se é um bug ou se há algum problema com configuração ou falta algum pacote que por acaso o instalador gráfico não o fez.
    Pacotes instalados:

    • Proxy Server with mod_security
    • snort
    • squid3
    • widescreen

    A versão deste pfSense é a:
    2.0-RELEASE (amd64) - built on Tue Sep 13 17:05:32 EDT 2011

    Vi na internet que há pessoas com problemas relacionado a isso mas não ví ou entendi algumas soluções.

    Agora uma dúvida em sí.
    Assim que eu conseguir resolver o problema do mod_security com proxy, há algum material que explane bem a utilização do módulo no pfSense (GUI)?

    Qualquer contribuição é bem vinda!
    Obrigado.



  • Sem o mod_proxy, Voce Nao vai conseguir usar o apache para balancear servidores.
    Parece ser bug no pacote mesmo.

    Voce precisa do mod_security ou do balanceamento?



  • @marcelloc:

    @vromero.rj:

    usando o Endian Firewall para serviço de proxy, visto que considero ele o melhor nesse sentido. Ele faz autenticação NTLM.

    Nao considero instalar o samba no firewall uma boa solução, mas enfim. Se Voce quiser o squid do pfsense autenticando NTLM, basta instalar o winbind, o samba e colocar o pf no domínio.

    marcelloc, boa noite. Essa frase que você usou  ;D É exatamente o que estamos tentanto fazer. Quando digo eu, estou me referindo a outros que estão tentando usar NTLM no pfSense no fórum. Poderia nos ajudar ? Já vi vários posts aqui de instalação no samba no pf, mas todos sem sucesso.

    Estou usando o pf 2.0.1, e meu objetivo é apenas autenticar via NTLM, não preciso compartilhar arquivos.

    Tentei vários posts, dentre eles o http://forum.pfsense.org/index.php/topic,45828.0.html mas não deu certo.

    Desde já, muito obrigado pela ajuda.


Log in to reply