Adicionando suporte ao Layer7 no Debian Lenny

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 pelo protocolo da 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: 18.206 ]

Por: Marcelo Gondim em 22/10/2009


Adicionando suporte ao Layer7 no Debian Lenny



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>

   

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

Squid + Bridge + TProxy no CentOS 5.4

Adicionando suporte ao Layer7 no CentOS 5.3

Leitura recomendada

Instalação do OpenGL em placas NVIDIA

Debian como servidor DHCP no VirtualBox

Permissão de Execução de Arquivo (Script ou Binário) no GNU/Linux - Elementos Básicos para Compreensão

Como colocar um programa para inicializar no boot

Boot gráfico no ArchLinux

  
Comentários
[1] Comentário enviado por silent-man em 22/10/2009 - 08:32h

Bom artigo, apesar de existir vários com esse assunto para debian e derivados.

Só tenho uma pergunta:

Por que não usar uma versão mais recente do kernel?

OBS: não é crítica nenhuma. O Artigo está Bom!

[2] Comentário enviado por gondim em 22/10/2009 - 08:54h

Olá silent-man,

Poderia ser feito com um kernel mais recente sim. :) O objetivo do artigo era tipo usar tudo do próprio Debian de forma que facilitasse e ainda pudesse ser gerado os pacotes com o suporte ao Layer7. Tirando a demora da compilação do kernel, seguindo os passos rapidamente coloquei o suporte no Debian pois precisei fazer isso recentemente em um cliente. :)
Recentemente fiz o mesmo para o CentOS 5.3. :D

[3] Comentário enviado por removido em 22/10/2009 - 11:36h

Parabéns Gondim. Mais um excelente tutorial.

[]'s

[4] Comentário enviado por removido em 22/10/2009 - 13:51h

Parabéns Pelo artigo.


Pena que o Layer7 nao consegue bloquear o msn da versão 7 para cima.


Mesmo Utilizando os plugins msnmessenger msn-filtertransfer.



[5] Comentário enviado por grandmaster em 23/10/2009 - 09:37h

Otimo artigo.

Essa do MSN é a briga do gato e do rato :D

---
Renato de Castro Henriques
CobiT Foundation 4.1 Certified ID: 90391725
http://www.renato.henriques.nom.br

[6] Comentário enviado por andrefreire em 25/10/2009 - 13:04h

Boa tarde !

Para douglashx : Tenho Layer 7 aqui instalado e nenhuma versão de MSN consegue passar ! Reveja suas configurações !

[7] Comentário enviado por Marcus-RJ em 26/10/2009 - 14:22h

"O objetivo do artigo era tipo usar tudo do próprio Debian de forma que facilitasse e ainda pudesse ser gerado os pacotes com o suporte ao Layer7"

Era exatamente o que eu estava procurando e pude encontrar aqui. Nao pude encontrar um artigo desse tipo nem mesmo em ingles. Parabens mesmo, e valeu pela ajuda!

Tentei habilitar o suporte ipp2p, mas a combinacao de iptables + kernel do debian lenny acabou me cansando. mas eh possivel fazer usando o repositorio unstable.

Otimo tutorial, extremamente relevante!

[8] Comentário enviado por kepas em 29/04/2010 - 19:24h

Olá pessoal,
eu fiz tudo como manda o tuto, e aparentemente as regras estão ok, por que elas aparecem nas regras do iptables quando eu dou um 'iptables -L'. Porém o meu msn continua acessando normalmente!

Alguém pode me dar alguma dica.


Obrigado!

[9] Comentário enviado por gondim em 29/04/2010 - 19:34h

Olá kepas,

Parece que o layer7 relacionado ao msn não funciona com a versão mais recente. Algumas pessoas já até postaram aqui sobre isso. Teste com outros serviços para ver se é só mesmo o msn ou possa ter algo errado na sua instalação.

Grande abraço

[10] Comentário enviado por campiola em 20/09/2010 - 21:53h

Ola amigo.. estou com um problema.. qdo tento executa o comando:

dpkg -i iptables_1.4.2-6_i386.deb

me vem esse erro.. oke faço???
dpkg: erro processando iptables_1.4.2-6_i386.deb (--install):
impossível acessar arquivo: Arquivo ou diretório não encontrado
Erros foram encontrados durante o processamento de:
iptables_1.4.2-6_i386.deb

valeu

[11] Comentário enviado por blade_ander em 27/12/2010 - 11:11h

Pessoal,

Se tiverem problemas e o módulo não subir, vai a dica, no caso usando Debian 5.06 lenny.

Alterando configuração do modulo L7:
# cp /lib/modules/2.6.26/kernel/net/netfilter/xt_layer7.ko
/lib/modules/2.6.26-2-686/kernel/net/ipv4/netfilter/xt_layer7.ko


Editando arquivo de módulos:


vim /lib/modules/2.6.26-2-686/modules.dep

Adicone a linha abaixo no final do arquivo:

/lib/modules/2.6.26-2-686/kernel/net/ipv4/netfilter/xt_layer7.ko: /lib/modules/2.6.26-2-686/kernel/net/netfilter/nf_conntrack.ko /lib/modules/2.6.26/kernel/net/netfilter/x_tables.ko


Reinicie o servidor.

Subir o modulo: modprobe xt_layer7

[12] Comentário enviado por texera em 17/01/2011 - 15:14h

Prezado Condin, sabe de alguma forma para atualizar o Kernel sem ter que recompilar tudo outra vez?

Seguí seu Tutorial e funcionou de prima no Debian!

[13] Comentário enviado por clebersontheo em 24/11/2015 - 19:13h

Alguém pode me auxiliar com esse problema:
ao executar o comando apt-get source iptables surge esse erro
não foi possivel abrir arquivo /var/lib/apt/lists/ftp.br.debian.org_debian_dists_lenny_source_Sources


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts