2017-08-25 19 views
5

मैं वर्तमान में एक कर्नेल मॉड्यूल लिख रहा हूं जो पैकेट पेलोड को सीखने के अनुभव के रूप में संशोधित करता है। मेरे पास पैकेट संशोधन किए गए हैं, लेकिन अब मैं मूल के बाद इस नए संशोधित पैकेट को भेजना चाहता हूं (मैं मूल को छोड़ना नहीं चाहता)। मुझे कर्नेल फ़ंक्शन नहीं मिल रहा है जो एसकेबी को ट्रांसमिशन के लिए भेजता है। मैंने dev_queue_xmit(nskb) की कोशिश की है लेकिन यह कर्नेल पैनिक का कारण बनता है, मैंने skb->next = nskb भी कोशिश की लेकिन यह कुछ भी नहीं करता है। क्या मुझे एसकेबी सूची हैंडलिंग लागू करना है? मैं इस लेख को seems to be outdated के बाद से ऐसा करने के बारे में अनिश्चित हूं।कर्नेल स्पेस से ट्रांसमिशन के लिए एसकेबी भेजना

संपादित करें:

तो मैं जब dev_queue_xmit (nskb) बुला कर्नेल आतंक ठीक करने में सक्षम था, मैं गलती से कर रहा था dev_queue_xmit (SKB) जो SKB हटा सकते हैं और शुद्ध फिल्टर से एक आतंक का कारण होगा। समस्या यह है कि सबकुछ काम करता है, लेकिन मुझे डुप्लिकेट पैकेट नहीं भेजे जा रहे हैं, कभी भी भेजे जा रहे दूसरे पैकेट का कोई निशान नहीं है। मशीन पर टीसीपीडम्प कुछ भी नहीं देखता है और लक्ष्य पर टीपीसीडीम्प कुछ भी नहीं देखता है, निम्नलिखित मेरा कोड है।

unsigned int in_hook(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) { 
    struct sk_buff *nskb = skb_copy(skb, GFP_KERNEL); 
    /* Various other variables not relevant to the problem */ 
    __u32 saddr, daddr; 
    saddr = ntohl(iph->saddr); 
    if (saddr == ipToInt(10,0,2,12) || saddr == ipToInt(10,0,2,13)) { 
     /*For loop that saves the payload contents into a variable */ 

     /* Here is where the problem is, 
     I have this if statement to prevent a feedback loop 
     then if the ip matches, I call dev_queue_xmit(nskb) 
     which is supposed to send out sk_buff's, but TCPDump doesn't 
     show anything on any computer */ 
     if (saddr == ipToInt(10,0,2,13)) { 
      dev_queue_xmit(nskb); 
     } 

     /* Rest of the code that isn't relevant to sending packets */ 
    } 
    return NF_ACCEPT; 
} 

मेरे नेटवर्क सेटअप इस प्रकार है, यह 3 उबंटू सर्वर वी एम के, उन सभी को मेजबान कंप्यूटर से (MacOS अगर यह मायने रखती है, मैं इस बिंदु पर पता नहीं है) में SSH'd जाने लगा है। उपर्युक्त कर्नेल मॉड्यूल चलने वाला कंप्यूटर बिडरेक्शनल रूप से अन्य दो वीएम का स्पूफ करता है। अन्य दो वीएम एक नेटकैट सत्र के माध्यम से एक-दूसरे से बात करते हैं। मैं उम्मीद कर रहा हूं कि जब मैं वीएम से आईपी 10.0.2.13 के साथ एक संदेश भेजता हूं, तो 10.0.2.12 एक ही संदेश को देखता है। मुझे पता है कि पावती संख्या दुर्घटना कनेक्शन तोड़ देगी, लेकिन मुझे वह नहीं मिल रहा है। किसी भी 3 कंप्यूटर पर टीसीपीडम्प को भेजे जाने वाले पैकेट के अलावा कुछ भी नहीं दिखाया जाता है।

मैंने अब तक dev_queue_xmit(nskb) के साथ-साथ nskb->dev->netdev_ops->ndo_start_xmit(nskb, skb->dev) को आजमाया है।

उत्तर

0

मैंने इसे समझ लिया, skb_copy एक स्कैब के ईथरनेट हेडर की प्रतिलिपि नहीं करता है, इसलिए भेजा गया पैकेट कभी भी अपने गंतव्य तक नहीं पहुंचता है।

1

जहां तक ​​मुझे याद है dev_queue_xmit() भेजने के लिए सही प्रक्रिया है। सवाल यह है कि आप जिस स्कैब को भेजना चाहते हैं उसे तैयार करते हैं? कर्नेल पैनिक होने पर हमें डीएमएसजी से कॉलट्रैक भी दें। क्या आप skb-> dev सेट करते हैं?

+0

जब मैं जांचता हूं, और डीबीजीजी खाली होता है, तो मुझे लगता है, जब मैं 'if (skb-> dev) 'करता हूं, तो यह सच हो जाता है। इसके अलावा, अभी के लिए मैं सिर्फ एक दूसरा पैकेट भेजने की कोशिश कर रहा हूं, इसलिए नेट फ़िल्टर फ़ंक्शन द्वारा मुझे दिया गया स्कैब, मैं दो डुप्लिकेट पैकेट देखने की उम्मीद कर रहा हूं, मैं 'dev_queue_xmit (skb) 'करता हूं। – MacStation

+0

सबसे महत्वपूर्ण बात: कर्नेल आतंक होने पर हमें dmesg (स्क्रीन पर) में सटीक आवश्यकता होती है। मुझे पता है कि जब कर्नेल होता है तो यह सिस्टम फ़ाइलों में लॉग इन नहीं हो सकता है - ताकि आप सीरियल कंसोल से जुड़े दूसरे सिस्टम का उपयोग कर सकें और इस कंसोल के डंप को कर सकें। – user2699113

+0

दूसरी बात - आप स्कैब की प्रतिलिपि कैसे बनाते हैं? – user2699113

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