sexta-feira, 30 de dezembro de 2011

Adicionando suporte ao Layer7 no Debian Squeeze

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.
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. 
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 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
* 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 l
inux-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

*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:  

# 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

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

10 comentários:

  1. Parabéns pelo Artigo !! Muito bom ! Abraço

    ResponderExcluir
  2. Eu 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!

    Mesmo 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?

    ResponderExcluir
  3. 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:

    root@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

    ResponderExcluir
  4. DonLazaro
    tb 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

    ResponderExcluir
  5. Boa tarde, pessoal estou seguido o procedimento, porem quando chego no comando:

    fakeroot 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?

    ResponderExcluir
  6. Beleza,

    Eu 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 ?

    ResponderExcluir
  7. Uma sugestão, é não marcar a opção: "[*] Layer 7 debugging output", pois gera muito log, e consequentemente isso é um problema.

    ResponderExcluir
  8. Boa tarde, estou com o mesmo problema do anonimo:
    iptables 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

    ResponderExcluir
  9. Amigo,

    Tô 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???

    ResponderExcluir
  10. Este comentário foi removido pelo autor.

    ResponderExcluir

DropBox