+ Responder ao Tópico



  1. #1

    Post iptables TCC - ajuda.

    Pessoal, estou fazendo no meu TCC uma interface em Java Servelet Page para gerenciar o iptables. Detalhe que não utilizarei proxy, somente o iptables para o foco do TCC.
    A ideia desse tema foi do meu professor cujo orientador, eu dominando JAVA e ele me passando as regras do iptables.
    Mas percebi que meu orientador não manja nada de iptables e isso está me atrasando e me fazendo entrar em desespero (pausa para dramaticidade, rs). Eu tenho uma pequena noção de iptables e gostaria de uma ajuda na construção dessa.
    Se eu pegar no google umas regras eu coloco pra funcionar, mas não é isso que eu quero. Quero destrinchar as regras e ir adicionando aos poucos.
    Gostaria muito a ajuda de vocês e que com certeza quando eu for publicar irei colocar agradecimento ao fórun do under-linux.
    Hoje que eu tenho é muito pouco e nem sei se é desse jeito que faz mesmo, mas tá funcionando.
    Fiz NAT com apenas uma máquina da rede interna tendo acesso a porta 80. Então na interface criada em JAVA coloco o IP e a porta liberada para dar acesso a navegação.
    Desculpa aí de ter escrito muito, mas foi pra deixar tudo bem explicadinho.
    Segue a regra:

    #!/bin/bash
    ## VARIAVEIS ##
    iptables=/sbin/iptables
    start() {..
    ...
    ... resumindo parte inicial que limpa as regras etc etc
    ...
    echo "1" > /proc/sys/net/ipv4/ip_forward
    # Conexao interna
    $iptables -A INPUT -p tcp --syn -s 80.80.80.0/255.255.255.0 -j ACCEPT
    $iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    #$iptables -A INPUT -m state --state INVALID -j DROP
    #$iptables -A INPUT -m state --state NEW -j DROP

    $iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
    $iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
    $iptables -A INPUT -i lo -j ACCEPT

    $iptables -A FORWARD -s 80.80.80.25 -p tcp -m tcp --dport 80 -j ACCEPT # Parte que tenho controle na interface.

    $iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
    $iptables -A FORWARD -m state --state INVALID -j DROP
    $iptables -A FORWARD -m state --state NEW -j DROP

    #Mascarando rede
    $iptables -t nat -A POSTROUTING -s 80.80.80.0/255.255.255.0 -j MASQUERADE

    $iptables -P INPUT DROP
    $iptables -A FORWARD -j DROP
    #$iptables -P OUTPUT ACCEPT

    echo ""
    echo "Firewall Started: [OK]"
    echo ""
    }


    stop() {....
    ....
    .... resumindo parte final
    esac
    exit 0

  2. #2

    Padrão

    Cara, desculpa, pode ser lerdeza minha... mas, qual é exatamente a sua dúvida?? Você quer entender as regras??

    Esse script, ele é gerado a partir dos dados que o usuário passa para o seu programa?

    Interessante o seu TCC! Fiz coisa parecida no meu. Também criei uma interface para o iptables, só que em c/c++ e utilizei a estrutura cliente-servidor. Atualmente estou re-escrevendo-a para Python e Gtk.

    Explica melhor ai que agente te ajuda!
    Até mais...

  3. #3

    Padrão

    Isso, o administrador do sistema vai ter acesso via browser a interface de controle do iptables.
    Logando-se no sistema ele tem todo o controle do iptables através de cliques, ex: liberando internet para duas maquinas apenas da rede interna. Então tem um campo onde ele insere o ip a porta e pronto ja gera o script.

    Verdade, não expliquei muito sobre o que eu quero...
    na verdade gostaria mesmo é de um acompanhamento.
    Exemplo... do jeito que o script tá agora somente funciona navegacao na porta 80 de uma maquina interna. Ta certo as regras com a minha intenção? Bom, funcionando está, só não esta entrando o gmail e o orkut não estão entrando dessa maneira. O que mais tenho que liberar pra que entre?
    O que mais posso estar colocando no script? O e-mail, ftp dessa maquina não funciona. Como faço pra liberar no script e se liberar para parar de funcionar é só tirar a regra inserida por estar dropando tudo no final ou tenho que inserir uma regra dropando isso. O que mais eu poderia estar colocando no script? Alguma ideia boa de uma funcionalidade importante?
    O que mais eu poderia estar colocando para um administrador de rede? Isso sem usar o proxy.
    Última edição por N0fxx; 23-09-2008 às 11:42. Razão: melhor explicação

  4. #4

    Padrão

    Citação Postado originalmente por N0fxx Ver Post
    Isso, o administrador do sistema vai ter acesso via browser a interface de controle do iptables.
    Logando-se no sistema ele tem todo o controle do iptables através de cliques, ex: liberando internet para duas maquinas apenas da rede interna. Então tem um campo onde ele insere o ip a porta e pronto ja gera o script.

    Verdade, não expliquei muito sobre o que eu quero...
    na verdade gostaria mesmo é de um acompanhamento.
    Exemplo... do jeito que o script tá agora somente funciona navegacao na porta 80 de uma maquina interna. Ta certo as regras com a minha intenção? Bom, funcionando está, só não esta entrando o gmail e o orkut não estão entrando dessa maneira. O que mais tenho que liberar pra que entre?
    O que mais posso estar colocando no script? O e-mail, ftp dessa maquina não funciona. Como faço pra liberar no script e se liberar para parar de funcionar é só tirar a regra inserida por estar dropando tudo no final ou tenho que inserir uma regra dropando isso. O que mais eu poderia estar colocando no script? Alguma ideia boa de uma funcionalidade importante?
    O que mais eu poderia estar colocando para um administrador de rede? Isso sem usar o proxy.
    Seguinte vamos devagar. Gmail, okut e etc não estão entrando muito provavelmente porque eles são https que não utilizam a porta 80 e sim a porta 443.
    Quanto a "se retirar a regra para de funcionar", você pode utilizar a politica padrão de cada chain. para definir a politica padrão de cada chain, utilize a seguinte linha:
    iptables -t nome_da_tabela -P nome_da_chain ACCEPT
    ou
    iptables -t nome_da_tabela -P nome_da_chain DROP

    O iptables funciona da seguinte forma: Ele busca uma regra na chain, caso nenhuma regra 'bata' com o trafego ele utiliza a politica padrão. Dessa forma definindo uma política padrão como DROP, se você terá que criar regras permitindo o tráfego (que é o que você está fazendo).

    Quanto a novas funcionalidade para implementar, dá uma lida nesses links:
    Guia Foca GNU/Linux - Firewall iptables
    Yet Another Linux Blog

    O primeiro é um guia que explica muito bem o funcionamento do iptables. Vai ser muito útil pra você. Ele também dá exemplos de configuração e de funcionalidade do iptables. O seguindo é o blog de um amigo nosso aqui do Unde-Linux, o Zenun. Ele já publicou algumas coisas sobre o iptables que podem te ajudar.

    Quanto a acompanhamento, agente ta aqui. Se precisar é só postar!
    Até mais...

  5. #5

    Padrão

    Hum, entendi... liberei essa porta
    Então, tenho essa politica padrao de cada chain em mente,
    tentei dar o acesso de e-mail a uma maquina interna utilizando a esguinte regra:
    $iptables -A FORWARD -s 80.80.80.25 -p tcp -m tcp --dport 25 -j ACCEPT #SMTP
    $iptables -A FORWARD -s 80.80.80.25 -p tcp -m tcp --dport 110 -j ACCEPT #POP
    Mas não funcionou, tentei também utilizando a mesma regra só mudando a porta para dar acesso a FTP porta 21. Também não funcionou. Por que será?

    E outra coisa, é realmente necessário estar utilizando o DROP? Se não tiver a linha de ACCEPT ele vai estar sendo caindo no DROP geral que se tem no final do script, ou estou errado? ou precisa devido alguma outra coisa?
    Última edição por N0fxx; 23-09-2008 às 12:49. Razão: melhor explicação

  6. #6

    Padrão

    Citação Postado originalmente por N0fxx Ver Post
    Hum, entendi... liberei essa porta
    Então, tenho essa politica padrao de cada chain em mente,
    tentei dar o acesso de e-mail a uma maquina interna utilizando a esguinte regra:
    $iptables -A FORWARD -s 80.80.80.25 -p tcp -m tcp --dport 25 -j ACCEPT #SMTP
    $iptables -A FORWARD -s 80.80.80.25 -p tcp -m tcp --dport 110 -j ACCEPT #POP
    Mas não funcionou, tentei também utilizando a mesma regra só mudando a porta para dar acesso a FTP porta 21. Também não funcionou. Por que será?

    E outra coisa, é realmente necessário estar utilizando o DROP? Se não tiver a linha de ACCEPT ele vai estar sendo caindo no DROP geral que se tem no final do script, ou estou errado? ou precisa devido alguma outra coisa?
    Olá amigo...
    Então sobre as regras que você colocou ali, elas estão permitindo o primeiro acesso, quando você tenta a conexão!
    Porém temos que permitir também a volta dos pacotes...
    Não sei se você colocou em suas regras uma que permita as conexões estabelecidas:

    Código :
    iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    É legal deixar essa regra bem no inicio da chain FORWARD!
    Qualquer coisa da um tok aee!!


    p.s.: voce colocou ali... hehehe eu que boiei!
    Última edição por zenun; 23-09-2008 às 15:01. Razão: mais info

  7. #7

    Padrão

    Opa amigos...
    Desculpa o post anterior acabei postando sem ler muito bem o que estava acontecendo!

    Camarada.. não sei se você tem seu DNS interno...
    Mas é necessário liberar-lo para que seja possível realizar consultas...
    Eu faria mais ou menos assim:

    Código :
    iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    # DNS
    iptables -t filter -A FORWARD -s 80.80.80.25 -p udp --dport 53 -j ACCEPT 
    # WWW http/https
    iptables -t filter -A FORWARD -s 80.80.80.25 -p tcp --dport 80 -j ACCEPT
    iptables -t filter -A FORWARD -s 80.80.80.25 -p tcp --dport 443 -j ACCEPT
    # FTP controle/transferencia
    iptables -t filter -A FORWARD -s 80.80.80.25 -p tcp --dport 21 -j ACCEPT
    iptables -t filter -A FORWARD -s 80.80.80.25 -p tcp --dport 20 -j ACCEPT
    # E-mail pop/smtp
    iptables -t filter -A FORWARD -s 80.80.80.25 -p tcp --dport 110 -j ACCEPT
    iptables -t filter -A FORWARD -s 80.80.80.25 -p tcp --dport 25 -j ACCEPT
    Com essas regras desta forma na sua chain FORWARD deveria ser possível acessar os serviços ali descritos...
    E importante, para colocar a chain com politica DROP é assim (como disse o Magnun):

    Código :
    iptables -t filter -P FORWARD DROP
    No seu script esta assim:

    Código :
    $iptables -A FORWARD -j DROP
    Tenta aee e nos mantenha informado!

  8. #8

    Padrão

    Muito bommmm...
    consegui conexão com e-mail e FTP. Não sabia que precisava liberar a porta 20 também.Valeu Zenun.
    No FTP precisei também liberar o PassivePorts encontradas dentro do arquivo proftpd.conf no servidor onde quero me conectar. Pois sem elas eu estava conseguindo conectar e não estava listando os arquivos.
    Em relação a acrescentar "-t filter" na regra iptables sei que não há necessidade pois quando você coloca direto iptables -A ele subentende que está utilizando o filter.

    Com a porta 443 que o Magnun tinha dito funcionou tudo a navegação. Valeu Magnun.

    Bom, já vi que pra rede interna na parte de liberação de serviços ip's e portas é só eu ir trabalhando com as regras dessa maneira como tinha dito o Magnum.
    iptables -t nome_da_tabela -P nome_da_chain ACCEPT
    Mas pelos testes percebi que não precisa utilizar o DROP de cada regra, pois tudo o que não se encaixar na regra ele vai entrar no DROP da última linha do script onde eu dou DROP no FORWARD e no INPUT.

    Bom, to agradecendo mas gostaria que continuassem a ir me ajudando. O que mais eu poderia ir implementando de interessante no meu firewall? Tem como eu bloquear sites sem utilizar proxy? E o MSN, pelas pesquisas no google já vi que não tem como, mas vai que alguém aí ja conseguiu. rs.
    Alguem com ideias?

    Valeuuuuuuuu!!!!!

  9. #9

    Padrão

    Aquela tua última regra de DROP na chain FORWARD vai simular a política padrão da CHAIN!
    Ai você escolhe como fica melhor para você!

    Então para bloquear o msn usando iptables você precisa do patch layer7 do iptables+kernel!
    Ai você vai ter como identificar a aplicação usando iptables como ftp, http, msn e até p2p!
    Mas para p2p eu recomendo usar o patch do patch-o-matic para o módulo ipp2p!

    Da uma olhada nisso aee!

  10. #10

    Padrão

    Falando no zenun, olha ele ai... hehe...

    Cara, bloquear site é meio complicado.. você pode fazer o seguinte teste:
    Adicionar antes das regras que permitem a navegação do host a seguinte regra:
    iptables -A FORWARD -d Google -j DROP

    O único problema: Geralmente esses sites possuem vários ips respondendo pro mesmo nome (GSLB - Global Server Load Balance) o que pode resultar em dezenas de regras pra um único destino. E outra coisa, você digita no browser Google é recepcionado pelo server mas depois é desciado pra outro server... por isso que na hora de fazer bloqueio de sites utilizamos proxy.

    O iptables tem também a função de fazer redirecionamento de portas, nat de origem e nat de destino. Dentre esses talvez os mais interessantes são: nat de destino e redirecionamento de porta. Com essas funções é possível ter um servidor (web, por exemplo) atraz de um firewall. Quando você tenta se conectar ao servidor web, na verdade você acessa o IP do firewall e o firewall faz o DNAT (destiny nat) 'repassando' a conexão para o servidor web. É possível fazer uma 'multiplexação' de servidores baseando-se nas portas também. No link que eu te passei isso é muito bem explicado.

    Qualquer coisa posta ai...
    Fui...
    PS: Alguém me corrija se eu errei em algo!!!

  11. #11

    Padrão

    Esta correto Magun! Quando você adiciona uma regra de iptables a um domínio geralmente vão ser criadas muitas outras regras! A maneira correta de se bloquear sites é no proxy mesmo!

    E isso do DNAT eu uso aqui na minha rede e funciona muito bem! Hehehe

    Falowww!!