pacote(checksums, um pacote nao-promiscuo, etc), e antes do roteamento do mesmo.Acontece neste momento o roteamento do pacote, a decisao se ele e um pacote destinado a esta maquina ou se este pacote ira apenas atravessar a maquina passando para outra interface.2. NF_IP_LOCAL_IN = Caso o pacote sejam destinados a esta maquina, este pacote e considerado como um pacote entrante, e e tratado pela hook de NF_IP_LOCAL_IN.3. NF_IP_FORWARD = Caso o pacote nao seja enderecado a maquina mas sim routeado pela mesma repassado para outra interface(havera repasse do pacote), ele sera tratado por esta hook NF_IP_FORWARD.4. NF_IP_POST_ROUTING = Caso o pacote esteja sendo repassado, esta hook sera disparada antes dele ser enviado novamente a rede.5. NF_IP_LOCAL_OUT = Caso o pacote seja gerado pela maquina, esta hook sera disparada antes que ele seja enviado para a rede, fiz uma pequena alteracao no desenho, como no proprio site do netfilter diz (http://www.netfilter.org/documentation/HOWTO//netfilter-hacking-HOWTO-3.html ) o roteamento acontece antes desta hook, para obter o endereco de origem do pacote, e fazer outras operacoes.Podemos conhecer as hooks do netfilter olhando em linux/netfilter_ipv4.h, vamos dar uma olhadinha num pedaco deste header:/* IP Hooks *//* After promisc drops, checksum checks. */#define NF_IP_PRE_ROUTING 0/* If the packet is destined for this box. */#define NF_IP_LOCAL_IN 1/* If the packet is destined for another interface. */#define NF_IP_FORWARD 2/* Packets coming from a local process. */#define NF_IP_LOCAL_OUT 3/* Packets about to hit the wire. */#define NF_IP_POST_ROUTING 4A funcao responsavel pela nossa hook:Vcs viram que podemos manipular um determinado pacote em certos momentos dentro do netfilter, mas pense bem como vamos manipula-lo?Bem quando chegar neste momento o netfilter "chamara" automaticamente uma funcao que registraremos dentro de nossa hook.Vamos ver a declaracao desta nossa funcao, conforme ~/linux/netfilter.h:typedef unsigned int nf_hookfn(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *));Vamos por partes como diria Jack estripador, agora acredito que vc tenha pensado o que e este tal de skb??Ele e um ponteiro para uma estrutura que representa nada mais nada menos do que um pacote no nivel do kernel, o driver da nossa placa de rede nos entrega estes pacotes neste formato podemos encontrar sua declaracao e seus membros em ~/linux/sk_buff.h, ele e um no dentro de uma lista encadeada, digo para os programadores ruins como eu: "muita calma nesta hora", nao tenham medo, nao vamos manipular esta lista encadeada, pelo menos nao neste paper hehehehe.Vamos dar uma olhada num pedaco deste bicho de 7 cabecas:struct sk_buff { /* These two members must be first. */ struct sk_buff * next; /* Next buffer in list */ struct sk_buff * prev; /* Previous buffer in list */ struct sk_buff_head * list; /* List we are on */ struct sock *sk; /* Socket we are owned by */ struct timeval stamp; /* Time we arrived */ struct net_device *dev; /* Device we arrived on/are leaving by */ struct net_device *real_dev; /* For support of point to point protocols (e.g. 802.3ad) over bonding, we must save the physical device that got the packet before replacing skb->dev with the virtual device. */ /*