9 de novembro de 2010

Iptables com suporte Layer7

Por Lucas Sabino
10/11/2010




Eu e meu amigo Marcelo Kunz estávamos fazendo um servidor. E aí no meio do proxy, msn-proxy, mysql...surgiu a necessidade de uma possível solução dos problemas via iptables e seu layer7. Então achei que seria legal. Refazer um tutorial que havia feito pra postar aqui.






Então gogogo!




Primeira coisa idiota que temos que saber é se nossa máquina tem os pacotes necessários (make, gcc, ncurses etc... build-essential, patch). Depois vamos pros pacotes e suas versões:




Usei:
linux-2.6.28.8.tar.bz2
iptables-1.4.3.tar.bz2
netfilter-layer7-v2.22.tar.gz
l7-protocols-2009-05-28.tar.gz






<=========================================================================>


   1. Baixar todos os pacotes em /usr/src e descompactar o pacote do netfilter-layer7
         # cd /usr/src && tar -zxvf netfilter-layer7-v2.22.tar.gz
  
   2. Crie o link do kernel
         # ln -s /usr/src/linux-2.6.28.8 /usr/src/linux


   3. Faça o patch
         # patch -p1 < /usr/src/netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch


   4. Compilação do kernel
         # make menuconfig
  
   5. Ativando módulo layer7 no kernel
         Networking → Networking options → Network packet filtering framework (Netfilter) → Core Netfilter Configuration


                              “layer7′′ match support
                              [ ] Layer 7 debugging output
                              “string” match support








   6. Ir na opção anterior ao Core Netfilter Configuration e depois ir em IP: Netfilter Configuration. Verificar se está tudo pra subir com o kernel.


   7. Saía do kernel e salve as configurações


   8. Compilando
         # make
         # make modules_install


   9. Copiando a BzImage e criando o initrd
         # cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.28.8
         # mkinitramfs -o /boot/initrd.img-2.6.28.8 /lib/modules/2.6.28.8


  10. GRUB
         # vi /boot/grub/menu.lst
                  title Debian kernel 2.6.28.8
                  root (hd0,0)
                  kernel /boot/vmlinuz-2.6.28.8 root=/dev/sda1 ro quiet
                  initrd /boot/initrd.img-2.6.28.8
                  savedefault

                  title Debian kernel 2.6.28.8 (single-user mode)
                  root (hd0,0)
                  kernel /vmlinuz-2.6.28.8 root=/dev/sda1 ro single
                  initrd /initrd.img-2.6.28.8




  11. Reboot
         # init 6


  12.Vá pro diretório do iptables
         # cd /usr/src/iptables-1.4.3 

  13. Copie os arquivos libxt_layer7.c libxt_layer7.man para o diretório do extensions do iptables:
         # cp /usr/src/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/* extensions/ 


  14. Expurgando o iptables velho e instalando o novo
         # aptitude purge iptables
         # ./configure --with-ksource=/usr/src/linux-2.6.28.8
         # make KERNEL_DIR=/usr/src/linux-2.6.28.8 BINDIR=/sbin LIBDIR=/lib
         # make install KERNEL_DIR=/usr/src/linux-2.6.28.8 BINDIR=/sbin LIBDIR=/lib 


  15. Protocolos do layer7
         # tar -zxvf l7-protocols-2009-05-28.tar.gz
         # cd l7-protocols-2009-05-28
         # make install
         # ls /etc/l7-protocols




  16. Subindo o módulo
         # modprobe ipt_layer7


  17. Finalmente, a regra
         # iptables -A FORWARD -m layer7 –l7proto msnmessenger -j DROP
         # iptables -A FORWARD -m layer7 –l7proto bittorrent -j DROP






<=======================================================================>


OBS1: Tem gente que gosta de fazer o kernel virar um pacote. Nesse caso temos ir até o tópico número 7. Ou seja, não executar o make. Ao invés de usar o make você pode usar isto para transformar o kernel em um pacote .deb:




    # make -kpkg clean
    # make-kpkg --initrd kernel_image


Foi criado um arquivo linux-image-2.6.28_2.6.28-10.00.Custom_i386.deb no diretório /usr/src, volte ao diretório e instale.


    # cd /usr/src
    # dpkg -i linux-image-2.6.28_2.6.28-10.00.Custom_i386.deb


Pronto, o novo kernel já esta instalado.


Tem bastante gente que gosta desse jeito porque é mais fácil, e não dá pau no grub. Mas, eu prefiro ver matrix, prefiro a pílula verdadeira, ou seja, make e make install.








OBS2: Nas versões mais antigas do netfilter-layer7 era necessário unir o layer7 com o iptables antes da compilação pelo patch. Ex:




    # patch -p1 <  /usr/src/netfilter-layer7-v2.22/iptables-1.4-for-kernel-2.6.20forward-layer7-2.22.patch


A partir da versão 1.4.3 não é necessário.








OBS3: E também era necessário dar permissão a lib de teste do layer7. Não é mais necessário do iptables 1.4.3 pra frente.


    # chmod 755 /usr/src/iptables-1.4.0/extension/.layer7-test

2 comentários:

Paulo disse...

Ótimo tutorial!

Só uma pergunta, qual versão do Linux você utilizou mesmo? Digamos, tentei fazer com o Ubuntu 10.10 e não consegui, instalei numa máquina virtual o Ubuntu 9.10, que usa o kernel 2.6.31-14-generic e você faz o download do linux-2.6.28.8.tar.bz2, é essa mesmo a versão de seu kernel? No meu caso, eu baixaria o 2.6.31 (poderia utilizar o apt-get source linux-source-2.6.31)?

No aguardo de um retorno...

Att.: Paulo Luis Steinhauser
Bacharel em Sistemas de Informação
Pós-Graduando em Redes de Computadores e Segurança de Sistemas.

Anônimo disse...

Obrigado Paulo!

No caso paulo eu fiz isso em um Debian e em um Gentoo.

Ambos estavam com o 2.6.26 e eu compilei o 2.6.28.

Não sei se funcionaria com o Ubuntu. Sinceramente eu nunca recompilei um kernel via apitude ou apt-get. Eu sempre baixo o source do site oficial e compilo normalmente.


Obrigado por acompanhar o blog
Abraço