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: 42.539 ]

Por: Valber Marcel Bueno em 07/11/2005


Estruturas



Estrutura HOOK:

struct nf_hook_ops
{
   struct list_head list;

   /* Campos a serem preenchidos daqui para baixo. */
   nf_hookfn *hook;
   int pf;
   int hooknum;
   /* Hooks são ordenados em ordem ascendente de prioridade. */
   int priority;
};

Função básica de hook:

/* Esta é a função hook */
unsigned int hook_func(unsigned int hooknum,
                        struct sk_buff **skb,
                        const struct net_device *in,
                        const struct net_device *out,
                        int (*okfn)(struct sk_buff *))
{
   return NF_DROP;  /* Descarta todos os pacotes */
}

Para registrar um hook:

/*
    Esta é a estrutura que será usada para registrar o hook
    É aconselhável que seja declarada como GLOBAL
*/
static struct nf_hook_ops nfho;

Dados do objeto de Hook:

/*
    Para habilitar um HOOK, utilize o procedimento abaixo
    (de preferência na inicialização do módulo
*/
nfho.hook     = hook_func;         /* Handler function */
nfho.hooknum  = NF_IP_PRE_ROUTING; /* First hook for IPv4 */
nfho.pf       = PF_INET;
nfho.priority = NF_IP_PRI_FIRST;   /* Make our function first */

Procedimento para registro:

nf_register_hook(&nfho);

Procedimento para remoção:

nf_unregister_hook(&nfho);

Exemplo:

#include <linux/config.h>
#include <linux/module.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/ip.h>

static struct nf_hook_ops nfho;

unsigned int hook_func (
   unsigned int hooknum,
   struct sk_buff **pskb,
   const struct net_device *indev,
   const struct net_device *outdev,
   int (*okfn)(struct sk_buff *)
)
{
   // Nega todos os pacotes
   return NF_DROP;
}  

static int __init nfhook_init(void)
{
   nfho.hook     = hook_func;         /* função a ser usada pelo hook*/
   nfho.hooknum  = NF_IP_PRE_ROUTING; /* IPv4 Prerouting */
   nfho.pf       = PF_INET;
   nfho.priority = NF_IP_PRI_FIRST;   /* Adiciona como primeiro hook da lista */

   nf_register_hook(&nfho);

   return 0;
}

static void __exit nfhook_exit(void)
{
   nf_unregister_hook(&nfho);
}

module_init(nfhook_init);
module_exit(nfhook_exit);

MODULE_LICENSE("GPL");
Página anterior     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

Fazendo seu Linux hibernar

Instalação e configuração do Squid com TProxy no Debian

cpulimit - Limitando o uso da CPU por processo

Kernel 2.6.7 compilado e configurado para nVIDIA

IPCMSG: Comunicação inter-processos sem magia negra

  
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

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts