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:
Ó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.
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
Postar um comentário