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.
O ipp2p, como foi comentado na introdução do artigo, é um módulo que implementado ao iptables permite bloquear programas p2p de forma mais eficaz que o layer7, devido ele poder analisar o tráfego da rede e classificar os pacotes como P2P.
Ele também é mais simples de implementar do que o layer7, não precisa compilar o kernel e nem o iptables, somente é necessário ter os headers do kernel e do iptables. O grande problema é que os desenvolvedores pararam de atualizar o software para os novos kernels, no site a última versão do kernel que foi testado foi o "kernel-2.6.6", então a própria comunidade Linux passou a desenvolver patchs que devem ser aplicados para versões do kernel mais novas.
Let's go!
Primeiramente faremos o download do ipp2p, a última versão enquanto escrevo esse artigo é a ipp2p-0.8.2. Também é necessário baixar os patchs para a versão do kernel e iptables. Como estamos utilizando o kernel-2.6.28 e iptables-1.4.1, baixaremos os quatro patchs.
Devem estar se perguntando porque baixar os quatro patchs, mas depois de quebrar bastante a cabeça, somente depois de aplicar os quatro tive sucesso na instalação do ipp2p. Vamos descompactar o ipp2p e aplicar os patchs na seguinte ordem:
# tar xvf ipp2p-0.8.2.tar.gz
Agora entre na pasta do ipp2p e vamos aplicar os patchs:
Serão criados vários arquivos, temos que copiar um dos arquivos para dentro da biblioteca do iptables e o outro inserir no kernel.
# cp lipipt_ipp2p.so /usr/local/libexec/xtables/ (copiando biblioteca para lib do iptables) # insmod ipt_ipp2p.ko (carregando módulo no kernel. Colocar o comando no rc.local para ser inserido o módulo no kernel a todo boot)
Pronto! Agora é só criar as regras para fazer os bloqueios de P2P.
Exemplos de bloqueio de P2P:
iptables -t filter -A FORWARD -m ipp2p --ipp2p -j DROP
Esta regra bloqueia a maioria dos P2P, para maiores informações dos p2p que o ipp2p consegue bloquear, consulte a página oficial.
[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. :)
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.
[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
[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..
[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.
[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..
[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 ?
[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.
[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.
[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.
[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.
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?
[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
[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
[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.
################################################
#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!
[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.
[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