Adicionando suporte ao Layer7 no CentOS 5.3
por
em 12-10-2009 às 11:24 (6430 Visualizações)
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:
[/FONT]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
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:
[/FONT]Código :[FONT=Courier New]%define dist .el5
Para que possamos criar um pacote com nome personalizado, vamos alterar o .el5 para algo como:
[/FONT]Código :[FONT=Courier New]%define dist .el5mgc
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:
[/FONT]Código :[FONT=Courier New]Patch24387: linux-2.6-misc-information-leak-in-sigaltstack.patch
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:
[/FONT]Código :[FONT=Courier New]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:
[/FONT]Código :[FONT=Courier New]%patch24387 -p1
Adicione logo abaixo o nosso novo patch, o 24388:
[/FONT]Código :[FONT=Courier New]%patch24388 -p1
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:
[/FONT]Código :[FONT=Courier New]CONFIG_IP_NF_MATCH_IPRANGE=m
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:
[/FONT]Código :[FONT=Courier New]%define dist el5mgc
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:
[/FONT]Código :[FONT=Courier New]%build
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/
[/FONT]Código :[FONT=Courier New]# 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 vai ter o suporte ao layer7, depois de instalar o pacote procure por libipt_layer7.so em /lib/iptables
[/FONT]Código :[FONT=Courier New]# rpm -Uvh /usr/src/redhat/RPMS/i386/iptables-1.3.5-4el5mgc.i386.rpm
Bem espero ter ajudado
Marcelo Gondim <gondim @ linuxinfo.com.br>
Comentários
+ Enviar Comentário