Ver Feed RSS

gondim

Adicionando suporte ao Layer7 no CentOS 5.3

Avalie este Post de Blog
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 RedHat 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:

Código :
[FONT=Courier New]# yum install module-init-tools patch bash sh-utils tar bzip2 findutils gzip m4 perl make diffutils gnupg gcc binutils redhat-rpm-config unifdef
[/FONT]

Primeiramente vamos baixar o fonte do kernel. Porque à 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”:

Código :
[FONT=Courier New][FONT=Courier New]# cd /usr/src[/FONT]
[FONT=Courier New]# wget -c http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.3/updates/SRPMS/kernel-2.6.18-164.el5.src.rpm[/FONT]
[FONT=Courier New]# rpm -ivh kernel-2.6.18-164.el5.src.rpm[/FONT]
[FONT=Courier New]# cd /usr/src/redhat/SPECS/[/FONT]
[/FONT]

Vamos editar o kernel-2.6.spec nesse mesmo diretório e adicionar 2 entradas nele e modificar 1. Localize a linha:

Código :
[FONT=Courier New]%define dist .el5
[/FONT]

Para que possamos criar um pacote com nome personalizado, vamos alterar o “.el5” para algo como:

Código :
[FONT=Courier New]%define dist .el5mgc
[/FONT]

Depois localize a linha abaixo. Esta é uma entrada de um patch aplicado no 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:

Código :
[FONT=Courier New]Patch24387: linux-2.6-misc-information-leak-in-sigaltstack.patch
[/FONT]

Adicione a seguinte linha abaixo. Essa linha é a entrada do novo patch do Layer7 que incluiremos no nosso kernel. Como podem notar este será o patch 24388:

Código :
[FONT=Courier New]Patch24388: kernel-2.6.18-2.6.19-layer7-2.9.patch
[/FONT]

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:

Código :
[FONT=Courier New]%patch24387 -p1
[/FONT]

Adicione logo abaixo o nosso novo patch, o 24388:

Código :
[FONT=Courier New]%patch24388 -p1
[/FONT]

Salve e saia do kernel-2.6.spec

Agora precisaremos baixar nosso patch do Layer7. Para isso acessaremos Browse Linux layer 7 packet classifier Files on SourceForge.net 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:

Código :
[FONT=Courier New][FONT=Courier New]-rw-rw-r-- 1 root root 72543 Out  8 15:59 kernel-2.6.18-i586.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 72275 Out  8 15:59 kernel-2.6.18-i686.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 72154 Out  8 15:59 kernel-2.6.18-i686-debug.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 72275 Out  8 16:00 kernel-2.6.18-i686-PAE.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 73404 Out  8 16:00 kernel-2.6.18-i686-xen.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 69726 Out  8 16:00 kernel-2.6.18-ia64.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 69605 Out  8 16:00 kernel-2.6.18-ia64-debug.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 71344 Out  8 16:00 kernel-2.6.18-ia64-xen.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 70413 Out  8 16:01 kernel-2.6.18-ppc64.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 70292 Out  8 16:01 kernel-2.6.18-ppc64-debug.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 70433 Out  8 16:01 kernel-2.6.18-ppc64-kdump.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 69923 Out  8 16:01 kernel-2.6.18-ppc.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 69940 Out  8 16:01 kernel-2.6.18-ppc-smp.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 69057 Out  8 16:02 kernel-2.6.18-s390.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 69067 Out  8 16:02 kernel-2.6.18-s390x.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 68957 Out  8 16:02 kernel-2.6.18-s390x-debug.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 71509 Out  8 16:02 kernel-2.6.18-s390x-kdump.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 70598 Out  8 16:03 kernel-2.6.18-x86_64.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 70477 Out  8 16:03 kernel-2.6.18-x86_64-debug.config[/FONT]
[FONT=Courier New]-rw-rw-r-- 1 root root 71767 Out  8 16:03 kernel-2.6.18-x86_64-xen.config[/FONT]
[/FONT]

Dentro de cada um deles procure pela linha:

Código :
[FONT=Courier New]CONFIG_IP_NF_MATCH_IPRANGE=m
[/FONT]

Logo 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 ficará não marcado:

Código :
[FONT=Courier New][FONT=Courier New]CONFIG_IP_NF_MATCH_LAYER7=m[/FONT]
[FONT=Courier New]# CONFIG_IP_NF_MATCH_LAYER7_DEBUG is not set[/FONT]
[/FONT]

Vamos baixar o fonte do pacote hmaccalc que estará 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á:

Código :
[FONT=Courier New][FONT=Courier New]# cd /usr/src[/FONT]
[FONT=Courier New]# wget -c ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/hmaccalc-0.9.6-1.el5.src.rpm[/FONT]
[FONT=Courier New]# rpmbuild --rebuild hmaccalc-0.9.6-1.i386.rpm[/FONT]
[FONT=Courier New]# rpm -ivh /usr/src/redhat/RPMS/i386/hmaccalc-0.9.6-1.i386.rpm[/FONT]
[/FONT]

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:

Código :
[FONT=Courier New][FONT=Courier New]# cd /usr/src/redhat/SPECS[/FONT]
[FONT=Courier New]# rpmbuild -bb --without kabichk --without debug --without debuginfo --without xen --target=`uname -m` kernel-2.6.spec[/FONT]
[/FONT]

O comando acima não gerará um binário do kernel para Xen. Se for precisar 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 e instalar o novo kernel e fazer um reboot usando este novo kernel. Abaixo o exemplo:

Código :
[FONT=Courier New][FONT=Courier New]# rpm -ivh /usr/src/redhat/RPMS/i686/kernel-2.6.18-164.el5mgc.i686.rpm[/FONT]
[FONT=Courier New]# rpm -ivh /usr/src/redhat/RPMS/i686/kernel-devel-2.6.18-164.el5mgc.i686.rpm[/FONT]
[/FONT]

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 na ferramenta. Vamos então baixar o fonte do iptables, instalar ele, copiar o patch que precisaremos para o SOURCES e mais uma vez ir no diretório SPECS:

Código :
[FONT=Courier New][FONT=Courier New]# cd /usr/src[/FONT]
[FONT=Courier New]# wget -c [URL]http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.3/os/SRPMS/iptables-1.3.5-4.el5.src.rpm[/URL][/FONT]
[FONT=Courier New]# rpm -ivh iptables-1.3.5-4.el5.src.rpm[/FONT]
[FONT=Courier New]# 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/[/FONT]
[FONT=Courier New]# cd /usr/src/redhat/SPECS[/FONT]
[/FONT]

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:

Código :
[FONT=Courier New]%define dist el5mgc
[/FONT]

Eu dei o nome el5mgc mas poderia ser el5custom ou como desejar.

Vamos adicionar os patches do layer7 nos lugares como 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:

Código :
[FONT=Courier New][FONT=Courier New]Patch12: iptables-1.3.5-headers.patch[/FONT]
[FONT=Courier New]Patch13: iptables-1.3-for-kernel-pre2.6.20-layer7-2.21.patch[/FONT]
[FONT=Courier New].[/FONT]
[FONT=Courier New].[/FONT]
[FONT=Courier New].[/FONT]
[FONT=Courier New]%patch12 -p1 -b .headers[/FONT]
[FONT=Courier New]%patch13 -p1[/FONT]
[/FONT]

Por último procure a linha abaixo. Essa linha é o início das instruções de building do nosso novo pacote:

Código :
[FONT=Courier New]%build
[/FONT]

E adicione a seguinte linha acima do %build como abaixo. 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:

Código :
[FONT=Courier New][FONT=Courier New]chmod[/FONT][FONT=Courier New] 755 /usr/src/redhat/BUILD/iptables-1.3.5/extensions/.layer7-test[/FONT]
 
[FONT=Courier New]%build[/FONT]
[/FONT]

Salve o iptables.spec e faça os comandos 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:

Código :
# 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/

Código :
[FONT=Courier New]# rpmbuild -bb iptables.spec
[/FONT]

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 vai ter o suporte ao layer7, depois de instalar o pacote procure por libipt_layer7.so em /lib/iptables

Código :
[FONT=Courier New]# rpm -Uvh /usr/src/redhat/RPMS/i386/iptables-1.3.5-4el5mgc.i386.rpm
[/FONT]

Bem espero ter ajudado

Marcelo Gondim <gondim @ linuxinfo.com.br>

Atualizado 27-10-2009 em 13:13 por gondim

Categorias
Artigos

Comentários

  1. Avatar de gondim
    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.

    Já alterei a documentação, mas se alguém chegou a tentar com a anterior e deu errado, só fazer como dito acima.
    Atualizado 27-10-2009 em 13:12 por gondim
  2. Avatar de code
    Citação Postado originalmente por gondim
    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.

    Já alterei a documentação, mas se alguém chegou a tentar com a anterior e deu errado, só fazer como dito acima.
    Marcelo, tenho uma sugestão para você. Além de comunicar sobre as modificações nos comentários (erros/acréscimos/etc), faça sempre as devidas implementações corretivas/expansivas no post original. Além de postar um bom texto, você estará sempre disponibilizando o mesmo conteúdo, sempre atualizado e o mais completo possível para todos no Under-Linux :-D
  3. Avatar de gondim
    Opa mas foi exatamente o que fiz. Coloquei uma mensagem explicando e o texto foi alterado.
  4. Avatar de code
    Citação Postado originalmente por gondim
    Opa mas foi exatamente o que fiz. Coloquei uma mensagem explicando e o texto foi alterado.
    Perfeito! :-D Não tinha reparado. Pelo seu texto no comentário parecia que as explicações estavam somente ali.

+ Enviar Comentário