Este é um artigo explicando como colocar o suporte ao
Layer7 no
Debian Lenny e para isso precisaremos modificar tanto o pacote .deb do kernel quanto do iptables, porque ambos precisarão ter suporte à este. O Debian é uma distribuição
GNU/Linux bem tradicionalista, muito estável, com excelente performance e com mais de 20.000 pacotes binários em seus repositórios oficiais.
Vamos precisar dos seguintes pacotes já pré-instalados para que não tenhamos erros na compilação dos pacotes:
# aptitude install fakeroot libncurses5-dev kernel-package dpkg-dev file gcc g++ libc6-dev make patch perl autoconf automake dh-make debhelper devscripts fakeroot gnupg g77 gpc xutils lintian quilt libtool libselinux1-dev linuxdoc-tools zlib1g-dev
Primeiramente vamos baixar o fonte do kernel, porque a partir dele vamos aplicar os patches que necessitamos e logo após geraremos novos pacotes .deb. Abaixo nós temos os comandos para baixarmos nosso fonte do kernel e logo após descompactarmos ele:
# cd /usr/src
# aptitude install linux-source-2.6.26
# tar -xvjpf linux-source-2.6.26.tar.bz2
Criaremos um link simbólico para facilitar nossa vida:
# ln -sf linux-source-2.6.26 linux
Agora baixaremos o Layer7 para aplicarmos no kernel e no iptables mais tarde. Para isso acessaremos
http://sourceforge.net/projects/l7-filter/files/ e baixaremos o netfilter-layer7-v2.22.tar.gz em /usr/src. Logo em seguida descompactaremos nosso programa:
# cd /usr/src
# tar -xvzpf netfilter-layer7-v2.22.tar.gz
Agora que temos os arquivos necessários precisamos copiar o patch para o kernel e aplicá-lo. Como nosso kernel no Debian Lenny é o 2.6.26, então usaremos o patch para kernels de 2.6.25 à 2.6.28:
# cd netfilter-layer7-v2.22
# cp kernel-2.6.25-2.6.28-layer7-2.22.patch /usr/src/linux/
# cd /usr/src/linux
# patch -p1 < kernel-2.6.25-2.6.28-layer7-2.22.patch
Agora que aplicamos o patch no kernel, precisamos habilitá-lo antes de compilarmos nosso novo kernel:
# cp /boot/config-2.6.26-2-686 /usr/src/linux/.config
# make menuconfig
Siga o menu abaixo para habilitar o Layer7 no kernel:
Networking ---> Networking options ---> Network packet filtering framework (Netfilter) ---> Core Netfilter Configuration --->
<M> "layer7" match support
[ ] Layer 7 debugging output
Volte e saia salvando. Agora para gerarmos nosso novo kernel faremos os comandos abaixo:
# make-kpkg clean
# fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
Bem, nesse momento seria interessante uma pipoca e um bom filme, pois esse procedimento levará bastante tempo. Se tudo correr bem no final teremos o pacote .deb do kernel e instalaremos como abaixo:
# cd /usr/src
# dpkg -i linux-image-2.6.26-custom_2.6.26-custom-10.00.Custom_i386.deb
Agora que instalamos nosso novo kernel, precisamos apontar ele no
/boot/grub/menu.lst alterando o parâmetro "default 0" para o seu novo kernel. No meu caso aqui ficou "default 2". Tendo feito isso, reinicie seu sistema e certifique-se de entrar com seu novo kernel. Após o boot, para ter certeza execute:
# uname -a
Linux debian 2.6.26-custom #1 SMP Mon Oct 19 17:36:31 BRST 2009 i686 GNU/Linux
Lá está nosso kernel custom carregado. Agora partiremos para o iptables.
Copiaremos xt_layer7.h do kernel para o lugar correto onde será usado na hora da compilação do iptables:
# cp /usr/src/linux-source-2.6.26/include/linux/netfilter/xt_layer7.h /usr/include/linux/netfilter/
Agora vamos instalar nosso fonte do iptables. Antes certifique-se que os repositórios de fontes estão habilitados no
/etc/apt/sources.list:
# cat /etc/apt/sources.list
deb http://ftp.br.debian.org/debian/ lenny main
deb-src http://ftp.br.debian.org/debian/ lenny main # repositório de fonte
deb http://security.debian.org/ lenny/updates main
deb-src http://security.debian.org/ lenny/updates main # repositório de fonte
deb http://volatile.debian.org/debian-volatile lenny/volatile main
deb-src http://volatile.debian.org/debian-volatile lenny/volatile main
Para instalar o fonte do iptables façamos:
# cd /usr/src
# apt-get source iptables
Agora vamos copiar os arquivos necessários para que layer7 seja incorporado ao nosso iptables:
# cp /usr/src/netfilter-layer7-v2.22/for_older_iptables/iptables-1.4.1.1-for-kernel-2.6.20forward/* /usr/src/iptables-1.4.2/extensions
Bem, só precisamos gerar nosso novo pacote iptables e para isso façamos os procedimentos abaixo:
# cd /usr/src/iptables-1.4.2
# dpkg-buildpackage -rfakeroot
No final do comando acima teremos nosso pacote .deb do iptables e para instalá-lo façamos:
# cd /usr/src
# dpkg -i iptables_1.4.2-6_i386.deb
Isso vai nos gerar um problema, porque quando fizermos um "aptitude dist-upgrade", por exemplo, o sistema vai querer atualizar o iptables com a versão oficial. Para que isso não ocorra criaremos, se não existir, o arquivo
/etc/apt/preferences e colocaremos nele as seguintes linhas:
Package: iptables
Pin: version 1.4.2
Pin-Priority: 1001
Para usarmos nosso novo sistema de filtragem Layer7 também precisaremos dos protocolos que iremos utilizar, que podem ser baixados do seguinte site:
São os arquivos .pat e devem ser colocados em /etc/l7-protocols/. Esse diretório não vai existir, logo precisamos criá-lo:
# mkdir /etc/l7-protocols/
Agora vamos fazer um teste prático. Baixaremos o .pat do ssh:
# cd /etc/l7-protocols
# wget -c http://l7-filter.sourceforge.net/layer7-protocols/protocols/ssh.pat
Vamos carregar nosso módulo:
# modprobe xt_layer7
E agora a nossa regra para bloquear o protocolo "ssh", mas o "telnet" na porta 22 funcionará. Estamos bloqueando o protocolo independente da sua porta.
Em nosso servidor fiz a regra abaixo que diz para bloquear qualquer ssh da estação 192.168.10.253 para ele:
# iptables -I INPUT -s 192.168.10.253 -m layer7 --l7proto ssh -j DROP
Da estação 192.168.10.253 fiz primeiro um telnet na porta 22 para mostrar que a regra permite o acesso:
# telnet 192.168.10.175 22
Trying 192.168.10.175...
Connected to 192.168.10.175.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.1p1 Debian-5
Como podem ver a conexão fechou com o serviço ssh. Agora farei o ssh para o servidor:
# ssh 192.168.10.175
......
Não conecta porque o protocolo ssh está bloqueado. Funcionou perfeitamente!
Bem, espero ter ajudado. :)
Marcelo Gondim <gondim @ linuxinfo.com.br>