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.
[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
timidboy 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