Hoje veremos como implementar uma extensão do Netfilter chamada
Layer7. Com o Layer7 pode-se filtrar pacotes baseados na camada 7 que é a camada de aplicação do modelo OSI. Isso quer dizer que podemos filtrar pela aplicação e não somente pelas portas, como fazemos tradicionalmente. O Layer7 tem muita aplicação quando desejamos bloquear programas P2P, como Kazaa por exemplo.
Este é um artigo explicando como colocar o suporte ao Layer7 no
CentOS 5.3 e para isso precisaremos modificar tanto o pacote .rpm do kernel quanto do iptables, porque ambos precisarão ter suporte à este. O CentOS é uma distribuição gerada à partir dos fontes do Red Hat Enterprise
Linux.
Nesse artigo não explicarei o uso do Layer7, pois existem muitas documentações sobre o seu uso na internet.
Vamos precisar dos seguintes pacotes já pré-instalados para que não tenhamos erros de dependências:
# yum install module-init-tools patch bash sh-utils tar bzip2 findutils gzip m4 perl make diffutils gnupg gcc binutils redhat-rpm-config unifdef
Primeiramente vamos baixar o fonte do kernel, porque a partir dele vamos aplicar os patches que necessitamos e logo após geraremos novos pacotes .rpm. Abaixo nós temos os comandos para baixarmos nosso fonte do kernel usando o "wget" e logo em seguida faremos a sua instalação com o comando "rpm -ivh":
# cd /usr/src
# wget -c http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.3/updates/SRPMS/kernel-2.6.18-164.el5.src.rpm
# rpm -ivh kernel-2.6.18-164.el5.src.rpm
# cd /usr/src/redhat/SPECS/
Vamos editar o
kernel-2.6.spec nesse mesmo diretório, adicionar duas entradas à ele e modificar uma.
# vim kernel-2.6.spec
Localize a linha:
%define dist .el5
Para que possamos criar um pacote com nome personalizado, vamos alterar o ".el5" para algo como:
%define dist .el5mgc
Depois localize a linha abaixo. Esta é uma entrada de um patch aplicado ao kernel que baixamos. Não precisaremos saber o que esse patch faz, mas vamos pegar o último número que é 24387 e somar mais 1 para o nosso novo patch do Layer7:
Patch24387: linux-2.6-misc-information-leak-in-sigaltstack.patch
Adicione a seguinte linha, que é a entrada do novo patch do Layer7 que incluiremos ao nosso kernel. Como podem notar, este será o patch 24388:
Patch24388: kernel-2.6.18-2.6.19-layer7-2.9.patch
Localize a linha abaixo. Essa linha é aquele patch 24387 que já vem no nosso kernel, mas não precisamos saber o que ele faz. Só precisamos dele como referência:
%patch24387 -p1
Adicione logo abaixo o nosso novo patch, o 24388:
%patch24388 -p1
Salve e saia do kernel-2.6.spec.
Agora precisaremos baixar nosso patch do Layer7. Para isso acessaremos
http://sourceforge.net/projects/l7-filter/files/ e baixaremos o netfilter-layer7-v2.22.tar.gz em /usr/src.
Descompacte o programa e dentro do diretório "for_older_kernels/" pegue o patch
kernel-2.6.18-2.6.19-layer7-2.9.patch e jogue no diretório
/usr/src/redhat/SOURCES. Esse diretório é onde ficam todos os patches e arquivos necessários para a compilação e produção de qualquer pacote RPM.
Agora iremos em /usr/src/redhat/SOURCES e alteraremos em cada arquivo kernel-*.config:
-rw-rw-r-- 1 root root 72543 Out 8 15:59 kernel-2.6.18-i586.config
-rw-rw-r-- 1 root root 72275 Out 8 15:59 kernel-2.6.18-i686.config
-rw-rw-r-- 1 root root 72154 Out 8 15:59 kernel-2.6.18-i686-debug.config
-rw-rw-r-- 1 root root 72275 Out 8 16:00 kernel-2.6.18-i686-PAE.config
-rw-rw-r-- 1 root root 73404 Out 8 16:00 kernel-2.6.18-i686-xen.config
-rw-rw-r-- 1 root root 69726 Out 8 16:00 kernel-2.6.18-ia64.config
-rw-rw-r-- 1 root root 69605 Out 8 16:00 kernel-2.6.18-ia64-debug.config
-rw-rw-r-- 1 root root 71344 Out 8 16:00 kernel-2.6.18-ia64-xen.config
-rw-rw-r-- 1 root root 70413 Out 8 16:01 kernel-2.6.18-ppc64.config
-rw-rw-r-- 1 root root 70292 Out 8 16:01 kernel-2.6.18-ppc64-debug.config
-rw-rw-r-- 1 root root 70433 Out 8 16:01 kernel-2.6.18-ppc64-kdump.config
-rw-rw-r-- 1 root root 69923 Out 8 16:01 kernel-2.6.18-ppc.config
-rw-rw-r-- 1 root root 69940 Out 8 16:01 kernel-2.6.18-ppc-smp.config
-rw-rw-r-- 1 root root 69057 Out 8 16:02 kernel-2.6.18-s390.config
-rw-rw-r-- 1 root root 69067 Out 8 16:02 kernel-2.6.18-s390x.config
-rw-rw-r-- 1 root root 68957 Out 8 16:02 kernel-2.6.18-s390x-debug.config
-rw-rw-r-- 1 root root 71509 Out 8 16:02 kernel-2.6.18-s390x-kdump.config
-rw-rw-r-- 1 root root 70598 Out 8 16:03 kernel-2.6.18-x86_64.config
-rw-rw-r-- 1 root root 70477 Out 8 16:03 kernel-2.6.18-x86_64-debug.config
-rw-rw-r-- 1 root root 71767 Out 8 16:03 kernel-2.6.18-x86_64-xen.config
Dentro de cada um deles procure pela linha:
CONFIG_IP_NF_MATCH_IPRANGE=m
Abaixo dela adicione essas 2 linhas. Isso é necessário para que o kernel tenha as entradas devidamente configuradas. Sem isso a geração dos nossos pacotes RPM do kernel falharão. A primeira entrada habilita o Layer7 como módulo e a segunda habilita o DEBUG, como não usaremos o DEBUG, este não ficará marcado:
CONFIG_IP_NF_MATCH_LAYER7=m
# CONFIG_IP_NF_MATCH_LAYER7_DEBUG is not set
Vamos baixar o fonte do pacote
hmaccalc que está disponível no
CentOS 5.4. Após baixarmos com o wget, recriaremos o seu binário usando o comando
rpmbuild, como mostrado abaixo, para em seguida instalarmos usando o "rpm -ivh". Sem esse pacote nossa compilação do kernel também falhará:
# cd /usr/src
# wget -c ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/hmaccalc-0.9.6-1.el5.src.rpm
# rpmbuild --rebuild hmaccalc-0.9.6-1.i386.rpm
# rpm -ivh /usr/src/redhat/RPMS/i386/hmaccalc-0.9.6-1.i386.rpm
Agora vamos gerar nossos novos binários do kernel já com suporte ao Layer7. Para isso entraremos no diretório de SPECS e rodaremos o comando rpmbuild abaixo para gerar nossos binários do kernel:
# cd /usr/src/redhat/SPECS
# rpmbuild -bb --without kabichk --without debug --without debuginfo --without xen --target=`uname -m` kernel-2.6.spec
O comando acima não gerará um binário do kernel para Xen. Se for preciso basta remover o parâmetro "--without xen".
Após o build teremos o kernel com todos os patches da RH aplicados e mais o nosso Layer7. :)
Agora basta ir na arquitetura que está usando, instalar o novo kernel e fazer um reboot usando este novo kernel. Abaixo o exemplo:
# rpm -ivh /usr/src/redhat/RPMS/i686/kernel-2.6.18-164.el5mgc.i686.rpm
# rpm -ivh /usr/src/redhat/RPMS/i686/kernel-devel-2.6.18-164.el5mgc.i686.rpm
Agora precisaremos recompilar o iptables com suporte ao Layer7. O que fizemos anteriormente foi fazer com que o Netfilter no kernel suportasse nosso novo patch. Agora precisaremos dizer ao iptables como trabalhar com ele e para isso aplicaremos mais um patch à ferramenta. Vamos então baixar o fonte do iptables, instalar ele, copiar o patch que precisaremos para o SOURCES e mais uma vez ir ao diretório SPECS:
# cd /usr/src
# wget -c http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.3/os/SRPMS/iptables-1.3.5-4.el5.src.rpm
# rpm -ivh iptables-1.3.5-4.el5.src.rpm
# cp /usr/src/netfilter-layer7-v2.22/for_older_iptables/iptables-1.3-for-kernel-pre2.6.20-layer7-2.21.patch /usr/src/redhat/SOURCES/
# cd /usr/src/redhat/SPECS
Edite o
iptables.spec e adicione no topo do arquivo a linha abaixo. Novamente lembrando que isso é necessário para que possamos personalizar nosso pacote e diferenciá-lo do original que consta no repositório oficial:
# vim iptables.spec
%define dist el5mgc
Eu dei o nome "el5mgc", mas poderia ser el5custom ou como desejar.
Vamos adicionar os patches do Layer7 nos lugares conforme abaixo. Como o último patch era o Patch12, então criei o Patch13. Basicamente foi o que fizemos no .spec do kernel, procuramos as linhas de referência e adicionamos as linhas do patch, abaixo:
Patch12: iptables-1.3.5-headers.patch
Patch13: iptables-1.3-for-kernel-pre2.6.20-layer7-2.21.patch
.
.
.
%patch12 -p1 -b .headers
%patch13 -p1
Por último procure a linha abaixo. Essa linha é o início das instruções de building do nosso novo pacote:
%build
Adicione a linha a seguir acima do %build. Quando fazemos o rpmbuild, o sistema gera o .layer7-test sem permissão alguma e por isso dá um erro quando gerando o pacote. Adicionei a instrução "chmod 755" para justamente corrigir isso:
chmod 755 /usr/src/redhat/BUILD/iptables-1.3.5/extensions/.layer7-test
%build
Salve o iptables.spec e faça o comando abaixo para gerarmos nosso binário do iptables com suporte ao Layer7. Dessa forma o "rpmbuild" irá aplicar todos os patches já existentes, adicionará o nosso e criará o nosso .rpm personalizado:
# rpmbuild -bb iptables.spec
Quando acabar teremos em
/usr/src/redhat/RPMS/i386/ o pacote
iptables-1.3.5-4el5mgc.i386.rpm do iptables já com suporte ao Layer7. Agora é só instalar ele e usar!
Para ter certeza que o seu iptables tem o suporte ao layer7, depois de instalar o pacote procure por
libipt_layer7.so em
/lib/iptables.
# rpm -Uvh /usr/src/redhat/RPMS/i386/iptables-1.3.5-4el5mgc.i386.rpm
Bem, espero ter ajudado! :)
Marcelo Gondim <gondim @ linuxinfo.com.br>