W rzeczywistości Netfilter powinien działać poprawnie, ponieważ otrzymuje cały pakiet (przechowywany wewnętrznie jako sk_buff, który zawiera informacje o warstwie łącza). Oto przykładowy kod, który powinien zacząć. Ten kod przechwytuje wszystkie przychodzące pakiety dla danego urządzenia i drukuje adresy MAC src i src.
static struct nf_hook_ops nfin;
static unsigned int hook_func_in(unsigned int hooknum,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
struct ethhdr *eth;
struct iphdr *ip_header;
/* check *in is the correct device */
if (in is not the correct device)
return NF_ACCEPT;
eth = (struct ethhdr*)skb_mac_header(skb);
ip_header = (struct iphdr *)skb_network_header(skb);
printk("src mac %pM, dst mac %pM\n", eth->h_source, eth->h_dest);
printk("src IP addr:=%d.%d.%d.%d:%d\n", NIPQUAD(ip_headr->saddr));
return NF_ACCEPT;
}
static int __init init_main(void)
{
nfin.hook = hook_func_in;
nfin.hooknum = NF_IP_LOCAL_IN;
nfin.pf = PF_INET;
nfin.priority = NF_IP_PRI_FIRST;
nf_register_hook(&nfin);
return 0;
}
static void __exit cleanup_main(void)
{
nf_unregister_hook(&nfin);
}
module_init(init_main);
module_exit(cleanup_main);
lol, czuję się głupio, że nie próbowałem tego; bardzo dziękuję ^^ – Fingolfin
@Adel Cieszę się, że to działa dla ciebie! – ajpyles
powinno być: printk ("adres IP src: =% d.% D.% D.% D:% d \ n", NIPQUAD (ip_header-> saddr)); – Raman