+ Responder ao Tópico



  1. #1

    Exclamation iptables - dnat não funciona com o modulo string - ajudem por favor

    Prezados colegas, Boa Tarde!

    Estou utilizando o modulo STRING para identificar o nome "teste.lalala.com.br" nos pacotes que entram em um servidor http, para baseando-se nisso fazer um DNAT para outro servidor, porém não estou conseguindo.
    Parece que tem alguma coisa que impede que o DNAT seja feito baseando-se na procura de STRINGS.
    Com o modulo STRING consegui fazer accepts, rejects, drops etc mas DNAT não.

    Ex de um DNAT por porta: FUNCIONA
    # iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.234.56.1

    Ex da primeira tentativa: NÃO FUNCIONA !
    # iptables -t nat -A PREROUTING -p tcp --dport 80 -m string --string "lalala" -j DNAT --to-destination 192.234.56.1
    Não funcionou.

    Então pensei:
    Vou enganar o iptables, vou usar marcação de pacotes e depois fazer o DNAT pela marca do pacote e não diretamente pela STRING, ou seja, na tabela mangle procuro nos pacotes tcp com destino a porta 80 pela string "lalala" e marco os que a contiverem com um carinbo "0x1"
    Depois na tabela nat procuro pelos pacotes que tenham a marca "0x1" e mando fazer o DNAT

    Ex da segunda tentativa: NÃO FUNCIONA !
    # iptables -t mangle -A PREROUTING -p tcp --dport 80 -m string --string "lalala" --algo bm -j MARK --set-mark 0x1
    # iptables -t nat -A PREROUTING -m mark --mark 0x1 -j DNAT --to-destination 192.234.56.1
    Mesmo assim não funciona!

    Agora se na tabela mangle eu marcar os pacotes que estão entrando pela porta 80 com "0x1" e depois na tabela nat eu mandar fazer o DNAT dos pacotes marcados com 0x1 FUNCIONA.

    Ex: FUNCIONA
    # iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 0x1
    # iptables -t nat -A PREROUTING -m mark --mark 0x1 -j DNAT --to-destination 192.234.56.1
    Assim funcionou.

    Então eu pensei.. pois bem, o que está acontecendo é que não consigo marcar os pacotes me baseando na string.. o modulo não deve suportar.
    Então testei marcar os pacotes pela STRING "lalala" na tabela mangle e depois na tabela nat dar um drop nos pacotes marcados.
    Para meu espanto FUNCIONOU!
    Ex:
    # iptables -t mangle -A PREROUTING -p tcp --dport 80 -m string --string "lalala" --algo bm -j MARK --set-mark 0x1
    # iptables -t nat -A PREROUTING -m mark --mark 0x1 -j DROP

    Ou seja a marcação funciona.
    Tem alguma coisa que impede que se faça DNAT quando de alguma forma a origem dessa decisão tenha sido feita pelo modulo STRING.
    Cheguei a marcar os pacotes com o string, depois remarca-los com uma segunda marca "0x2" baseando-me pela primeira marca e posteriormente tentando o DNAT pela segunda marca "0x2"
    Ex: NÃO FUNCIONA !
    # iptables -t mangle -A PREROUTING -p tcp --dport 80 -m string --string "lalala" --algo bm -j MARK --set-mark 0x1
    # iptables -t mangle -A PREROUTING -m mark --mark 0x1 -j MARK --set-mark 0x2
    # iptables -t nat -A PREROUTING -m mark --mark 0x2 -j DNAT --to-destination 192.234.56.1
    Não adianta, não vai

    Alguém que já passou por situação parecida poderia por favor me ajudar? Já arranquei metade dos meus cabeleos tentando essa solução e nada!

    Agradeço qualquer colaboração, nem que seja pra dizer que também andou a arrancar os cabelos e não conseguiu..

    Abraços,
    Lawrence Waclawiak

  2. #2

    Padrão

    O problema é o seguinte: quando um pacote chega ao filtro de pacotes, esse tem a missão de decidir por onde o pacote passara. Então, quando chega um requisição SYN, o filtro de pacotes decide se esse pacote deverá ser enviado a outro host ou se o pacote é local. Após decidir se o pacote é para um outro host ou se é local, os pacotes subsequentes não passam por algumas chains. Você poderá entender um pouco mais sobre a travessia dos pacotes pelas chains no meu blog aqui no under-linux.org (The JEdi lair's).

    O módulo string só funciona na camada de aplicação. Ou seja, depois que o filtro está apto a verificar se os pacotes contém a sttring procurada, a conexão já está estabelecida. Portanto, os pacote nem passam mais pelas chains prerouting, que é onde você está casar os pacotes...

    Espero que tenha endendido a questão.

    No mais, recomendo você ir no blog do Magnun (root@blog:/# chmod o+r *) pois lá há um ótimo curso de redes que te ajudará a entender claramente seu problema.

  3. #3

    Padrão

    Amigo vou ler na segunda feira os links que me passou, mas não entendi a logica da sua explicação devido ao exemplo a seguir:
    Ex:
    # iptables -t mangle -A PREROUTING -p tcp --dport 80 -m string --string "lalala" --algo bm -j MARK --set-mark 0x1
    # iptables -t nat -A PREROUTING -m mark --mark 0x1 -j DROP

    Isso funcionou e eu marquei o pacote na PREROUTING da tabela mangle e depois dropei-o na PREROUTING da tabela nat.
    Então se o modulo string não trabalha na PREROUTING, porque deu certo esse regra acima?

    Grato,
    Lawrence

    Citação Postado originalmente por PEdroArthurJEdi Ver Post
    O problema é o seguinte: quando um pacote chega ao filtro de pacotes, esse tem a missão de decidir por onde o pacote passara. Então, quando chega um requisição SYN, o filtro de pacotes decide se esse pacote deverá ser enviado a outro host ou se o pacote é local. Após decidir se o pacote é para um outro host ou se é local, os pacotes subsequentes não passam por algumas chains. Você poderá entender um pouco mais sobre a travessia dos pacotes pelas chains no meu blog aqui no under-linux.org (The JEdi lair's).

    O módulo string só funciona na camada de aplicação. Ou seja, depois que o filtro está apto a verificar se os pacotes contém a sttring procurada, a conexão já está estabelecida. Portanto, os pacote nem passam mais pelas chains prerouting, que é onde você está casar os pacotes...

    Espero que tenha endendido a questão.

    No mais, recomendo você ir no blog do Magnun (root@blog:/# chmod o+r *) pois lá há um ótimo curso de redes que te ajudará a entender claramente seu problema.

  4. #4

    Padrão

    Bom dia!
    Antes de mais nada te agradeço pela atenção em responder o topico e peço desculpas pela pressa com que respondi o anterior, mas é que eu realmente não disponha de nada de tempo.
    Li os teus 4 posts sobre o iptables mais o complementar sobre criação de regras, e aprendi varios conceitos que ainda desconhecia, parabéns pelo exelente material!

    Bom voltando ao meu problema eu não sei se compreendi direto, bem vamos ao que eu entendi:

    No caso do DROP funcionou pois apos a conexão ser estabelecida todos os pacotes que continham a string "lalala" foram marcados com o 0x1 na PREROUTING da tabela mangle e em seguida dropados na PREROUTING da tabela nat. Ou seja, a conexão era estabelecida e em seguida dropada.

    Já no caso do DNAT não funcionaria pois os primeiros pacotes trocados no caso do http não contém a string "lalala"(nome dns do site a ser acessado) dessa forma os primeiros pacotes (handshake de tres vias) são feitos com destino a propria maquina Firewall(que tbm tem um apache ouvindo na porta 80) e os pacotes seguintes que conteriam a string "lalala" não passam mais pela PREROUTING da tabela nat, por isso que ao tentar acessar o ip do firewall com a tentativa de DNAT eu recebia o site hospedado no proprio Firewall.

    Bom, se eu entendi bem o problema e essa minha explicação está certa, então simplesmente não é possivel fazer o DNAT utilizando-se o modulo string no caso do http. Certo, pois não terei como identificar os pacotes de estabelecimento de conexão.

    A solução que preciso é para que com um único ip real (no firewall) eu disponibilize 250 sites que estão cada um em um servidor na rede interna(Na verdade é uma vpn e eles estão geograficamente separados).
    A primeira solução que tentei foi utilizar um pŕoxy reverso, porém os sites emquestão são sistemas que utilizam muitos java-scripts e eu não descobri uma forma de faze-los funcionar com o proxy reverso.

    A outra opção que eu teria seria fazer um DNAT por porta, ou seja, se chegar na porta 1000 vai pro servidor 1 se chegar na porta 1001 vai pro servidor 2 e assim por diante, essa é facil de implementar porém as pessoas que vão acessar esses sites em sua maioria estarão dentro de orgãos governamentais e não terão acesso á internet nessas portas não padronizadas.

    Por isso que esse modulo string me deixou tão empolgado, pois me pareceu ser a soluçãio para meus problemas.

    Fico ansiosamente no aguardo de seus comentarios.

    Que a força estaja com você!


    Citação Postado originalmente por PEdroArthurJEdi Ver Post
    O problema é o seguinte: quando um pacote chega ao filtro de pacotes, esse tem a missão de decidir por onde o pacote passara. Então, quando chega um requisição SYN, o filtro de pacotes decide se esse pacote deverá ser enviado a outro host ou se o pacote é local. Após decidir se o pacote é para um outro host ou se é local, os pacotes subsequentes não passam por algumas chains. Você poderá entender um pouco mais sobre a travessia dos pacotes pelas chains no meu blog aqui no under-linux.org (The JEdi lair's).

    O módulo string só funciona na camada de aplicação. Ou seja, depois que o filtro está apto a verificar se os pacotes contém a sttring procurada, a conexão já está estabelecida. Portanto, os pacote nem passam mais pelas chains prerouting, que é onde você está casar os pacotes...

    Espero que tenha endendido a questão.

    No mais, recomendo você ir no blog do Magnun (root@blog:/# chmod o+r *) pois lá há um ótimo curso de redes que te ajudará a entender claramente seu problema.

  5. #5

    Padrão

    Sim, sua conclusão está correta...

    Quanto a como fazer sua configuração funcionar, não faço idéia. Recomendo a você postar na secção do fórum sobre apache.

  6. #6

    Padrão

    Valew amigo, muito obrigado!

    Citação Postado originalmente por PEdroArthurJEdi Ver Post
    Sim, sua conclusão está correta...

    Quanto a como fazer sua configuração funcionar, não faço idéia. Recomendo a você postar na secção do fórum sobre apache.