Este é um artigo explicando como
colocar o suporte ao Layer7 no Debian Squeeze e para isso
precisaremos modificar tanto o pacote .deb do kernel quanto do iptables, porque ambos precisarão ter suporte à este.
Mas o que é Layer7?
O Layer7 é um excelente plugin para o kernel e iptables, onde é possível realizar o bloqueio de programas direto na camada de aplicação sem a necessidade de bloqueio por portas, o que muitas vezes é inviável.
Imagine realizar o bloqueio do Emule, Kazza, Bittorrent com todas as portas que eles utilizam, sendo que as portas são dinâmicas. Você certamente ficaria doido, pois a cada momento seria um porta diferente. Com o Layer7 é possível bloquear sem ter que fazer alteração alguma na estação, somente no servidor. O Layer7 também bloqueia P2P, MSN e muitos outros programas.
O Layer7 é um excelente plugin para o kernel e iptables, onde é possível realizar o bloqueio de programas direto na camada de aplicação sem a necessidade de bloqueio por portas, o que muitas vezes é inviável.
Imagine realizar o bloqueio do Emule, Kazza, Bittorrent com todas as portas que eles utilizam, sendo que as portas são dinâmicas. Você certamente ficaria doido, pois a cada momento seria um porta diferente. Com o Layer7 é possível bloquear sem ter que fazer alteração alguma na estação, somente no servidor. O Layer7 também bloqueia P2P, MSN e muitos outros programas.
Antes de começar-mos, você deve saber que, a possibilidade de se danificar o sistema inteiro por conta deste procedimento é mínima, quase zero (não digo nula porque o Murphy não me permite). Caso Murphy venha atuar, basta selecionar o antigo kernel e iniciar o sistema por ele (o antigo kernel não é removido, simplesmente é criado na lista do Grub, uma nova entrada para que seja selecionado o antigo kernel ou o recém compilado).
É isso mesmo, vamos ter que recompilar o kernel, mas não se assuste pensando que é coisa de outro mundo porque alguem te disse isso, é muito simples.
É isso mesmo, vamos ter que recompilar o kernel, mas não se assuste pensando que é coisa de outro mundo porque alguem te disse isso, é muito simples.
# 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 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, no meu caso utilizei o kernel 2.6.32, e logo após descompactarmos ele:
# cd /usr/src
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.bz2
# tar -xvjpf linux-2.6.32.tar.bz2
Criaremos um link simbólico para facilitar nossa vida:
# ln -sf linux-2.6.32 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
# wget http://download.sourceforge.net/l7-filter/netfilter-layer7-v2.22.tar.gz
# 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 Squeeze é o 2.6.32, e o netfilter 2.22 tem suporte somente para o kernel até o 2.6.28 (Lenny), você deve pensar que ele não suporta o Squeeze, porém utilizei o patch para kernels de 2.6.25 à 2.6.28 (o mais atual do Layer7) e não tive nenhum tipo de problema:
# 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 (o caminho pode variar de acordo com o kernel utilizado atualmente no sistema ou pela plataforma utilizada – 32/64 bits):
# cp /boot/config-2.6.32-5-amd64 /usr/src/linux/.config
# make menuconfig
Siga o menu abaixo para habilitar o Layer7 no kernel:
Networking Support >
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
[*] 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
*
Apenas para detalhamento: você pode alterar o nome do kernel
para diferenciamento dos demais kernels
do sistema, por exemplo, o comando acima seu kernel
será gerado com a versão “2.6.32-custom”
para alterar esse valor, modifique o campo --append-to-version=-custom
para --append-to-version=-<nome>,
assim ele será gerado com a versão do seguinte modo: “2.6.32-<nome>”.
Bom, nesse momento seria interessante uma pipoca e um bom filme, pois esse procedimento levará bastante tempo, particularmente, testei em um Core I3 3.2GHz com 4 de RAM e demorou cerca de 40 minutos, portanto, não ache que travou, que deu errado porque está demorando demais. 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.32-custom_2.6.32-custom-10.00.Custom_amd64.deb
# dpkg -i linux-headers-2.6.32-custom_2.6.32-custom-10.00.Custom_amd64.deb
Agora que instalamos nosso novo kernel, precisamos apontar ele no /boot/grub/menu.lst como default, alterando o parâmetro "default 0" para o seu novo kernel para que ele inicie automaticamente no 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.32-custom #1 SMP Wed Nov 9 08:40:30 BRST 2011 x86_64 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.32/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
Bom, nesse momento seria interessante uma pipoca e um bom filme, pois esse procedimento levará bastante tempo, particularmente, testei em um Core I3 3.2GHz com 4 de RAM e demorou cerca de 40 minutos, portanto, não ache que travou, que deu errado porque está demorando demais. 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.32-custom_2.6.32-custom-10.00.Custom_amd64.deb
# dpkg -i linux-headers-2.6.32-custom_2.6.32-custom-10.00.Custom_amd64.deb
Agora que instalamos nosso novo kernel, precisamos apontar ele no /boot/grub/menu.lst como default, alterando o parâmetro "default 0" para o seu novo kernel para que ele inicie automaticamente no 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.32-custom #1 SMP Wed Nov 9 08:40:30 BRST 2011 x86_64 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.32/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-src http://ftp.br.debian.org/debian/ lenny main # repositório de fonte
deb-src http://security.debian.org/ lenny/updates main # repositório de fonte
deb-src http://volatile.debian.org/debian-volatile lenny/volatile main
deb-src http://security.debian.org/ lenny/updates main # repositório de fonte
deb-src http://volatile.debian.org/debian-volatile lenny/volatile main
*Como dito mais acima, o Layer7 não tem suporte ao
Squeeze e por isso vamos adicionar os repositórios do Lenny, isso porque no
Squeeze, a versão do iptables é a 1.4.6 e para não
obtermos erros, vamos utilizar a versão 1.4.2, e volto a repetir, não obtive problema
algum ao utilizar uma versão mais antiga, na verdade tive problemas ao utilizar
a versão atual.
Para instalar o fonte do iptables façamos:
# cd /usr/src
# apt-get source iptables
Ou vá ao site do Netfilter e baixe a fonte de lá (para evitar a fadiga, preferi utilizar o apt-get... XD )
·
http://www.netfilter.org/projects/iptables/files/
Agora vamos copiar os arquivos
necessários para que layer7 seja incorporado ao nosso iptables:
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_amd64.deb
Isso vai nos gerar um problema, porque quando fizermos um "apt-get 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:
# 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_amd64.deb
Isso vai nos gerar um problema, porque quando fizermos um "apt-get 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
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:
- http://l7-filter.sourceforge.net/protocols
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 10.0.0.15 para ele:
# iptables -I INPUT -s 10.0.0.15 -m layer7 --l7proto ssh -j DROP
Da estação 10.0.0.15 fiz primeiro um telnet na porta 22 para mostrar que a regra permite o acesso:
# telnet 10.0.0.2 22
Trying 10.0.0.2...
Connected to 10.0.0.2.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.1p1 Debian-6
Como podem ver a conexão fechou com o serviço ssh. Agora farei o ssh para o servidor:
# ssh 10.0.0.2
......
Não conecta porque o protocolo ssh está bloqueado. Funcionou perfeitamente!
Fontes: http://www.vivaolinux.com.br/artigo/Adicionando-suporte-ao-Layer7-no-Debian-Lenny
http://www.vivaolinux.com.br/artigo/Integrando-Layer7-+-IPP2P-ao-Iptables
Parabéns pelo Artigo !! Muito bom ! Abraço
ResponderExcluirEu não consegui... Primeiro que os arquivos ".deb" que ele gera não é referente ao da minha arquitetura (que é a mesma utilizada neste tutorial, amd64)... Ele gera i386!
ResponderExcluirMesmo assim, sigo os passos informados e quando vou iniciar a compilação ele faz várias perguntas, algo que não encontrei em nenhum tutorial quais opções devem ser setadas com yes e qual deve ser com no...
Blz, segui o default (se o sistema fazia a pergunta com o yes já como default eu deixava ele mesmo)... Então ao finalizar tudo e reiniciar a máquina, quando vou iniciar por esse kernel customizado ele sobe uma tela preta com um cursor piscando no canto esquerdo superior e não sai disso...
Sabe o que pode ser?
Amigo, removi o iptables que veio(1.4.8) e baixei o source do 1.4.2, na hora de gerar o .deb, veja a mensagem:
ResponderExcluirroot@bacula:/usr/src/iptables-1.4.2# dpkg-buildpackage -rfakeroot
dpkg-buildpackage: warning: using a gain-root-command while being root
dpkg-buildpackage: export CFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export CPPFLAGS from dpkg-buildflags (origin: vendor):
dpkg-buildpackage: export CXXFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export FFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export LDFLAGS from dpkg-buildflags (origin: vendor):
tail: não foi possível abrir "debian/changelog" para leitura: Arquivo ou diretório não encontrado
dpkg-buildpackage: error: tail of debian/changelog gave error exit status 1
DonLazaro
ResponderExcluirtb tive esse problema, é q vc baixou os fontes do site do iptables e não do debian, vc deve executar isso:
# ./configure --with-ksource=/usr/src/linux
# make
# make install
aqui ele não comenta, mas vc tb vai necessitar dos protocols
# wget http://ufpr.dl.sourceforge.net/project/l7-filter/Protocol%20definitions/2009-05-28/l7-protocols-2009-05-28.tar.gz
descompacte e instale
# make install
Boa tarde, pessoal estou seguido o procedimento, porem quando chego no comando:
ResponderExcluirfakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
da o seguinte erro:
/usr/src/linux-2.6.32/arch/x86/include/asm/ptrace.h:145:13: note: previous declaration of ‘syscall_trace_enter’ was here
arch/x86/kernel/ptrace.c:1517:17: error: conflicting types for ‘syscall_trace_leave’
In file included from /usr/src/linux-2.6.32/arch/x86/include/asm/vm86.h:130:0,
from /usr/src/linux-2.6.32/arch/x86/include/asm/processor.h:10,
from /usr/src/linux-2.6.32/arch/x86/include/asm/thread_info.h:22,
from include/linux/thread_info.h:56,
from include/linux/preempt.h:9,
from include/linux/spinlock.h:50,
from include/linux/seqlock.h:29,
from include/linux/time.h:8,
from include/linux/timex.h:56,
from include/linux/sched.h:56,
from arch/x86/kernel/ptrace.c:11:
/usr/src/linux-2.6.32/arch/x86/include/asm/ptrace.h:146:13: note: previous declaration of ‘syscall_trace_leave’ was here
make[3]: ** [arch/x86/kernel/ptrace.o] Erro 1
make[2]: ** [arch/x86/kernel] Erro 2
make[1]: ** [arch/x86] Erro 2
make[1]: Saindo do diretório `/usr/src/linux-2.6.32'
make: ** [debian/stamp/build/kernel] Erro 2
Alguem sabe o que é ou pode me ajudar?
Beleza,
ResponderExcluirEu compilei o kernel de certo, mas o iptables da erro.
root@debian-firewall:/etc/l7-protocols# lsmod | grep xt_layer7
xt_layer7 7760 0
nf_conntrack 37164 1 xt_layer7
x_tables 8257 2 ip_tables,xt_layer7
root@debian-firewall:/etc/l7-protocols# /sbin/iptables -I INPUT -s localhost -m layer7 --l7proto ssh -j DROP
/lib/xtables/libxt_layer7.so: /lib/xtables/libxt_layer7.so: undefined symbol: exit_error
iptables v1.4.8: Couldn't load match `layer7':/lib/xtables/libipt_layer7.so: cannot open shared object file: No such file or directory
Try `iptables -h' or 'iptables --help' for more information.
Ja tentei remover o iptables e usa o do deb
Como resolver isso ?
Uma sugestão, é não marcar a opção: "[*] Layer 7 debugging output", pois gera muito log, e consequentemente isso é um problema.
ResponderExcluirBoa tarde, estou com o mesmo problema do anonimo:
ResponderExcluiriptables v1.4.2: Couldn't load match `layer7':/lib/xtables/libipt_layer7.so: cannot open shared object file: No such file or directory
Alguma dica?
Valeu
Diter
Amigo,
ResponderExcluirTô com esses aviso no DMESG:
[37693.810867] layer7: matched bittorrent
[37694.248963] layer7: matched bittorrent
[37694.743641] layer7: couldn't get conntrack.
[37694.743647] layer7: couldn't get conntrack.
[37694.743649] layer7: couldn't get conntrack.
[37694.743650] layer7: couldn't get conntrack.
[37694.743652] layer7: couldn't get conntrack.
Alguma dica pra esse erro???
Este comentário foi removido pelo autor.
ResponderExcluir