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.
NF_POST_ROUTING: Depois do processamento de saída;
NF_LOCAL_OUT: Para pacotes vindos de endereços locais no seu caminho de saída;
NF_IP_FORWARD: Se o pacote está destinado a outra interface;
NF_IP_LOCAL_IN: After routing decisions if packet is for this host;
NF_IP_PRE_ROUTING: Antes dos testes, depois das decisões de rota.
O Hook NF_IP_PRE_ROUTING é chamado de primeiro HOOK após o pacote ser recebido. Este é o hook apresentado aqui e que será utilizado. Sim, outros Hooks também possuem seus usos, mas iremos nos focar mais em NF_IP_PRE_ROUTING.
Códigos de retorno do Netfilter:
NF_DROP: Descarta o pacote;
NF_ACCEPT: Aceita o pacote;
NF_STOLEN: "Esquece" o pacote para processamento e processa internamente;
NF_QUEUE: Enfileira pacotes, deixando a possibilidade para manipulação em User Space;
NF_REPEAT: Chame este processo novamente.
O retorno NF_STOLEN é interessante porque diz ao Netfilter para "esquecer" o pacote. Isto quer dizer que o Netfilter deve deixar o processamento deste pacote a cargo deste hook e que o Netfilter não deverá fazer mais nada com ele.
[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.
[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...