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: 17.959 ]

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

Um pouco sobre otimização

Slax no pendrive - é viável e também útil

Linux, USB-IrDA, T300 on the rocks

Configurando um servidor de FTP no OpenBSD

Linux com cara de Windows para atrair novos usuários

  
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