2012-06-15 11 views
5

Chcę przechwytywać ramki, gdy są odbierane przez określoną kartę sieciową; wyodrębnij z nich trochę informacji (obecnie potrzebuję przechwycić źródłowe adresy MAC i źródłowe adresy IP); zapisać te informacje w niektórych publicznych strukturach danych; i niech ramka podąży w górę do stosu TCP/IP.
Jak przechwytywać ramki sieciowe w module jądra

Używałem już Netfiltra, ale najwyraźniej nie zapewnia on haków linków.
Czy mogę to zrobić?

Piszę to jako moduł jądra; z jądrem Linux 2.6.32

Odpowiedz

6

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); 
+0

lol, czuję się głupio, że nie próbowałem tego; bardzo dziękuję ^^ – Fingolfin

+0

@Adel Cieszę się, że to działa dla ciebie! – ajpyles

+0

powinno być: printk ("adres IP src: =% d.% D.% D.% D:% d \ n", NIPQUAD (ip_header-> saddr)); – Raman

Powiązane problemy