Adicionando suporte ao Layer7 no CentOS 5.3

Implementação de 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.

[ Hits: 12.728 ]

Por: Marcelo Gondim em 14/10/2009


Adicionando suporte ao Layer7 no CentOS 5.3



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>

   

Páginas do artigo
   1. Adicionando suporte ao Layer7 no CentOS 5.3
Outros artigos deste autor

Adicionando suporte ao Layer7 no Debian Lenny

Squid + Bridge + TProxy no CentOS 5.4

Leitura recomendada

Instalação do Dspace no CentOS

Montando Servidor de Internet com Ubuntu Server

Verificando a temperatura do HD no Slackware

Servidor proxy autenticado (Squid + DansGuardian + OpenLDAP)

Acessando remotamente máquina Windows dentro de uma VPN através do Ubuntu

  
Comentários
[1] Comentário enviado por arturaragao em 14/10/2009 - 15:05h

Ótimo tutorial.
Funciona no fedora da mesma forma?
Você tem o mesmo procedimento, mas desta vez para o Ubuntu Server?

[2] Comentário enviado por uberalles em 14/10/2009 - 15:13h

Cara, já fazem uns três anos que eu não mexo com iptables. Mas tenho visto alguns appliances de "application firewall" caríssimos. Não sei até que ponto essa funcionalidade de trabalhar na camada 7 é refinada, mas vejo que é uma boa alternativa aos appliances.

[3] Comentário enviado por gondim em 14/10/2009 - 15:22h

Olá artur,

No Fedora não fiz ainda mas acredito que seja um procedimento semelhante. O que devem mudar provavelmente serão os nomes dos pacotes e até mesmo os specs mas a lógica deve prevalecer :) Agora já pra Ubuntu Server esse sim deve ser bem diferente. Não posso prometer mas tentarei fazer algo pra Debian/Ubuntu. :D

[4] Comentário enviado por gondim em 14/10/2009 - 15:24h

Uberalles,

Eu acho interessante o recurso do Layer7 mas os que mais gosto são o CONNLIMIT e TARPIT. Eles são importantes para bloquear alguns ataques. :) Meu próximo artigo provavelmente será sobre eles. :)

[5] Comentário enviado por removido em 16/10/2009 - 19:14h

Grande Gondim. Parabéns pelo tutorial.
Pessoa gente fina.

[]'s

[6] Comentário enviado por gondim em 27/10/2009 - 12:04h

Prezados,

Recentemente descobri que faltou um pequeno detalhe, mas muito importante, no artigo acima. Antes de começarem a parte de incluir o patch no iptables façam o seguinte:

cp /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/include/linux/netfilter_ipv4/ipt_layer7.h /usr/include/linux/netfilter_ipv4/

Depois continuem normalmente a parte do iptables. Sem o comando acima o iptables não incluirá o suporte ao Layer7.

[7] Comentário enviado por raszytko em 10/11/2009 - 17:57h

godin

Fiz o processo de reconpilar o iptables com o layer-7, mas ele não encontra o libipt_layer7.so no /lib/iptables, procurei esse arquivo e ele não existe, é na compilação que o arquivo e criado e depois gravado na instalação.

[8] Comentário enviado por raszytko em 11/11/2009 - 09:25h

Consegui, fiz uma busca mais detalhada e encontrei o arquivo libipt_layer7.so e copiei ele para /lib/iptables, depois criei a pasta /etc/7l-protocols/ e baixei o protocolos do site http://l7-filter.sourceforge.net/protocols com extensão .pat.

[9] Comentário enviado por silent-man em 02/03/2011 - 14:51h

gondim,

parabéns pelo tuto!

Só que é o seguinte, ele deixa de adicionar alguns módulos por exemplo o modulo time usado para liberar regras com intervalo de tempo.

Teria alguma dica com relação a isso?

[]s

[10] Comentário enviado por reinman em 28/10/2011 - 18:14h

Gondim, esse tuto serve também para o Centos 5.7 x64 ? Estou tendo problemas para aplicar o layer7 no iptables, ao dar o comando rpmbuild -bb iptables.spec aparece:

Patch #17 (iptables-1.3.5-headers.patch):
+ patch -p1 -b --suffix .headers -s
Reversed (or previously applied) patch detected! Assume -R? [n]

O que pode ser isso ?

Um abraço,

[11] Comentário enviado por gondim em 28/10/2011 - 19:25h

Essa mensagem é porque esse patch já se encontra nessa versão, logo você não precisaria aplicá-lo.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts