2012-01-30 7 views
20

के साथ अनचाहे आरएसटी टीसीपी पैकेट टीसीपी कैसे काम करता है, यह समझने के लिए, मैंने अपने स्वयं के टीसीपी एसवाईएन/एसईएन-एसीके/एसीके (ट्यूटोरियल के आधार पर: http://www.thice.nl/creating-ack-get-packets-with-scapy/) बनाने की कोशिश की।स्कैपी

समस्या यह है कि जब भी मेरा कंप्यूटर सर्वर से SYN-ACK प्राप्त करता है, तो यह एक आरएसटी पैकेट उत्पन्न करता है जो कनेक्शन प्रक्रिया को रोकता है।

मैंने ओएस एक्स शेर और उबंटू 10.10 मेवेरिक मेरकट पर कोशिश की, दोनों कनेक्शन को रीसेट कर दिया। मैंने यह पाया: http://lkml.indiana.edu/hypermail/linux/net/0404.2/0021.html, मुझे नहीं पता कि यह कारण है या नहीं।

क्या कोई मुझे बता सकता है कि कारण क्या हो सकता है? और इस समस्या से कैसे बचें?

धन्यवाद।

+0

मुझे लगता है कि यह कोड स्निपेट इस समस्या को और अधिक स्पष्ट रूप से बनाता है: 'ans = scapy.all।SR1 (generate_tcp_syn_pkt()); ack_pkt = gener_tcp_ack_pkt (ans); scapy.all.send (ack_pkt) ' – diabloneo

+0

आपने ओएस एक्स के लिए इस समस्या को कैसे हल किया? – user1505986

उत्तर

22

लेख आपको उद्धृत इस सुंदर स्पष्ट करता है ...

जब से तुम पूरा नहीं कर रहे हैं पूर्ण टीसीपी आपके ऑपरेटिंग सिस्टम हाथ मिलाना नियंत्रण लेने के प्रयास कर सकते हैं और RST (रीसेट) पैकेट भेजने शुरू कर सकते हैं, से बचने के लिए इस हम iptables का उपयोग कर सकते हैं:

iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.1.20 -j DROP 

अनिवार्य रूप से, समस्या यह है कि उपयोगकर्ता जगह है, और लिनक्स कर्नेल में scapy रन SYN-एसीके पहले प्राप्त होगा। कर्नेल एक आरएसटी भेज देगा क्योंकि आपके पास scapy के साथ कुछ भी करने का मौका मिलने से पहले पोर्ट नंबर पर सॉकेट खुला नहीं होगा।

समाधान (ब्लॉग उल्लेख के रूप में) आपके कर्नेल को आरएसटी पैकेट भेजने से फ़ायरवॉल करना है।

+0

इस उपयोगी अतिरिक्त जानकारी के लिए धन्यवाद। – user1177093

+0

आपका स्वागत है –

+4

क्या आईपीटीबल्स के बिना कोई समाधान है? मैं वास्तव में अपनी मशीन पर iptables कॉन्फ़िगरेशन नहीं बदल सकता। इसके अलावा, मैं अपने कार्यान्वयन से भी आरएसटी भेजना चाहता हूं (परीक्षण उद्देश्यों के लिए स्वयं का टीसीपी प्रवाह बनाना) – KillianDS

3

मेरे पास एक गैर-iptables उत्तर नहीं है, लेकिन कोई रीसेट समस्या ठीक कर सकता है। फ़िल्टर तालिका में आउटगोइंग रीसेट को फ़िल्टर करने का प्रयास करने के बजाय, कच्चे तालिका में लक्ष्य से आने वाले सभी पैकेट को फ़िल्टर करें। यह कर्नेल द्वारा संसाधित होने से भी लक्ष्य से रिटर्न पैकेट को रोकता है, हालांकि स्कैपी अभी भी उन्हें देखता है। मैंने निम्नलिखित वाक्यविन्यास का उपयोग किया:

iptables -t raw -A PREROUTING -p tcp --dport <source port I use for scapy traffic> -j DROP 

यह समाधान मुझे मेरे यातायात के लिए एक ही स्रोत पोर्ट का उपयोग करने के लिए मजबूर करता है; अपने लक्ष्य के रिटर्न पैकेट की पहचान करने के लिए अपने स्वयं के iptables-fu का उपयोग करने के लिए स्वतंत्र महसूस करें।

1

अन्य उत्तरों में उद्धृत ब्लॉग आलेख पूरी तरह से सही नहीं है। यह केवल इतना नहीं है कि आप तीन तरह के हैंडशेक को पूरा नहीं कर रहे हैं, यह है कि कर्नेल के आईपी स्टैक को कोई जानकारी नहीं है कि एक कनेक्शन हो रहा है। जब इसे SYN-ACK प्राप्त होता है, तो यह RST-ACK भेजता है क्योंकि यह अप्रत्याशित है। पहले या आखिरी बार प्राप्त करना वास्तव में इसमें प्रवेश नहीं करता है। SYN-ACK प्राप्त करना समस्या है।

आउटबाउंड RST पैकेट ड्रॉप करने के लिए आईपीटीबल्स का उपयोग करना एक आम और वैध दृष्टिकोण है, लेकिन कभी-कभी आपको स्कैपी से RST भेजने की आवश्यकता होती है। एक अधिक शामिल लेकिन बहुत ही व्यावहारिक दृष्टिकोण मेजबान के अलग-अलग मैक के साथ एआरपी को कम करने, उत्पन्न करने और जवाब देने के लिए है। यह आपको मेजबान से हस्तक्षेप किए बिना कुछ भी भेजने और प्राप्त करने की क्षमता रखने की अनुमति देता है।

स्पष्ट रूप से यह अधिक प्रयास है। निजी तौर पर, मैं केवल इस दृष्टिकोण को लेता हूं (RST ड्रॉप दृष्टिकोण के विपरीत) जब मुझे वास्तव में RST स्वयं भेजने की आवश्यकता होती है।

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