Integrando Layer7 + IPP2P ao Iptables

O artigo ensina como integrar o Layer7 e o IPP2P junto ao Iptables. Todos os procedimentos foram feitos na distribuição Linux Debian Lenny, mas o artigo está bem claro, o que permite sua implementação em outras distribuições.

[ Hits: 46.083 ]

Por: Magno Lima em 24/07/2009


Introdução



O artigo não se destina a ensinar como configurar o iptables e sim implementar dois módulos ao iptables que possibilitam fazer alguns dos bloqueios mais complicados via ip/porta.

O iptables é o firewall nativo das distribuições Linux, com ele podemos criar nossas regras baseadas em ip/porta/mac/domínio, entre outras opções, só que muitos softwares como p2p são quase impossíveis de se fazer o bloqueio total devido a usarem várias portas para conexão e ficarem mudando constantemente. A solução seria fechar todo o FORWARD e redirecionar o acesso à porta 80 para um servidor proxy e então filtrar o acesso a web, esta é a forma mais eficaz de ter todo um controle de tudo que está trafegando na rede, mas existem outras soluções não tanto eficazes, que atendem a algumas situações como bloqueio de MSN, p2p, Skype entre outros serviços.

Será abordado neste artigo a integração e configuração do Layer7 e IPP2P.

Layer7

O Layer7 é um módulo que implementado ao iptables permite que o mesmo consiga subir até a camada de aplicação e fazer seus filtros baseados no payload do pacote (carga útil do pacote). Com isso o iptables passa a trabalhar semelhante a um Snort, abrindo o pacote e identificando o payload. Sendo assim não é necessário criar as regras do iptables indicando ip/porta. Um exemplo para bloquear o MSN com o Layer7 seria:

iptables -t filter -A FORWARD -m layer7 --l7proto msnmessenger -j DROP

E bye bye MSN!

IPP2P

O ipp2p é um módulo que acrescentado ao iptables permite fazer bloqueios de programas P2P. Ele utiliza um método de verificação diferente do Layer7, que procura pelo payload do pacote, já o ipp2p analisa o tráfego do pacote e o classifica como p2p, fazendo assim um bloqueio mais geral de P2P. Um exemplo de bloqueio do Kazaa com ipp2p seria:

iptables -t filter -A FORWARD -m ipp2p --kazaa -j DROP

Agora que já foram apresentadas as funcionalidades de cada software, vamos à integração dos mesmos.

    Próxima página

Páginas do artigo
   1. Introdução
   2. Compilação e instalação do Layer7
   3. Instalação IPP2P
   4. Conclusão
Outros artigos deste autor

Configuração de um servidor VPN com OpenVPN e chave estática

Leitura recomendada

Implementando prioridade nos serviços com TOS no Iptables

Controlando 2 links de internet (roteados) em um gateway Linux com SQUID

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

Fail2ban - Bloqueio de Peer-to-Peer (Ares, uTorrent) e Proxies (UltraSurf e Tor)

Addon URL Filter - Filtrando URLs no seu firewall

  
Comentários
[1] Comentário enviado por roberto_espreto em 24/07/2009 - 02:12h

Boaaa!

Cara, já são 2 da madruga e estou mais pescando que nunca, acredito que nessa regra para bloqueio do msn:
iptables -t filter -A FORWARD -m layer7 --l7proto msnmessenger -j DROP

Nem precisa do "-t filter". Poderia ser:
iptables -A FORWARD -m layer7 --l7-proto msnmessenger -j DROP

Lendo as referências que você deixou, segue uma dica. Pode-se deixar o acesso a um endereço IP ou mais. Vai saber o patrão que se tem. :)

iptables -A FORWARD -s <ENDEREÇO IP> -m layer7 --l7-proto msnmessenger -j ACCEPT
iptables -A FORWARD -s <ENDEREÇO IP> -m layer7 --l7-proto msn-filetransfer -j ACCEPT

1º regra liberando o acesso do msn no IP especificado.
2º regra para habilitar o protocolo msnslp e msnftp usado para transferência de arquivos pelo MSN.

Abraços.

[2] Comentário enviado por removido em 24/07/2009 - 10:49h

roberto_espreto,

Não é que não precisa de ter o '-t filter' na regra para funcionar. A tabela padrão do iptables é a filter, ou seja, se você não especificar a tabela a qual vai destinar sua regra, ela por padrão vai jogar na tabela filter, por isso nesse caso ai seria opcional usar -t filter, pois a cadeia FORWARD faz parte da tabela filter.
:)

Sobre o artigo, show de bola. Vou ate testar pois anos atras eu também lancei um artigo sobre ipp2p aqui e está desatualizado, e ambas as ferramentas são boas para quem precisa desse tipo de filtro. Artigo show de bola.

[3] Comentário enviado por roberto_espreto em 24/07/2009 - 11:21h

@timidboy.

Certo, acredito que usei as palavras erradas, como sou "meio" que minimalista, você acabou dizendo o que eu pretendia expor: "...Por isso, nesse caso ai seria opcional...",
Mais valeu. Bom artigo mesmo, esqueci de elogiar :P


R0b3®70

[4] Comentário enviado por magnolinux em 24/07/2009 - 12:21h

e ae roberto espreto, como o nosso amigo timiboy disse, por padrao no iptables, quando omitimos a tabela é referenciado a tabela filter, em minhas regras sempre gosto de especificar as tabelas, por motivos de costume mesmo..

um abraço.. e duvidas estou a disposição.


[5] Comentário enviado por predator em 24/07/2009 - 21:48h

Pessoal só uma dica..
essa opção aqui "(x) "Layer7" Debugging Output" se marcada vai ficar jogando tudo o que o layer7 pegar,vai mostrar no seu terminal (na tela é muito chato isso), então é bom deixar desmarcada mesmo.

abs

eduardo

[6] Comentário enviado por marciomarkes em 25/07/2009 - 01:51h

Parabéns Magno, muito bom.. estava quebrando a cabeça para compilar o ipp2p.. dessa vez foi..
Só estou com uma duvida, você conseguiu bloquear a (REDE Kad) do emule pois ela sempre conecta.. teria alguma ideia..

Abs.

[7] Comentário enviado por andrefreire em 25/07/2009 - 10:05h

Bim dia ! Excelente artigo ! Já tenho essa Iptanles + Layer 7 já funcionando mas ainda não tinha conseguido com o IPP2P só que utilizo o próprio Kernel de Lenny o 2.6.26, e o Iptables 1.4.2 que é o padrão do Debian Lenny. Seria possível implementar o IPP2P dessa forma ?

[8] Comentário enviado por paulinhorm em 25/07/2009 - 11:16h

Muito bom o seu artigo colega...ja gravei nos meus favoritos...parabéns e continue contribuindo
com artigos de qualidade como este.

Abraços

Paulo

[9] Comentário enviado por magnolinux em 25/07/2009 - 13:31h

obrigado marciomarkes pelo elogio, Em relação a rede Kad, na minha fase de testes nao tive nenhum problema, fez o bloqueio normal. Mais como eu disse no inicio do artigo, essa não é a forma ideal de bloquear todo trafego p2p e sim um paleativo que até o presente momento tem sido de grande valia. Vou citar um exemplo, o layer7 por exemplo nao consegue ler o payload do pacote, se o mesmo estiver encriptado, entao muitos p2p já começaram a criptografar o trafego para burlar o layer7, mesmo que a rede p2p tenha um desempenho muito inferior, mais pelo menos é uma forma que eles arrumaram para burla o layer7.

Mais duvidas posta aí..

Abraço

[10] Comentário enviado por magnolinux em 25/07/2009 - 13:35h

boa tarde andrefreire, é possivel sim, so que voçe tera que buscar um pacth do ipp2p para o iptables-1.4.2. Os patch que eu postei no artigo foram tirados do site do arch. Tive acessando o site e vi um patch para o iptables 1.4.3. ta aí o link abaixo.

http://aur.archlinux.org/packages/ipp2p/ipp2p/

Abraço.

[11] Comentário enviado por sequisso em 04/08/2009 - 08:32h

Olá, ah algum tempo atrás achei que essa fosse uma boa solução para tentativa de bloqueio do tráfego p2p, mas após algumas lidas vi que eles estavam conseguindo burlar o layer 7 p2p através do "protocol obfuscation", ai desisti da ideia.

[12] Comentário enviado por andrefreire em 04/08/2009 - 17:01h

Testei com kernel 2.6.26 padrão do Debian e Iptables 1.4.1 e não deu certo ! Todos os P2P que testei continuaram conectando na boa ! Só bloqueou mesmo o MSN !

[13] Comentário enviado por magnolinux em 04/08/2009 - 18:01h

boa noite andrefreire, a alguns meses atras quando fiz minha seção de testes nao tive nenhum problema o unico software p2p que burlava o layer7 era o limewire. Sugiro que de uma olhada nas regras do seu firewall. Irei fazer alguns testes e e postar os resultados abraço.

[14] Comentário enviado por doomk em 10/09/2009 - 13:28h

muito bom o artigo. Funcionou de prima! vc é o cara!!! :)))

[15] Comentário enviado por magnolinux em 10/09/2009 - 17:03h

Obrigado doomk.!

[16] Comentário enviado por arisimoes em 06/10/2009 - 10:15h

quebrei um pouco a cabeça com o ipp2p mas conssegui compilar vlw otimo post

[17] Comentário enviado por arisimoes em 09/10/2009 - 13:41h

não cnssigo colocar o ipp pra rodar no rc.local diz q n pode ser encontrado ou coisa do tipo
"insmod ipt_ipp2p.ko" esse comando só funciona quando eu to dentro da pasta do ipp2p la em rc.local alguma dica? pra fazer-lo funcionar automaticamente pois quando eu rodo ele manual funciona direito.

olha o q aparece:

root@server:/# insmod ipt_ipp2p.ko
insmod: can't read 'ipt_ipp2p.ko': No such file or directory

conssegui resolver com essa dica do arquivo README q vem com o ipp2p:

-insmod ipt_ipp2p.o / ipt_ipp2p.ko or copy to your kernel modules dir and do a "depmod -a"

copiei o ipt_ipp2p.ko para /lib/modules/<pasta_do_kernel>/ e depois executei o comando depmod -a dai ele passou a executar automaticamente no boot.

espero ter ajudado!!!!!

[18] Comentário enviado por magnolinux em 09/10/2009 - 17:54h

mais ao colocar o comando dentro do rc.local, vc deve indicar o caminho completo onde esta
o modulo do ipp2p

exemplo:

#vim rc.local
insmod /ipp2p/ipt_ipp2p.ko

ok.

[19] Comentário enviado por jardineti em 11/10/2009 - 11:17h

Magno, quando dou o comando make apos mudar as linhas do Makefile
IPTABLES_SRC = /usr/src/iptables

libipt_ipp2p.so: libipt_ipp2p.c ipt_ipp2p.h
$(CC) $(CFLAGS) $(IPTABLES_OPTION) $(IPTABLES_INCLUDE) -fPIC -c libipt_ipp2p.c
$ (CC) -shared -o libipt_ipp2p.so libipt_ipp2p.o

Aparece a mensagem Makefile:44 faltando separador

Já verifiquei a linha 44 é é exatamente essa $(CC) $(CFLAGS) $(IPTABLES_OPTION) $(IPTABLES_INCLUDE) -fPIC -c libipt_ipp2p.c
que está igual a sua.
O que pode ser?

[20] Comentário enviado por magnolinux em 13/10/2009 - 09:34h

jardineti , verifica espaços na linha...

[21] Comentário enviado por jardineti em 27/10/2009 - 09:29h

Ok agora gerou os arquivos, mas na hora de instalar o módulo olha o que aparece: insmod: error inserting 'ipt_ipp2p.ko': -1 Unknown symbol in module.

O que pode ser?

[22] Comentário enviado por jardineti em 27/10/2009 - 10:15h

Cara faltava ativar o modulo x_tables. modprobe x_tables. Agora funcionou.
Parabéns pelo tuto.

Valeu.

[23] Comentário enviado por magnolinux em 24/11/2009 - 12:47h

Obrigado...

quando testei no debian lenny e do ubuntu 9.04, o modulo já estava carregado automatico..

Mais de toda maneira,,

obrigado

[24] Comentário enviado por fbsalvi em 07/12/2009 - 20:45h

Fiz todos os passos necessarios mas esta dando o erro abaixo... na hora de compilar o kernel...

Makefile:510: /usr/src/linux-2.6.24/arch/xen/Makefile: No such file or directory
make[1]: *** No rule to make target `/usr/src/linux-2.6.24/arch/xen/Makefile'. Stop.
make: *** [conf.vars] Error 2

Se alguem puder me ajudar, eu agadeço

Fabiano.

[25] Comentário enviado por magnolinux em 08/12/2009 - 07:36h

Boma dia fbsalvi..

Pela mensagem de erro, ele não ta encontrando esse arquivo Makefile no diretorio....

tente descompactar o kernel novamente, aplique os pacth e faça o teste novamente..

De uma olhada na versão do kernel com a versão dos pacth aplicados...

configura todos os passos...

Flwww

[26] Comentário enviado por monteirog12 em 25/02/2010 - 11:47h

Estou com o mesmo problema do fbsalvi!

Já baixei novamente o kernel, tentei com outra versão e nada... aparece a mesma mensagem!!


Fiz todos os passos necessarios mas esta dando o erro abaixo... na hora de compilar o kernel...

Makefile:510: /usr/src/linux-2.6.24/arch/xen/Makefile: No such file or directory
make[1]: *** No rule to make target `/usr/src/linux-2.6.24/arch/xen/Makefile'. Stop.
make: *** [conf.vars] Error 2

Se alguem puder me ajudar, eu agadeço

Fabiano.



[27] Comentário enviado por diego_luisCF em 28/03/2010 - 13:29h

monteirog12 dá uma olhada nesse link:
http://ubuntuforums.org/showthread.php?t=954838

resumindo, vc deve desmarcar a opção de suporte a paravirtualização no menuconfig


agora a minha dúvida:

estou usando o kernel 2.6.28, iptables 1.4.1 e o layer7 já tá rodando beleza.

o problema é que ao compilar o ipp2p não está gerando o arquivo ipt_ipp2p.o / ipt_ipp2p.ko. Qual seria o problema?

o make gera somente esses arquivos:

COPYING ipt_ipp2p.h libipt_ipp2p.o Makefile
ipt_ipp2p.c libipt_ipp2p.c libipt_ipp2p.so README

a saída da compilação é esta aqui:
make[1]: Leaving directory `/usr/src/linux-2.6.28'
gcc -O3 -Wall -DIPTABLES_VERSION=\"1.4.1.1\" -I/usr/src/iptables/include -fPIC -c libipt_ipp2p.c
gcc -shared -o libipt_ipp2p.so libipt_ipp2p.o


PS. já estou muito satisfeito com o layer7, o problema é que fiquei intrigado com isto.

[28] Comentário enviado por rndrama em 07/05/2010 - 17:42h

Parabéns Magno, ótimo artigo. Rodei com o Debian Lenny e deu tudo certo, só que o emule continua regaçando e não conseguir colocar o comando insmod ipt_ipp2p.ko para iniciar no boot. Não sei se meu firewall, o qual está muito simples, está com alguma brecha para o emule funcionar, vou postar ele aqui para ver se vc ou outro brother pode verificar melhor, segue.

#!/bin/sh
#
#chkconfig: 345 99 80
#Description: Firewall
#

modprobe ipt_layer7
modprobe xt_layer7

iptables="/usr/local/sbin/iptables"

IPLIBERADOSMSN="/etc/firewall/ip_liberados_msn"
BLOQMSNREDE="/etc/firewall/redes_bloqueadas_msn"
BLOQIMO=imo.im
PROTOCOLOS="/etc/firewall/protocolos"
PROTOCOLOS_P2P="/etc/firewall/protocolos_p2p"

iptables -F
iptables -F INPUT
iptables -F OUTPUT
iptables -F POSTROUTING -t nat
iptables -F PREROUTING -t nat
echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -I FORWARD -m ipp2p --ipp2p -j DROP
iptables -I OUTPUT -m ipp2p --ipp2p -j DROP
iptables -I INPUT -m ipp2p --ipp2p -j DROP

iptables -A FORWARD -p udp -m ipp2p --kazaa --bit -j DROP
iptables -A FORWARD -p udp -m ipp2p --ipp2p --bit -j DROP
iptables -A FORWARD -p tcp -m ipp2p --edk --soul -j DROP
iptables -A FORWARD -p tcp -m ipp2p --ipp2p --soul -j DROP

#iptables -A FORWARD -p udp -m ipp2p --kazaa --bit -j DROP

################################################
#IPP2P
################################################
#for BARRAP2P in `cat $PROTOCOLOS_P2P`; do
# iptables -t filter -A FORWARD -m ipp2p $BARRAP2P -j DROP
#done

################################################
#Ultrasurf
################################################
iptables -t filter -N fdenyall
iptables -t filter -I FORWARD 1 -j fdenyall

iptables -P FORWARD ACCEPT

iptables -A POSTROUTING -t nat -s 172.18.15.0/24 -o eth0 -j MASQUERADE
iptables -A POSTROUTING -t nat -s 172.18.16.0/24 -o eth0 -j MASQUERADE
iptables -A POSTROUTING -t nat -s 172.18.17.0/24 -o eth0 -j MASQUERADE
iptables -A POSTROUTING -t nat -s 172.18.18.0/24 -o eth0 -j MASQUERADE

iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

iptables -A PREROUTING -t nat -s 172.18.15.0/24 -p tcp --dport 80 -j DNAT --to-destination 172.18.15.1:3128
iptables -A PREROUTING -t nat -s 172.18.16.0/24 -p tcp --dport 80 -j DNAT --to-destination 172.18.15.1:3128
iptables -A PREROUTING -t nat -s 172.18.17.0/24 -p tcp --dport 80 -j DNAT --to-destination 172.18.15.1:3128
iptables -A PREROUTING -t nat -s 172.18.18.0/24 -p tcp --dport 80 -j DNAT --to-destination 172.18.15.1:3128

################################################
#Layer7
################################################
for BARRAPROTO in `cat $PROTOCOLOS`; do
iptables -I FORWARD -m layer7 --l7proto $BARRAPROTO -d any/0 -j DROP
iptables -I FORWARD -m layer7 --l7proto $BARRAPROTO -d any/0 -j DROP
iptables -I INPUT -s 0/0 -m layer7 --l7proto $BARRAPROTO -j DROP
iptables -t mangle -A POSTROUTING -m layer7 --l7proto $BARRAPROTO -j DROP
done

################################################
#MSN
################################################
for LIBERARIP in `cat $IPLIBERADOSMSN`; do
iptables -I FORWARD -s $LIBERARIP -p tcp --dport 1863 -j ACCEPT
iptables -I FORWARD -s $LIBERARIP -d loginnet.passport.com -j ACCEPT
done

for BLOQUEARREDE in `cat $BLOQMSNREDE`; do
iptables -A FORWARD -s $BLOQUEARREDE -p tcp --dport 1863 -j REJECT
iptables -A FORWARD -s $BLOQUEARREDE -d loginnet.passport.com -j REJECT
done

################################################
#IMO
################################################
iptables -A FORWARD -d $BLOQIMO -p all -j DROP
iptables -A INPUT -d $BLOQIMO -p all -j DROP
iptables -A OUTPUT -d $BLOQIMO -p all -j DROP

[29] Comentário enviado por andre_ramos em 11/05/2010 - 11:30h

kara ao dar o comando make ele começa compilar mas da o seguinte erro:

oque pode ser?


# make
gcc -O3 -Wall -DIPTABLES_VERSION=\"1.4.3\" -I/usr/src/iptables/include -fPIC -c libipt_ipp2p.c
libipt_ipp2p.c: In function ‘parse’:
libipt_ipp2p.c:91: warning: implicit declaration of function ‘exit_error’
libipt_ipp2p.c: At top level:
libipt_ipp2p.c:379: error: variable ‘ipp2p’ has initializer but incomplete type
libipt_ipp2p.c:381: error: unknown field ‘next’ specified in initializer
libipt_ipp2p.c:381: warning: excess elements in struct initializer
libipt_ipp2p.c:381: warning: (near initialization for ‘ipp2p’)
libipt_ipp2p.c:382: error: unknown field ‘name’ specified in initializer
libipt_ipp2p.c:382: warning: excess elements in struct initializer
libipt_ipp2p.c:382: warning: (near initialization for ‘ipp2p’)
libipt_ipp2p.c:383: error: unknown field ‘version’ specified in initializer
libipt_ipp2p.c:383: warning: excess elements in struct initializer
libipt_ipp2p.c:383: warning: (near initialization for ‘ipp2p’)
libipt_ipp2p.c:384: error: unknown field ‘size’ specified in initializer
libipt_ipp2p.c:384: warning: excess elements in struct initializer
libipt_ipp2p.c:384: warning: (near initialization for ‘ipp2p’)
libipt_ipp2p.c:385: error: unknown field ‘userspacesize’ specified in initializer
libipt_ipp2p.c:385: warning: excess elements in struct initializer
libipt_ipp2p.c:385: warning: (near initialization for ‘ipp2p’)
libipt_ipp2p.c:386: error: unknown field ‘help’ specified in initializer
libipt_ipp2p.c:386: warning: excess elements in struct initializer
libipt_ipp2p.c:386: warning: (near initialization for ‘ipp2p’)
libipt_ipp2p.c:387: error: unknown field ‘init’ specified in initializer
libipt_ipp2p.c:387: warning: excess elements in struct initializer
libipt_ipp2p.c:387: warning: (near initialization for ‘ipp2p’)
libipt_ipp2p.c:388: error: unknown field ‘parse’ specified in initializer
libipt_ipp2p.c:388: warning: excess elements in struct initializer
libipt_ipp2p.c:388: warning: (near initialization for ‘ipp2p’)
libipt_ipp2p.c:389: error: unknown field ‘final_check’ specified in initializer
libipt_ipp2p.c:389: warning: excess elements in struct initializer
libipt_ipp2p.c:389: warning: (near initialization for ‘ipp2p’)
libipt_ipp2p.c:390: error: unknown field ‘print’ specified in initializer
libipt_ipp2p.c:390: warning: excess elements in struct initializer
libipt_ipp2p.c:390: warning: (near initialization for ‘ipp2p’)
libipt_ipp2p.c:391: error: unknown field ‘save’ specified in initializer
libipt_ipp2p.c:391: warning: excess elements in struct initializer
libipt_ipp2p.c:391: warning: (near initialization for ‘ipp2p’)
libipt_ipp2p.c:392: error: unknown field ‘extra_opts’ specified in initializer
libipt_ipp2p.c:393: warning: excess elements in struct initializer
libipt_ipp2p.c:393: warning: (near initialization for ‘ipp2p’)
libipt_ipp2p.c: In function ‘_INIT’:
libipt_ipp2p.c:399: warning: implicit declaration of function ‘register_match’
make: ** [libipt_ipp2p.so] Erro 1

[30] Comentário enviado por toyso em 24/05/2010 - 20:39h

Salve!

Amigo, infelizmente o novo Ares parece estar "furando" nosso ipp2p... tô quebrando a cabeça aqui com esse programa safado.
Mestre, busquei informações na internet e parece que o novo Ares é como se fosse outro programa. Mudaram muita coisa.
Se possível, dê uma luz para nós!

Abração e baita artigo!

[31] Comentário enviado por magnolinux em 06/07/2010 - 11:51h

amigos, estive ausente durante um tempo devido a muito trabalho. Se alguem ainda estive com problemas, poste que estarei respondendo sempre que possível..

e obrigado toiyso, estarei escrevendo outros em breve.

abraço.


[32] Comentário enviado por elciojr em 06/07/2010 - 15:12h

Magno, estou com os eguinte problema na compilação do ipp2p. O que pode ser?

ipt_ipp2p.c: At top level:
ipt_ipp2p.c:877: error: unknown field `family' specified in initializer
ipt_ipp2p.c:877: warning: initialization makes pointer from integer without a cast
ipt_ipp2p.c:878: error: unknown field `matchsize' specified in initializer
ipt_ipp2p.c:878: warning: implicit declaration of function `XT_ALIGN'
ipt_ipp2p.c:878: error: initializer element is not constant
ipt_ipp2p.c:878: error: (near initialization for `ipp2p_match.destroy')
ipt_ipp2p.c:879: warning: initialization from incompatible pointer type
make: ** [ipt_ipp2p.o] Erro 1

Obrigado!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts