Layer7 e compilação do kernel mole-mole com Conectiva 10

O cenário

Em empresas, escolas, instituições públicas, o controle eficaz do tráfego é fundamental. A “educação” dos usuários da rede deveria ser proporcional à importância que a internet tem para a empresa, mas sabemos que nem sempre isso acontece, principalmente em instituições públicas.Há usuários que aproveitam-se de programas “visualmente discretos”, como o kazaa, emule e deixam estes programas minimizados ao lado do relógio, consumindo toda a banda do link da empresa, fazendo falta na hora de enviar um e-mail ou fazer uma transação bancária, por exemplo.

Além de outras medidas que devem ser tomadas para regularizar o tráfego, como um acompanhamento através do MRTG e SARG, controle de banda com HTB, uma das mais importantes é aplicação do layer7, que proporciona um controle eficaz sobre o tráfego da rede, inclusive sobre p2p.

Após o controle correto com o layer7, a internet apresentará uma melhoria de até 60% no tráfego da rede, baseando-se numa empresa com um número considerável de funcionários e com alguns engraçadinhos que gostam de baixar músicas, vídeos e jogos. Este cenário pode ser comparado ao de uma instituição pública, como uma prefeitura ou um hospital, por exemplo.

Na análise do cenário o administrador da rede deve verificar qual é a melhor opção, optando por bloquear totalmente programas de mensagens instantâneas, como MSN, ICQ, Skype, programas p2p (kazaa, emule, edonkey, shareaza, imesh, napster, etc) ou se o caso é apenas de baixar a banda destes programas. Este artigo mostrará como bloquear totalmente estes programas. 

Preparando o terreno

Os passos deste artigo referem-se ao Conectiva 10. Não testei em outras distribuições nem em outras versões do Conectiva, portanto, desde já aconselho um backup de seus arquivos e principalmente do kernel atual.Nos servidores que instalo, escolho apenas a opção INSTALAÇÃO MÍNIMA e depois instalo os pacotes necessários manualmente, através do comando “apt-get install nome_do_pacote”. É de uma máquina com estas características que faço os procedimentos descritos neste artigo sem encontrar problema algum.

Os procedimentos serão os seguintes:

  1. Baixar os fontes do kernel e outros programas necessários para sua compilação.
  2. Baixar os fontes e patches do iptables, e do layer7.
  3. Aplicar os patches do layer7 no iptables e no kernel.
  4. Instalar o l7-Protocols.
  5. Compilar o kernel e criar uma imagem de inicialização.
  6. Atualizar o iptables para a versão 1.3.4.
  7. Configurar o LILO.
Baixando e instalando os pacotes

Antes de instalar os fontes do kernel é interessante dar uma observada no diretório /usr/src/. Provavelmente ele estará vazio.Atualize seu apt-get antes de baixar os arquivos:

# apt-get update

Agora instale os pacotes necessários para a compilação do kernel, inclusive os fontes do novo kernel:

# apt-get install task-kernel-compiling gcc patch make kernel-source

Depois da instalação, os fontes do kernel podem ser encontrados em /usr/src/linux.

Baixando outros arquivos necessários e descompactando

Se você for fazer este procedimentos manualmente, procure e baixe estes arquivos na internet. Se optar pelo script que desenvolvi, eles serão descompactados automaticamente e você não precisa se preocupar com esta etapa. É importante que ao baixar os arquivos, procure as versões idênticas às que estão mostradas logo abaixo para evitar incompatibilidades.

  • iptables-1.3.4.tar.bz2
  • l7-protocols-2006-05-21.tar.gz
  • netfilter-layer7-v2.2.tar.gz

Copie ou mova os três arquivos acima para o diretório /usr/src/:

# mv iptables-1.3.4.tar.bz2 /usr/src/
# mv l7-protocols-2006-05-21.tar.gz /usr/src/
# mv netfilter-layer7-v2.2.tar.gz /usr/src/

Descompacte todos os arquivos no mesmo diretório:

# tar -jxvf iptables-1.3.4.tar.bz2
# tar -zxvf l7-protocols-2006-05-21.tar.gz
# tar -zxvf netfilter-layer7-v2.2.tar.gz

Agora observe que dentro do diretório /usr/src (que estava vazio) há as seguintes pastas:

linux-2.6.11-72032U10_23cl
linux
iptables-1.3.4
l7-protocols-2006-05-21
netfilter-layer7-v2.2

A pasta linux-2.6.11-72032U10_23cl e linux são a mesma coisa. A segunda sendo portanto apenas um link para a pasta real (primeira). Dentro desta pasta estão os fontes do kernel do Linux. Qualquer alteração, como a que vamos fazer aqui, deve ser feita antes da compilação. Na pasta iptables-1.3.4 há os fontes do iptables-1.3.4. As patches que serão aplicadas no iptables também seguem as mesmas regras do kernel, devendo ser feitas antes da instalação.

A compilação do kernel pegará seus fontes e suas alterações e gerará uma nova imagem, que será carregada durante o boot. A instalação do iptables fará coisa semelhante. Pegará seus fontes e compilará, criando o aplicativo iptables.

Aplicando as patches

Para aplicar as patches no kernel e no iptables, é de extrema importância que você esteja dentro do diretório dos fontes.Para aplicar a patch ao kernel faça o seguinte:

# cd /usr/src/linux
# patch -p1 < /usr/src/netfilter-layer7-v2.2/kernel-2.6.13-2.6.16-layer7-2.2.patch

Para aplicar a patch ao iptables faça o seguinte:

# cd /usr/src/iptables-1.3.4
# patch -p1 < /usr/src/netfilter-layer7-v2.2/iptables-layer7-2.2.patch

OBS: O l7Filter possui um bug em um script que é adicionado ao iptables. É um arquivo (.layer7-test) que deve ser transformado em executável, senão nosso layer7 vai por água abaixo. Para corrigir este problema, acrescente o atributo de executável com o código baixo:

# chmod a+x /usr/src/iptables-1.3.4/extensions/.layer7-test

Feito isso tanto o kernel como o iptables estão prontos para serem compilados já com as novas alterações. Agora resta a instalação do l7-protocols, que é muito fácil.

Entre no fonte do l7-protocols:

# cd /usr/src/l7-protocols-2006-05-21
# make
# make install

A partir daqui é aconselhável fazer um backup da imagem do kernel, da imagem de inicialização e da pasta dos módulos.

Faça um backup dos seguintes arquivos:

  • /boot/initrd-versão_do_kernel (imagem de inicialização)
  • /boot/vmlinuz-versão-do-kernel (kernel compilado)

Faça também um backup do diretório dos módulos do kernel:

  • /lib/modules/2.6.5-versão_do_kernel

# cp -ar 2.6.5-versão 2.6.5-versão.backup

Configurando e compilando o kernel

Agora vamos meter a mão na massa realmente e compilar esse tal de kernel! Entre no diretório dos fontes do kernel:# cd /usr/src/linux

Digite o seguinte comando:

# make menuconfig

Surgirá então o menu de configuração do kernel, guardião de todos os poderes sobre o Linux (risos). Neste menu temos um caminho a seguir e deve ser conforme o exemplo abaixo:

-> Device Drivers
—> Networking Support
—–> Networking options
——-> Network packet filtering (replace ipchains)
———> IP: netfilter configuration
———–> Layer 7 match suppotr (marcar esta opção)
————–> Layer 7 debugging output (marcar esta opção)

Depois escolha EXIT até sair do kernel e salve suas alterações quando solicitado no final. Seu kernel está pronto pra ser compilado. O processo de compilação pode demorar até algumas horas dependendo do PC. Num K6/2-350 com 64MB é quase uma fábula e demora 1 hora e 2 minutos. Porém num Athlon XP 2000, com 256MB demora 15 minutos, enquanto numa máquina com 64 bits com 512MB demora apenas 5 minutos.

Inicie a compilação sem sair do diretório onde está (/usr/src/linux):

# make dep
# make clean
# make bzImage

A expressão bzImage pode ser substituída por qualquer outro nome que você queira dar a imagem. Uso este por vício.

Se desejar use todos os comandos em uma só linha para não ter que aguardar um terminar para iniciar o outro:

# make dep && make clean && make bzImage

Após a compilação será crido uma imagem do novo kernel com o nome bzImage. Copie esta imagem para a pasta /boot.

# cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage

Agora será necessário renomear a pasta dos módulos do kernel antigo antes de aplicarmos os próximos passos e com certeza mais demorados do que a compilação. Este passo será desfeito logo após a compilação dos módulos:

# mv /lib/modules/2.4.5-versão_antiga_kernel /lib/modules/2.4.5-versão_antiga_kernel-old

Ao renomear esta pasta, seu sistema dará uma parada nas principais funções, como iptables, por exemplo. É importante que você não reinicie o computador com a pasta renomeada e aguarde com bastante paciência o término da compilação dos módulos.

Pra falar a verdade este passo de renomear o diretório dos módulos é apenas uma superstição minha e creio que não é necessário, mas a única vez que fiz todo este processo sem renomear esta pasta perdi um servidor e tive que formata-lo novamente. Creio que foi por outro problema, mas não tenho certeza. Aproveito e peço a quem tiver testado sem esta opção ou quem puder testar, por favor me mande um e-mail informando se deu certo.

Compilando os módulos e criando os scripts de inicialização

Vamos então à compilação dos módulos:# cd /usr/src/linux
# make modules && make modules_install

Aproveite e vá tomar um café, porque estas opções são demoradas. Dependendo da máquina podem levar horas para serem concluídas. Após a compilação dos módulos, retorne na pasta /lib/modules/ e volte o nome original da pasta dos módulos do kernel que você renomeou (lembra?).

# mv /lib/modules/2.4.5-versão_antiga_kernel-old /lib/modules/2.4.5-versão_antiga_kernel

O pior já passou, acredite! Se até aqui não deu nenhum erro parabéns! Agora vamos criar uma imagem de inicialização baseada no novo kernel.

# cd /boot
# mkinitrd initrd-bzImage 2.6.11-72032U10_23cl

Configurando o lilo.conf

Surgirá um novo arquivo como nome initrd-bzImage. Esta é a sua imagem de inicialização para o novo kernel. Agora você deve informar ao seu gerenciador de boot onde está o novo kernel. Neste exemplo usei o lilo. Acrescente ao final do arquivo /etc/lilo.conf as seguintes linhas:

OBS.: Lembre que se você escolheu outro nome senão o bzImage, ele deve ser informado em todas as linhas de código até aqui.

image=/boot/bzImage
root=/dev/hda2 # (ou o mesmo do kernel velho)
label=Kernel-Novo
initrd=/boot/initrd-bzImage
read-only
Com as configurações atuais você poderá trabalhar com dois kernels. Absolutamente nada do seu kernel antigo foi perdido e a opção de escolher entre um e outro ajuda bastante caso algo tenha saído errado. Se quiser tornar o novo kernel como padrão na inicialização, acrescente a seguinte linha no seu lilo, caso ela já não exista:
default=Kernel-Novo
Depois de salvar e fechar este arquivo digite o comando lilo para ativar suas alterações.# lilo
Instalando o iptables-1.3.4

Agora resta apenas instalar o novo iptables (já com a nova patch que você aplicou) e remover o antigo.Removendo o iptables antigo:

# apt-get remove iptables -y

Instalando a nova versão do iptables (vá para a pasta dos fontes do iptables que você baixou):

# cd /usr/src/iptables-1.3.4

# make
# make install
# make KERNEL_DIR=/usr/src/linux-2.6.11-72032U10_23cl/
# make install KERNEL_DIR=/usr/src/linux-2.6.11-72032U10_23cl/
# make BINDIR=/usr/bin LIBDIR=/usr/lib MANDIR=/usr/man
# make BINDIR=/usr/bin LIBDIR=/usr/lib MANDIR=/usr/man install

Depois de instalado o novo iptables reinicie o computador. Observe que o lilo já chama o novo kernel como padrão (se você tiver configurado a opção default no lilo.conf).

Criando regras para bloqueio

Agora crie um script e transforme-o em executável. Dentro dele colocaremos as regras do exemplo abaixo para bloquear p2p, jogos, etc. Chame este script toda vez que o computador reiniciar, assim como você faz com seus scripts pessoais.
#!/bin/sh# Carregando módulo do kernel
modprobe ipt_layer7

# Lista de protocolos bloqueados
# Ver lista completa de protocolos suportados em /etc/l7-protocols/protocols

protocolo=”
ares
bittorrent
counterstrike-source
dayofdefeat-source
directconnect
doom3
edonkey
fasttrack
gnutella
halflife2-deathmatch
imesh
napster
quake-halflife
quake1

for tranca in `echo $protocolo`;do
echo “Bloqueando o protocolo $tranca”
iptables -A FORWARD -m layer7 –l7proto $tranca -j DROP
done

Finalizando

Criei este script depois de apanhar por muito tempo tentando compilar o kernel no Conectiva 10. Em livros há exemplos de outras distribuições, em tutoriais, apostilas, dicas e artigos há pedaços de informações sobre o Conectiva e só com muita perseverança, teimosia, sorte e instinto é que pode-se chegar ao resultado final.No Slackware, Debian e outros tem uma infinidade de informações da Internet, excelentes artigos aqui no VOL e nenhuma dificuldade por parte da distribuição, mas especialmente do Conectiva 10 não há informações suficientes para quem vai fazer pela primeira vez. Elaborei este artigo sem esquecer nenhum passo e sem deixar de fora nenhuma informação que pudesse atrapalhar o usuário no instante da compilação.

Não há absolutamente nenhuma pretensão, intenção ou pensamento de que este artigo seja melhor do que A ou B, mas procurei pela internet inteira e não encontrei nada que estivesse tão resumido e mastigado quanto o que eu coloquei aqui exclusivamente para o Conectiva 10. Foi um verdadeiro apanhado de boas dicas que colhi e de experiência própria para corrigir os diversos bugs e erros encontrados.

Como amante do que o shell script pode fazer, criei um script que faz todo este trabalho de compilação, instalação e configuração e posso envia-lo junto com os fontes (informados no início) a quem se interessar.

Um abraço a todos!

Rolar para cima