2012-06-15 4 views
5

में नेटवर्क फ्रेम को कैप्चर करने के लिए कैसे करें जब मैं एक निश्चित एनआईसी द्वारा प्राप्त किए जाने पर फ्रेम को कैप्चर करना चाहता हूं; उनसे कुछ जानकारी निकालें (वर्तमान में मुझे स्रोत मैक और स्रोत आईपी पते पर कब्जा करने की आवश्यकता है); इन जानकारी को कुछ सार्वजनिक डेटा संरचना में सहेजें; और फ्रेम को टीसीपी/आईपी स्टैक के रास्ते में जाने दें।
कर्नेल मॉड्यूल

मैंने पहले नेटफिल्टर का उपयोग किया है, लेकिन स्पष्ट रूप से यह लिंक परत हुक प्रदान नहीं करता है।
क्या कोई तरीका है कि मैं ऐसा कर सकता हूं?

मैं इसे कर्नेल मॉड्यूल के रूप में लिख रहा हूं; चल रहे लिनक्स कर्नेल 2.6.32

उत्तर

6

असल में नेटफिल्टर को ठीक काम करना चाहिए क्योंकि यह पूरे पैकेट को प्राप्त करता है (आंतरिक रूप से एक sk_buff के रूप में संग्रहीत होता है जिसमें लिंक परत जानकारी शामिल होती है)। यहां कुछ नमूना कोड दिया गया है जो आपको शुरू करना चाहिए। यह कोड किसी दिए गए डिवाइस के लिए सभी आने वाले पैकेट को रोकता है और src MAC और src IP को प्रिंट करता है।

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

लॉल, मैं थोड़ी देर के लिए यह कोशिश नहीं कर रहा हूं; बहुत बहुत धन्यवाद सर ^^ – Fingolfin

+0

@ एडेल ग्लेड यह आपके लिए काम करता है! – ajpyles

+0

होना चाहिए: printk ("src IP addr: =% d।% D।% D।% D:% d \ n", NIPQUAD (ip_header-> saddr)); – Raman

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^