2014-10-09 6 views
6

क्या हम लेयर 3 आईसीएमपी पैकेट के लिए srp() फ़ंक्शन का उपयोग कर सकते हैं? मैं देखता हूं कि जब हम एक आईसीएमपी इको-अनुरोध पैकेट तैयार करते हैं और भेजने/प्राप्त करने के लिए sr() का उपयोग करते हैं, तो हम इसे इंटरफ़ेस से बाहर नहीं भेजते हैं, इसलिए गंतव्य से कोई प्रतिक्रिया नहीं होती है। लेकिन अगर हम srp() फ़ंक्शन का उपयोग करते हैं तो वही पैकेट हम प्रतिक्रिया देखते हैं। हमें sr() और जब srp() का उपयोग करना चाहिए? प्रलेखन में यह बताता है कि एल 2 के लिए एल 3 पैकेट और एसआरपी() के लिए एसआर() का उपयोग किया जाना है? लेकिन मेरे मामले में मुझे यकीन नहीं है कि क्यों sr() आईसीएमपी पैकेट के लिए काम नहीं कर रहा है? क्या कुछ विशेषज्ञ मुझे समझने में मदद कर सकते हैं?स्कैपी में आईसीएमपी पैकेट भेजना और सही इंटरफेस चुनना

क्या कोई मुझे बता सकता है कि "iface" तर्क हमेशा की आवश्यकता है या नहीं। इसके बिना स्कैपी कैसे पता चलेगा कि किस इंटरफ़ेस को पैकेट भेजना है?

केस 1: तर्क के रूप में iface साथ sr() फ़ंक्शन:

sr(icmp,iface="eth0") 

शुरू उत्सर्जन:

WARNING: Mac address to reach destination not found. Using broadcast. 
Finished to send 1 packets. 
^C 
Received 0 packets, got 0 answers, remaining 1 packets 
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:1 Other:0>) 

से ऊपर मैं आईपी से किसी भी ICMP प्रतिक्रिया नहीं दिख रहा है 192.168.25.1

केस 2: एसआर() फ़ंक्शन बिना iface:

sr(icmp) 
.Begin emission: 
......WARNING: Mac address to reach destination not found. Using broadcast. 
.Finished to send 1 packets. 
...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................^C 
Received 887 packets, got 0 answers, remaining 1 packets 
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:1 Other:0>) 

यदि आप प्राप्त पैकेट के ऊपर देखते हैं तो अधिक है लेकिन मुझे कोई आईसीएमपी प्रतिक्रिया नहीं दिखाई दे रही है।

केस 3: SRP साथ ICMP पैकेट भेजा जा रहा है (के बजाय) sr():

srp(icmp,iface="eth0") 
Begin emission: 
Finished to send 1 packets. 
* 
Received 1 packets, got 1 answers, remaining 0 packets 
(<Results: TCP:0 UDP:0 ICMP:1 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>) 

यहाँ मैं SRP() sr() फ़ंक्शन के बजाय समारोह इस्तेमाल किया और अब मुझे लगता है कि देख आईसीएमपी गूंज अनुरोध ठीक से भेजा गया था और मुझे प्रतिक्रिया भी मिली।

>>> icmp.show2() 
###[ Ethernet ]### 
    dst: 02:00:00:11:01:03 
    src: 02:00:20:ee:64:01 
    type: 0x800 
###[ IP ]### 
    version: 4L 
    ihl: 5L 
    tos: 0x0 
    len: 28 
    id: 1 
    flags: 
    frag: 0L 
    ttl: 64 
    proto: icmp 
    chksum: 0xc78c 
    src: 192.168.25.2 
    dst: 192.168.25.1 
    \options\ 
###[ ICMP ]### 
     type: echo-request 
     code: 0 
     chksum: 0xf7ff 
     id: 0x0 
     seq: 0x0 
>>>     

उत्तर

3

official API documentation प्रति sr समारोह:

sr(pkts, filter=None, iface=None, timeout=2, inter=0, verbose=None, chainCC=0, retry=0, multi=0)

संदेश और conf.L3socket SuperSocket का उपयोग कर परत 3 पर पैकेट प्राप्त।

srp समारोह: srp के रूप में लेकिन conf.L2socket SuperSocket साथ परत 2 पर काम करने के लिए

srp(pkts, filter=None, iface=None, timeout=2, inter=0, verbose=None, chainCC=0, retry=0, multi=0, iface hint=None)

ही।

के बाद से अपने ICMP पैकेट इसकी परत 2 क्षेत्रों के साथ-साथ भरा है, के रूप में ICMP.show2() के उत्पादन के द्वारा दिखाया गया है, तो आप srp समारोह का उपयोग करना चाहिए।this tutorial में किए गए अनुसार, आपने उन्हें छूटा नहीं छोड़ा था, तो आप sr फ़ंक्शन का उपयोग कर सकते थे।


अब, ICMP की एक परत 2 प्रोटोकॉल या एक परत 3 प्रोटोकॉल के रूप में वर्गीकरण के बारे में अपने प्रश्न के बारे में। कई लोग सोचते हैं कि यह एक परत 3 प्रोटोकॉल है, जैसे कि here, क्योंकि यह IP शीर्षलेख का उपयोग करता है और इसके शीर्ष पर "बैठता है"। हालांकि, अन्य लोग इसे लेयर 2 प्रोटोकॉल मानते हैं जैसे कि here। इस समस्या पर कुछ अच्छे उत्तरों के साथ This is a question, लेकिन ध्यान दें कि वे OSI मॉडल का संदर्भ लेते हैं ताकि लेयरिंग स्कीम नंबरिंग थोड़ा अलग हो। यह सबसे अच्छा मैं here से, पता लगाने के लिए प्रबंधित किया है है:

आईपी अपने आप में एक प्रत्यक्ष पेलोड के रूप में स्थापित करने और एक कनेक्शन को बनाए रखने, या यहाँ तक युक्त डेटा के लिए कोई तंत्र नहीं है। इंटरनेट कंट्रोल मैसेजिंग प्रोटोकॉल केवल आईपी के लिए त्रुटि, रूटिंग और नियंत्रण संदेश और डेटा ले जाने के लिए एक अतिरिक्त है, और इसे अक्सर नेटवर्क परत के प्रोटोकॉल के रूप में माना जाता है।

संपादित करें - मैं सिर्फ this link का सामना करना पड़ा है, और सोचा था कि यह एक उल्लेख के लायक है:

ICMP टीसीपी/आईपी कि मूल रूप से मौजूद नियंत्रण, समस्या निवारण, और त्रुटि संदेश प्रदान करने के लिए भीतर एक प्रोटोकॉल है । यह टीसीपी और यूडीपी की तरह आईपी पर चलता है, लेकिन टीसीपी और यूडीपी जैसे ट्रांसपोर्ट लेयर प्रोटोकॉल की बजाय आईपी की तरह नेटवर्क-लेयर प्रोटोकॉल है। (हाँ, यह फिर से एक तरह से अजीब है, कि ICMP जबकि आईपी रूप में एक ही स्तर पर किया जा रहा है आईपी भीतर समझाया गया है लेकिन फिर भी, आप के रूप में अच्छी आईपी भीतर आईपी संपुटित कर सकते हैं।।)

RFC 792 भी बहुत स्पष्ट है:

आईसीएमपी, आईपी के बुनियादी समर्थन का उपयोग करता है जैसे कि यह एक उच्च स्तरीय प्रोटोकॉल था, हालांकि, आईसीएमपी वास्तव में आईपी का एक अभिन्न अंग है।

और इसलिए RFC 1122 है: हालांकि यह वास्तुकला आईपी पर स्तरित है

ICMP, एक नियंत्रण प्रोटोकॉल कि आईपी का एक अभिन्न अंग माना जाता है है, यानी, यह आईपी का उपयोग करता है अपने डेटा ले जाने के लिए टीसीपी या यूडीपी जैसे परिवहन प्रोटोकॉल के रूप में अंत तक अंत तक।
...
हालांकि आईपीएमपी संदेशों को आईपी डेटाग्राम के भीतर encapsulated किया गया है, आईसीएमपी प्रसंस्करण आईपी परत के हिस्से (और आमतौर पर लागू किया जाता है) माना जाता है।


अपने आखिरी सवाल के बारे में स्पष्ट रूप से इंटरफेस निर्दिष्ट करने के बारे में, scapy's tutorial देखें:

send() समारोह परत 3. इसके लिए मार्ग और परत 2 संभाल लेंगे कहना है कि कम से पैकेट भेज देंगे आप। sendp() फ़ंक्शन परत 2 पर काम करेगा। यह सही इंटरफ़ेस और दायां लिंक लेयर प्रोटोकॉल चुनने के लिए आपके ऊपर है।

आधिकारिक API दस्तावेज़ों में थोड़ा और अधिक विस्तृत है:

जब Scapy शुरू की है, इसके अनुमार्गण तालिका मेजबान के अनुमार्गण तालिका के साथ सिंक्रनाइज़ कर रहे हैं। परत 3 पर भेजे गए पैकेट के लिए, गंतव्य आईपी आउटपुट इंटरफ़ेस, स्रोत पता और गेटवे का उपयोग करने के लिए निर्धारित करता है। एक परत 2 पैकेट के लिए, आउटपुट इंटरफ़ेस को सटीक किया जा सकता है, या आउटपुट इंटरफ़ेस निर्धारित करने के लिए आईपी के रूप में संकेत दिया जा सकता है। यदि कोई आउटपुट इंटरफ़ेस और न ही संकेत दिया जाता है, तो conf.iface का उपयोग किया जाता है।

विशेष रूप से, iface पैरामीटर इनपुट इंटरफेस स्थापित करने के लिए प्रयोग किया जाता है (लेकिन यदि iface_hint इस्तेमाल नहीं किया है भी, उत्पादन इंटरफ़ेस सेट):

iface: केवल प्रदान की अंतरफलक पर जवाब सुनने

output इंटरफेस पर इशारा के लिए, परत 2 कार्यों के लिए iface_hint का उपयोग करें:

एक अतिरिक्त पैरामीटर भी है, iface_hint, जो एक संकेत देता है जो सही आउटपुट इंटरफ़ेस चुनने में मदद कर सकता है। डिफ़ॉल्ट रूप से, यदि iface द्वारा निर्दिष्ट नहीं किया गया है, conf.iface चुना गया है। इशारा एक आईपी का रूप लेता है जिस पर परत 2 पैकेट को नष्ट किया जा सकता है। स्कापी रूटिंग टेबल (conf.route) का उपयोग यह निर्धारित करने के लिए किया जाता है कि इस आईपी तक पहुंचने के लिए किस इंटरफ़ेस का उपयोग किया जाए।

+1

ग्रेट योएल। मैंने ईथर() को दिए बिना एक आईसीएमपी पैकेट तैयार किया और मैंने देखा कि sr() जैसा कि उल्लेख किया गया है। मैंने यह भी देखा कि स्कैपी में रूटिंग टेबल सिंक से बाहर थी। मैंने इसे पुनर्वित्त किया और अब यह sr() के लिए सही निकास iface ले रहा था। अपनी त्वरित प्रतिक्रिया के लिए धन्यवाद। – Pradeep

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