NetFilter Hook em Kernel 2.6

Esse artigo mostra como montar um módulo personalizado para Kernel 2.6 que trabalhe com o NetFilter. Dentre suas possíveis utilidades, podemos criar: firewall leve, compilado; firewall com alarme; "gatilho" para determinados eventos; contadores de pacotes; etc.

[ Hits: 40.551 ]

Por: Valber Marcel Bueno em 07/11/2005


Introdução



Netfilter é um subsistema do Kernel do Linux superiores ao 2.4. O Netfilter é o responsável pelo filtro de pacotes, NAT, firewall, redirecionamentos, entre outros. O Netfilter é muito extensível e sua documentação é muito bem feita (procure também por "Netfilter Hacking HOWTO"). O Netfilter deixa a possibilidade de uso de HOOKs no código do Kernel, fazendo com que seu uso seja muito maleável e muito adotado pela comunidade. Estes HOOKs deixam várias possibilidades, podendo servir como gatilhos para certos eventos.

O Netfilter é muito conhecido pelo seu comando de front-end, o iptables, mas não limita-se à ele. A criação de EXTENSIONs para o iptables, a criação de HOOKs no Netfilter/Kernel se tornam muito interessantes, tendo como limitação apenas a imaginação de cada um.

A idéia de desenvolver um HOOK partiu do princípio da complexidade em se contabilizar consumo por IPs e por PORTAS, utilizando os próprios recursos do sistema. Muitos vão me dizer: mas isto é possível com fulano, ciclano, etc. Normalmente os programas que executam esta ação utilizam meios mais pesados para obtê-la, utilizando de bibliotecas como a libpcap (sniffer), entre outras formas, que acabam consumindo uma certa memória.

Desta maneira surgiu a idéia de desenvolver estes módulos em cima do próprio IPTABLES e minha experiência anterior (IPCHAINS) forçava a me atentar ao fato de que certos contadores eu poderia encontrar no /proc. Ledo engano: o iptables não armazena muita coisa interessante por lá.

Mas a melhor idéia veio realmente quando eu me deparei com o Fedora Core 4, que vinha com o SELinux e que habilitava um Netfilter HOOK sobre o sistema. Algumas pesquisas e pronto: cá estava eu com uma fonte interessante de informações, mas que não me serviam, pois elas existem muito mais para Kernel 2.4. Como fazer então com Kernel 2.6?

    Próxima página

Páginas do artigo
   1. Introdução
   2. Constantes
   3. Estruturas
   4. Exemplo aprimorado
   5. Aplicações
   6. Problemas e correções
   7. Referências e maiores estudos
   8. Maiores dados
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Compilar kernel em distros baseadas em Debian

Kernel atualizado no Debian - Parte II

Ksplice - atualizando o kernel sem necessidade de reboot

Que tal criar uma mini-distro em 1 disquete?

Compilar e habilitar os módulos ip_table e iptable_nat no kernel 2.6.26 no Debian Linux

  
Comentários
[1] Comentário enviado por removido em 07/11/2005 - 23:44h

Parabens pelo seu artigo..

[2] Comentário enviado por ygorth em 08/11/2005 - 10:46h

Cara,

excelente tema. Parabens!

[3] Comentário enviado por zero_bala em 08/11/2005 - 11:18h

Que esta vai para o favoritos, nem tenha dúvida! Excelente pesquisa e muito proveitosa para o meio acadêmico. Marcel, você conhece algum livro sobre o assunto?

[4] Comentário enviado por Ângelios em 30/09/2010 - 17:40h

Caros,

Copiei os códigos dos dois exemplos e tentei compila, mais aparece a seguinte mensagem:

nfhook.c:15:26: error: linux/config.h: Arquivo ou diretório não encontrado
nfhook.c:16:26: error: linux/module.h: Arquivo ou diretório não encontrado
nfhook.c:17:24: error: linux/init.h: Arquivo ou diretório não encontrado
nfhook.c:18:27: error: linux/proc_fs.h: Arquivo ou diretório não encontrado
nfhook.c:20:25: error: asm/uaccess.h: Arquivo ou diretório não encontrado
In file included from nfhook.c:21:
/usr/include/linux/netfilter.h:55: error: field ‘in’ has incomplete type
/usr/include/linux/netfilter.h:56: error: field ‘in6’ has incomplete type
In file included from nfhook.c:22:
/usr/include/linux/netfilter_ipv4.h:53: error: ‘INT_MIN’ undeclared here (not in a function)
/usr/include/linux/netfilter_ipv4.h:64: error: ‘INT_MAX’ undeclared here (not in a function)
nfhook.c:32: warning: ‘struct net_device’ declared inside parameter list
nfhook.c:32: warning: its scope is only this definition or declaration, which is probably not what you want
nfhook.c:32: warning: ‘struct sk_buff’ declared inside parameter list
nfhook.c: In function ‘hook_func’:
nfhook.c:36: error: dereferencing pointer to incomplete type
nfhook.c:36: error: dereferencing pointer to incomplete type
nfhook.c: At top level:
nfhook.c:47: error: expected declaration specifiers or ‘...’ before ‘off_t’
nfhook.c: In function ‘show_stats’:
nfhook.c:57: warning: incompatible implicit declaration of built-in function ‘sprintf’
nfhook.c:58: error: ‘offset’ undeclared (first use in this function)
nfhook.c:58: error: (Each undeclared identifier is reported only once
nfhook.c:58: error: for each function it appears in.)
nfhook.c: At top level:
nfhook.c:65: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘nfhook_init’
nfhook.c:105: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘nfhook_exit’
nfhook.c:115: warning: data definition has no type or storage class
nfhook.c:115: warning: parameter names (without types) in function declaration
nfhook.c:116: warning: data definition has no type or storage class
nfhook.c:116: warning: parameter names (without types) in function declaration
nfhook.c:118: error: expected declaration specifiers or ‘...’ before string constant
nfhook.c:118: warning: data definition has no type or storage class

Este aparece quando tento compilar o segundo exemplo.
Não entendo porque estas bibliotecas não foram encontradas.

Estou usando Ubuntu Server 10.04.

Gostaria se possível que me ajudassem.

Valber, muito obrigado pelo artigo.

[5] Comentário enviado por marcelbueno em 30/09/2010 - 19:26h

Caro Angelios,


Faz algum tempo que escrevi este artigo. Para ser mais específico, uns 5 anos. De lá para cá muita coisa mudou: mudei de projeto, de emprego, de distro, de versão de kernel, de área, de estado e até de esposa ;-)

Brincadeiras à parte, creio que partes do seu problema se deve a falta do pacote de kernel-headers, ou kernel-dev. No caso da plataforma fedora (e redhats-like) o comando é algo como "yum install kernel-devel". Suspeito que nos debians-like, o comando seja muito semelhante, utilizando-se do "apt-get".

No entanto, pode ser que algumas coisas aí do meio (constantes principalmente) não sejam mais desta forma, e certas coisas não sejam mais aceitas pelo GCC, kernel, etc. Mas isto você só vai descobrir indo por partes...

Espero ter podido ajudar

[6] Comentário enviado por Ângelios em 01/10/2010 - 18:13h

Marcel,

Não resolveu o problema mais me ajudou muito.

Irei continuar procurando e tentando resolver isso aki.

Caso consiga retorno aki pra passar o conhecimento a diante.




Mudar de vez enquanto é sempre bom! ^^


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts