Revisão atualizada de instalação do Iptables com Layer7

Revisão atualizada do processo de instalação de Layer7 + Iptables. O projeto Layer7 é um patch que permite ao Netfilter tratar a camada de aplicação. No meu caso, instalei especificamente para controlar MSN e transferência de arquivos pelo MSN.

[ Hits: 18.214 ]

Por: Dorival Junior em 21/07/2010


Introdução



O projeto Layer7 é um patch que permite ao Netfilter tratar a camada de aplicação. No meu caso, instalei especificamente para controlar MSN e transferência de arquivos pelo MSN. Porém ele trata muitos outros protocolos. Para conhecê-los, basta acessar o link:
Existem diversos tutoriais na internet que tratam sobre esta instalação de Layer7 com Iptables, porém devido a atualização de versões, entre outros fatores, sempre é bom fazer uma revisão atualizando os dados e melhorando em alguns pontos. Este artigo tem por objetivo esta revisão. Toda e qualquer sugestão de melhoria é bem vinda.

Procedimentos de instalação

Caso queira baixar todos os pacotes necessários antes de iniciar, seguem os links diretos para download:
1. Instalar pacotes necessários (caso falte alguma dependência, basta instalar ou se preferir faça a instalação dos pacotes abaixo usando o aptitude):

# apt-get install libncurses5-dev kernel-package gcc

2. Criar diretório para armazenar pacotes:

# mkdir /opt/layer7
# cd /opt/layer7


3. Baixar e descompactar o pacote do projeto Layer7 (utilizei a versão 2.21):

# wget -c http://downloads.sourceforge.net/project/l7-filter/l7-filter%20kernel%20version/2.21/netfilter-layer7-v2.21.tar.gz?use_mirror=ufpr&ts=1278937632
# tar zxvf netfilter-layer7-v2.21.tar.gz

4. Baixar e descompactar o fonte do Kernel (utilizei a versão 2.6.25.2):

# cd /root/
# wget -c
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.2.tar.bz2
# cd /usr/src
# tar jxvf /root/linux-2.6.25.2.tar.bz2


5. Aplicar o patch do Layer7 no novo kernel:

# cd /usr/src/linux-2.6.25.2
# patch -p1 < /opt/layer7/netfilter-layer7.v2.21/kernel-2.6.25-2.6.28-layer7-2.21.patch


6. Aproveitar configuração do kernel atual:

Caso queira usar as configurações do kernel atual no novo kernel, utilize os comandos abaixo. Provavelmente será necessário responder várias perguntas referentes a novos itens inclusos no novo kernel e que não existiam no atual. Para estas perguntas, caso não saiba as respostas, pressione então de fora a fora, pois depois você poderá rever as opções na próxima etapa).

# cp /boot/config-2.6[pressione o tab] /.config
# make oldconfig


7. Configurar o novo kernel:

# make menuconfig

Acesse os submenus como segue:

Networking
    Networking options
       Network packet filtering framework (netfilter)
          Core Netfilter Configuration

Marque os módulos referentes ao Layer 7 (na dúvida marque todos os módulos). Volte 1 nível e entre no submenu:

IP: Netfilter Configuration

Marque o módulo "IPv4 connection tracking support (required for NAT)".
Marque o módulo "Full NAT" e demais sub-itens desse módulo.

Obs.: Em caso de instalar sem utilizar a configuração de kernel anterior, convém dar uma passada em todo o submenu de Networking afim de verificar se opções referentes a bridge, nat e afins estejam selecionadas.

Terminado, salve e saia.

8. Compilar o novo kernel e criar um pacote .deb do mesmo:

# make-kpkg -initrd kernel_image

Obs.: Caso esteja fazendo a atualização de um servidor remoto, por questões de segurança convém deixar este processamento em segundo plano.

# make-kpkg -initrd kernel_image &

Saia para tomar um merecido café, pois esta etapa demora um tempo considerável.

Obs.: A instalação manual também pode ser realizada, mas como se trata de Debian, não precisamos ficar "reiventando a roda", vamos gerar o pacote e deixar o dpkg fazer o resto. Mas caso queira fazer manualmente também funciona.

9. Instalar o novo kernel:

# dpkg -i ../linux-image-2.6.25[pressione TAB].deb

10. Reiniciar a máquina com o novo kernel:

# shutdown -r now

Obs.: Caso aconteça algum erro, dê boot com o kernel antigo e então remova este novo kernel para fazer melhorias.

# apt-get remove --purge linux-image-2.6.25.2

(para ver o nome correto do pacote faça: dpkg -l | grep linux-image)

11. Baixar o Iptables (utilizei a versão 1.4.0, pois as posteriores não obtive sucesso):

# cd /opt/layer7
# wget -c
http://www.netfilter.org/projects/iptables/files/iptables-1.4.0.tar.bz2

12. Descompactar o fonte e aplicar o patch:

# cd /opt/layer7
# tar jxvf iptables-1.4.0.tar.bz2
# cd iptables-1.4.0
# patch -p1 < /opt/layer7/netfilter-layer7-v2.1/iptables-1.4-for-kernel-2.6.20forward-layer7-2.21.patch
# chmod 755 extension/.layer7-test


13. Remover o Iptables antigo e instalar a nova versão:

# aptitude purge iptables
# make KERNEL_DIR=/usr/src/linux-2.6.25 BINDIR=/sbin LIBDIR=/lib
# make install KERNEL_DIR=/usr/src/linux-2.6.25 BINDIR=/sbin LIBDIR=/lib


Verificar se tudo correu bem:

# iptables -n -L
# iptables -n -L -t nat
# ls -l /lib/iptables/*layer7*


14. Baixar e instalar os pacotes de protocolos do Layer7:

# cd /opt/layer7
# wget -c
http://downloads.sourceforge.net/project/l7-filter/Protocol%20definitions/2009-05-28/l7-protocols-2009-05-28.tar.gz?use_mirror=ufpr&ts=1278938145
# tar zxvf l7-protocols-2009-05-28.tar.gz
# cd l7-protocols-2009-05-28
# make install
# ls /etc/l7-protocols/protocols


Dicas importantes a respeito do Layer7

Dica 1: Caso você já tenha o Layer7 funcionando e necessite apenas atualizar os protocolos suportados, basta fazer apenas o item 14, observando é claro o nome do novo arquivo de protocolos. O que acontece é apenas copiar os novos pacotes de protocolos em cima dos antigos. Então convém fazer um backup dos arquivos dos protocolos antigos.

Dica 2: Nem sempre todos os pacotes mais recentes envolvidos funcionam plenamente em conjunto, então observe as versões de kernel, iptables e layer7 compatíveis antes fazer as compilações.

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Usuário especial para desligar servidores Linux

Autoração de DVD - Usando somente Software Livre

Certificado A3 (Cartão) no eCAC (Receita Federal) no Ubuntu 19.10 e Similares

Leitura recomendada

Monitorando e bloqueando P2P com IPTABLES e IPP2P

Slackware 11 + kernel-2.6.18 + Layer7 + iptables

Firewall invisível com Proxy ARP

Uso eficiente do IPCOP firewall

Conheça o firewall OpenGFW, uma implementação do (Great Firewall of China).

  
Comentários
[1] Comentário enviado por uberalles em 21/07/2010 - 16:07h

Tá aí um recurso bacaníssimo pra fazer firewall de aplicação, ou de camada 7.
Existem alguns appliances caríssimos no mercado, mas com essa extensão do iptables, tanto administradores de sistema, quanto desenvolvedores de soluções poderão ter mais uma opção, e de Open Source, o que melhor.

[2] Comentário enviado por jucaetico em 22/07/2010 - 11:14h

Só não marcaria a opção "Layer7 debugging output" porque gera muitos logs. Acredito que não seja necessário.

Eu utilizo Layer7+Iptables há mais de um ano aqui na empresa, essa solução funciona perfeitamente. Recomendo. Abraços

[3] Comentário enviado por consultor.inf em 26/10/2010 - 17:26h

Seguindo seu tutorial varias vezes, aparentimente deu tudo certo até
na parte:

Verificar se tudo correu bem:

# iptables -n -L
# iptables -n -L -t nat
# ls -l /lib/iptables/*layer7*

Aqui percebo que não tem os arquivos *layer7* na pasta /lib/iptables/ !!!!

O que pode estar acontecendo ?

Desde já Obrigado!!

[4] Comentário enviado por dorivaljunior em 27/10/2010 - 07:57h

Olá, faça os seguintes testes (como root):
# iptables (para verificar se a nova versão é a 1.4.0)
# ls -l /lib/iptables/*layer7* ( se aqui não aparece nenhum arquivo, é porque houve algum problema na aplicação do patch) Se você diz que antes não deu nenhum problema, então isso indica que por algum motivo o arquivo não foi copiado para este diretório durante o processo de aplicação do patch.
Você pode copiar o arquivo manualmente para o local, mas o melhor seria refazer a etapa 5 (aplicação do patch). Mas caso queira antes tentar manualmente (o máximo que ocorrerá é não dar certo, então é só apagar o arquivo depois) é da seguinte forma:
copie um arquivo chamado libipt_layer7.so para dentro do /lib/iptables. Feito isto, execute uma regra qualquer usando o layer7 para testar o funcionamento.

dica2: procure este arquivo em todo o seu computador, caso nao encontre procure-o na internet.
# find / -name "libipt_layer7.so"

[5] Comentário enviado por consultor.inf em 27/10/2010 - 11:12h

Muito Obrigado, seu artigo é muito bom.
Foi só copiar o arquivo libipt_layer7.so que funcionou, provavelmente na hora de aplicar o petch deu algum problema.
Testei uma regra para bloqueio do Msn e funcionou perfeitamente.
Agora estou tentando bloquear videos da Internet como Youtube, e não estou conseguindo. Sera que voce teria alguma regra pra mim passar ?
Tentei bloquear usando esta regra mas não funcionou...

iptables -t mangle -A POSTROUTING -m layer7 --l7proto httpvideo -j DROP



Mais uma vez obrigado.

[6] Comentário enviado por matheuskamphorst em 05/11/2010 - 09:01h

Amigo estou com um problema no meu layer7, ele so funciona com regras drop e nao accept...
se deixo minhas politicas default drop ele nao funciona para aceitar porem se deixo default accept ele consegue dropar... se puder me ajudar agradeço;.

[7] 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

[8] Comentário enviado por dalveson em 01/08/2011 - 14:35h

boa tarde
no passo numero 13 obtive o seguite erro:
# aptitude purge iptables
deu certo
# make KERNEL_DIR=/usr/src/linux-2.6.25 BINDIR=/sbin LIBDIR=/lib
no final da o seguinte erro: make: ** [extensions/libxt_sctp-sh.o] erro 1
# make install KERNEL_DIR=/usr/src/linux-2.6.25 BINDIR=/sbin LIBDIR=/lib
no final o seguinte erro: make: ** [extensions/libxt_sctp-sh.o] erro 1


ae qdo tento verificar se tudo ta ok
# iptables -n -L
# iptables -n -L -t nat
# ls -l /lib/iptables/*layer7*

ele me retorna a mensagem que o comando iptables not found.
alguem tem ideia do que pode ser




[9] Comentário enviado por SPH em 02/10/2011 - 14:57h

aqui deu 2 erros:
Lá vai: 1- erro ao compilar make-kpkg -initrd kernel_image
Unknown option: i
Unknown option: n
Unknown option: i
Unknown option: t
Unknown option: r
Unknown option: d

2- instalação do iptables:

make KERNEL_DIR=/usr/src/linux-2.6.25.2 BINDIR=/sbin LIBDIR=/lib
Extensions found:
cc -O2 -Wall -Wunused -I"/lib/modules/2.6.32-5-686/build"/include -I/usr/src/linux-2.6.25.2/include -Iinclude/ -DIPTABLES_VERSION=\"1.4.0\" -c -o libiptc/libip6tc.o libiptc/libip6tc.c
In file included from libiptc/libip6tc.c:113:
libiptc/libiptc.c: In function â__iptcc_p_del_policyâ:
libiptc/libiptc.c:372: warning: dereferencing type-punned pointer will break strict-aliasing rules
libiptc/libiptc.c: In function âip6tc_get_targetâ:
libiptc/libiptc.c:1160: warning: dereferencing type-punned pointer will break strict-aliasing rules
libiptc/libip6tc.c: In function âipv6_prefix_lengthâ:
libiptc/libip6tc.c:123: error: âconst struct in6_addrâ has no member named âin6_uâ
libiptc/libip6tc.c:127: error: âconst struct in6_addrâ has no member named âin6_uâ
libiptc/libip6tc.c: In function âdump_entryâ:
libiptc/libip6tc.c:189: warning: dereferencing type-punned pointer will break strict-aliasing rules
make: ** [libiptc/libip6tc.o] Erro 1

alguma sugestão?

uma duvida como faço pra alterar o boot automaticamente para o novo kernel?? estou fazendo remotamente por ssh e não posso ir ate o computador pra bootar no kernel compilado
desde já agradeço.


[10] Comentário enviado por SPH em 03/10/2011 - 11:54h

bom comecei a achar os erros, o primeiro ao compilar o kernel se deve ao ctrl+c ctrl+v não é -initrd e sim --initrd. o outro ainda não consegui sanar, mas acredito que eu precise logar no novo kernel e eu não consegui ainda..

[11] Comentário enviado por dorivaljunior em 04/10/2011 - 07:58h

Olá amigo, exatamente, são "--" e não "-" antes do init.

Este segundo erro, é falta de algum pacote em especial na sua distribuição. Já tive vários erros diferentes neste sentido. A melhor forma é como você já está fazendo: observe o erro, veja os arquivos a que ele se refere, e procure por pacotes que inclua algo com nome parecido. exemplo: se estiver usando debian e similares, faça por exemplo: apt-cache search libiptc (estou chutando aqui, faça a busca por todos os termos envolvidos).

Espero que ajude! até mais.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts