podem existir varias hooks, e necessario existir uma ordem de prioridade, seguindo o exemplo do bioforge no seu paper, vamos trabalhar com NF_IP_PRI_FIRST, que faz com que nossa hook seja tratada como a de maior prioridade(isto quer dizer atribuido o valor menor).enum nf_ip_hook_priorities { NF_IP_PRI_FIRST = INT_MIN, NF_IP_PRI_CONNTRACK = -200, NF_IP_PRI_MANGLE = -150, NF_IP_PRI_NAT_DST = -100, NF_IP_PRI_FILTER = 0, NF_IP_PRI_NAT_SRC = 100, NF_IP_PRI_LAST = INT_MAX,};Agora temos as ferramentas necessarias para podermos comecar a construcao de modulos simples para o netfilter e carrega-los dentro do nosso kernel!!Para vc que nao se lembra, ou nunca viu um modulo do kernel antes, eu recomendo a leitura do documento:http://www.faqs.org/docs/kernel/E um bom documento para iniciantes como eu.Maos a obra:Vamos tentar primeiro criar um modulo simples que drop pacotes chegando na interface lo.DROPA PACOTES CHEGANDO NA INTERFACE lo:#define __KERNEL__#define MODULE#include #include #include #include #include unsigned int hookfunc(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { static char *interface_lo = "lo"; if(strncmp(in->name, interface_lo, 2)) { return NF_DROP; } return NF_ACCEPT; } static struct nf_hook_ops hulk;int init_module() { hulk.hooknum = NF_IP_LOCAL_IN; hulk.priority = NF_IP_PRI_FIRST; hulk.hook = hookfunc; hulk.pf = PF_INET; nf_register_hook(&hulk); return 0; }void cleanup_module() { nf_unregister_hook(&hulk); }Blz antes de um passo a passo no codigo vamos ver o que aconteceu quando compilamos e rodamos o kernel:bash-2.05b# gcc -c -O3 teste_interface.cbash-2.05b# insmod teste_interface.oWarning: loading teste_interface.o will taint the kernel: no license See http://www.tux.org/lkml/#export-tainted for information about tainted modulesModule teste_interface loaded, with warningsbash-2.05b# ping localhostPING localhost (127.0.0.1) 56(84) bytes of data. --- localhost ping statistics ---4 packets transmitted, 0 received, 100% packet loss, time 3014ms bash-2.05b#Blz parece que tudo funcionou como queriamos :)Partimos agora para um passo a passo:Estas definicoes sao padrao de todos modulos que criamos, pode ser substituida pelas flags -DMODULE e -D__KERNEL__ , no entanto prefiro economizar flags hehehehehe.#define __KERNEL__#define MODULEvamos ver os includes :PEstes dois sao padrao de serem incluidos em modulos do kernel tb:#include #include este declaram nossas hooks priorities etc:#include #include Declaracao de struct net_device, usamos para sabermos o nome da interface in->name#include Abaixo vemos nossa funcao :) que vai fazer o hook do pacote:unsigned int hookfunc(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) {Declaramos um ponteiro char com o conteudo "lo", o nome da interface que queremos bloquear static char *interface_lo = "lo"; Fazemos uma simples comparacao para sabermos se in->name e igual a nossa interface_lo, caso seja(if retorna 0), retornamos o NF_DROP, que manda o pacote para onde judas perdeu as botas. if(strncmp(in->name, interface_lo, 2)) { return NF_DROP; } Caso nao seja o fluxo da funcao chegara aqui qeu retornara para o pacote ser aceito, e ele passara pelas outras hooks para validacao, nao tendo nenhum problema chegara ao espaco do usuario para a aplicacao que estiver esperando por ele. return NF_ACCEPT; } Todo modulo tem uma funcao destas, ela e responsavel por iniciar os modulo, isto e fazer todas as atribuicoes, preparar nosso triggers, ou setar alguma coisa que desejamos dentro do kernelint init_module() {Blz ate aqui, vamos agora preencher nossa estrutura