Gli autori dei driver per il tunneling (o incapsulamento) dovrebbero seguire due semplici regole per il kernel 2.4 (come fanno i driver nel kernel, ad esempio net/ipv4/ipip.c):
Altrimenti il NAT userà le vecchie informazioni del connection tracking per modificare il pacchetto, con pericolose conseguenze.
Altrimenti l'utente non sarà in grado di filtrare come si aspetta da un tunnel.
Il modo tradizionale per fare la prima cosa consiste nell'inserire le seguenti linee di codice prima di "wrappare" o "unwrappare" il pacchetto:
/* Dice al framework netfilter che questo pacchetto non è lo
stesso di prima!*/
#ifdef CONFIG_NETFILTER
nf_conntrack_put(skb->nfct);
skb->nfct = NULL;
#ifdef CONFIG_NETFILTER_DEBUG
skb->nf_debug = 0;
#endif
#endif
Solitamente, tutto quello che bisogna fare per il secondo accorgimento, è trovare dove il pacchetto appena incapsulato va dentro "ip_send()", e sostiruirlo con qualcosa tipo:
/* Invia il "nuovo" pacchetto dall'host locale */
NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt->u.dst.dev, ip_send);
Seguendo queste regole la persona che imposta imposta le regole per il packet filtering sulla tunnel-box vedrà qualcosa del genere per un pacchetto sottoposto a tunneling:
E per il pacchetto di risposta: