2008-09-21 16 views
15

ठीक है, मुझे एहसास है कि यह स्थिति कुछ असामान्य है, लेकिन मुझे केवल कच्चे सॉकेट (सी में, लिनक्स में) का उपयोग करके एक टीसीपी कनेक्शन (3-तरफा हैंडशेक) स्थापित करने की आवश्यकता है - यानी मुझे स्वयं आईपी हेडर और टीसीपी हेडर का निर्माण करें। मैं एक सर्वर लिख रहा हूं (इसलिए मुझे पहले आने वाले एसईएन पैकेट का जवाब देना होगा), और किसी भी कारण से मुझे यह सही नहीं लगता है। हां, मुझे एहसास है कि एक SOCK_STREAM यह मेरे लिए संभाल लेगा, लेकिन कारणों से मैं इसमें जाना नहीं चाहता हूं यह एक विकल्प नहीं है।एसओसीके_आरडब्ल्यू सॉकेट के साथ टीसीपी हैंडशेक

कच्चे सॉकेट का उपयोग करने पर मैंने जो ट्यूटोरियल ऑनलाइन पाया है, वे सभी एक एसईएन बाढ़ बनाने का वर्णन करते हैं, लेकिन यह वास्तव में एक टीसीपी कनेक्शन स्थापित करने से कुछ आसान है, क्योंकि आपको मूल के आधार पर प्रतिक्रिया बनाने की आवश्यकता नहीं है पैकेट। मुझे सिएन बाढ़ के उदाहरण मिल रहे हैं, और मैं कच्चे सॉकेट से आने वाले सिवाय पैकेट को ठीक से पढ़ सकता हूं, लेकिन मुझे अभी भी क्लाइंट से आने वाली SYN के लिए एक वैध SYN/ACK प्रतिक्रिया बनाने में समस्या हो रही है।

तो, क्या कोई भी एसएनएन बाढ़ बनाने से परे कच्चे सॉकेट का उपयोग करने पर एक अच्छा ट्यूटोरियल जानता है, या क्या किसी के पास ऐसा कुछ कोड है जो ऐसा कर सकता है (SOCK_RAW का उपयोग करके, और SOCK_STREAM नहीं)? मैं आपका बहुत आभारी रहूंगा।


MarkR बिल्कुल सही है - समस्या यह है कि गिरी प्रारंभिक पैकेट के जवाब में रीसेट पैकेट भेजने जाता है क्योंकि यह सोचता है कि बंदरगाह को बंद कर दिया जाता है। कर्नेल प्रतिक्रिया के लिए मुझे मार रहा है और कनेक्शन मर जाता है। मैं पहले से कनेक्शन की निगरानी करने के लिए टीसीपीडम्प का उपयोग कर रहा था - मुझे और अधिक सावधानी बरतनी चाहिए और ध्यान दिया जाना चाहिए कि दो जवाब थे जिनमें से एक रीसेट था जो चीजों को खराब कर रहा था, साथ ही साथ मेरे कार्यक्रम की प्रतिक्रिया भी थी। डी 'ओह!

समाधान जो सबसे अच्छा काम करता प्रतीत होता है, वह आउटबाउंड पैकेट को अवरुद्ध करने के लिए मार्कआर द्वारा सुझाए गए आईपीटीबल्स नियम का उपयोग करना है। हालांकि, सुझाव के अनुसार, मार्क विकल्प का उपयोग करने से ऐसा करने का एक आसान तरीका है। मैं बस मेल खाता हूं कि रीसेट टीसीपी ध्वज सेट है या नहीं। एक सामान्य कनेक्शन के दौरान इसकी आवश्यकता होने की संभावना नहीं है, और अगर मैं बंदरगाह से सभी आउटबाउंड रीसेट पैकेट को अवरुद्ध करता हूं तो यह वास्तव में मेरे आवेदन से कोई फर्क नहीं पड़ता। यह कर्नेल की अनचाहे प्रतिक्रिया को प्रभावी ढंग से अवरुद्ध करता है, लेकिन मेरे अपने पैकेट नहीं। तो बंदरगाह मेरे कार्यक्रम पर सुन रहा है 9999 है तो iptables नियम इस तरह दिखता है:

iptables -t filter -I OUTPUT -p tcp --sport 9999 --tcp-flags RST RST -j DROP 

उत्तर

1

मैं एक ट्यूटोरियल की जरूरत नहीं है, लेकिन मैं हाल ही में अच्छे प्रभाव के लिए इस्तेमाल किया Wireshark कुछ कच्चे सॉकेट प्रोग्रामिंग मैं कर रहा था डिबग करने के लिए । यदि आप अपने द्वारा भेजे जा रहे पैकेट को कैप्चर करते हैं, तो वायरसहार्क आपको दिखाए जाने का अच्छा काम करेगा यदि वे विकृत हैं या नहीं। यह सामान्य कनेक्शन की तुलना करने के लिए भी उपयोगी है।

2

मैं किसी भी ट्यूटोरियल पर आपकी मदद नहीं कर सकता।

लेकिन मैं आपको उन उपकरणों पर कुछ सलाह दे सकता हूं जिनका उपयोग आप डिबगिंग में सहायता के लिए कर सकते हैं।

सबसे पहले, bmdhacks के रूप में सुझाव दिया गया है, wireshark (या tcpdump - लेकिन wireshark का उपयोग करना आसान है) की एक प्रति प्राप्त करें। एक अच्छा हैंडशेक कैप्चर करें। सुनिश्चित करें कि आप इसे सहेजते हैं।

विफल होने वाले आपके हैंडशेक में से एक को कैप्चर करें। Wireshark में काफी अच्छा पैकेट पार्सिंग और त्रुटि जांच है, इसलिए यदि कोई सीधी त्रुटि है तो यह शायद आपको बताएगी।

अगला, tcpreplay की एक प्रति प्राप्त करें। इसमें "tcprewrite" नामक टूल भी शामिल होना चाहिए। tcprewrite आपको हैंडशेक के प्रत्येक पक्ष के लिए अपनी पिछली सहेजी गई कैप्चर फ़ाइलों को दो में विभाजित करने की अनुमति देगा। फिर आप हैंडशेक के एक तरफ वापस खेलने के लिए tcpreplay का उपयोग कर सकते हैं ताकि आपके पास खेलने के लिए पैकेट का एक सतत सेट हो।

फिर आप अपने प्रतिक्रियाओं की जांच के लिए वायरशर्क (दोबारा) का उपयोग करें।

9

आप उपयोगकर्ता स्पेस में एक टीसीपी स्टैक का हिस्सा लागू करना चाहते हैं ... यह ठीक है, कुछ अन्य ऐप्स ऐसा करते हैं।

एक समस्या आप पार आएगी यह है कि कर्नेल आने वाले पैकेट के जवाब भेज देगा (आमतौर पर नकारात्मक, अनुपयोगी)। यह आपके द्वारा शुरू किए जाने वाले किसी भी संचार को खराब करने जा रहा है।

इससे बचने का एक तरीका आईपी पता और इंटरफ़ेस का उपयोग करना है कि कर्नेल के पास अपना स्वयं का आईपी स्टैक नहीं है- जो ठीक है लेकिन आपको लिंक-लेयर स्टफ (विशेष रूप से, एआरपी) से निपटने की आवश्यकता होगी। इसके लिए IPPROTO_IP, SOCK_RAW से कम सॉकेट की आवश्यकता होगी - आपको एक पैकेट सॉकेट (मुझे लगता है) की आवश्यकता है।

आईपीटीबल्स नियम का उपयोग कर कर्नेल के प्रतिक्रियाओं को अवरुद्ध करना भी संभव हो सकता है- लेकिन मुझे संदेह है कि नियम आपके पैकेट पर भी लागू होंगे, जब तक कि आप उन्हें अलग-अलग इलाज नहीं कर सकते (शायद नेटफिल्टर को लागू करना अपने खुद के पैकेट के लिए "निशान"?)

पढ़ें आदमी पृष्ठों

सॉकेट (7) आईपी (7) पैकेट (7)

कौन सा विभिन्न विकल्प और ioctls जो प्रकारों पर लागू के बारे में समझाने सॉकेट का।

बेशक आपको वायरसहार्क जैसे टूल की आवश्यकता होगी ताकि यह पता चल सके कि क्या हो रहा है। इसका परीक्षण करने के लिए आपको कई मशीनों की आवश्यकता होगी, मैं आवश्यक हार्डवेयर की मात्रा को कम करने के लिए vmware (या इसी तरह) का उपयोग करने की सलाह देता हूं।

क्षमा करें मैं एक विशिष्ट ट्यूटोरियल की सिफारिश नहीं कर सकता।

शुभकामनाएं।

0

क्रमशः नेटिनेट/आईपीएच & नेटिनेट/टीसीपीएच में घोषित आईपी और टीसीपी हेडर के लिए संरचनाएं हैं। आप अतिरिक्त मैक्रोज़ & सामानों के उपयोग के लिए इस निर्देशिका में अन्य शीर्षकों को देखना चाह सकते हैं।

आप SYN ध्वज सेट और एक यादृच्छिक क्रम संख्या (x) के साथ एक पैकेट भेजते हैं। आपको दूसरी ओर से एक SYN + ACK प्राप्त करना चाहिए। इस पैकेट एक रसीद संख्या (y) है कि अगले क्रम संख्या दूसरे पक्ष प्राप्त करने की उम्मीद कर रहा है और साथ ही एक और क्रम संख्या (जेड) इंगित करता है होगा। आप एक एसीके पैकेट वापस भेजते हैं जिसमें कनेक्शन को पूरा करने के लिए अनुक्रम संख्या x + 1 और एएसी संख्या जेड + 1 होता है।

आपको यह सुनिश्चित करने की भी आवश्यकता है कि आप उचित टीसीपी/आईपी चेकसम की गणना करें & आपके द्वारा भेजे जाने वाले पैकेट के लिए शीर्षलेख को शेष भरें। साथ ही, मेजबान & नेटवर्क बाइट ऑर्डर जैसी चीज़ों को न भूलें।

टीसीपी, आरएफसी 793 में परिभाषित किया गया है यहाँ उपलब्ध है: http://www.faqs.org/rfcs/rfc793.html

0

आपको बस इतना करना है कि यह आप के लिए टीसीपी हेन्डशेकिंग को संभालने के लिए मौजूदा सॉफ्टवेयर पाने के लिए आसान हो सकता है की कोशिश कर रहे हैं क्या पर निर्भर करता है।

एक खुला स्रोत आईपी ढेर lwIP (http://savannah.nongnu.org/projects/lwip/) जो एक पूर्ण टीसीपी/आईपी प्रदान करता है। यह या तो SOCK_RAW या PCAP का उपयोग कर उपयोगकर्ता मोड में चलाने के लिए बहुत संभव है।

3

मुझे लगता है कि यह एक पुराने धागा है, लेकिन यहाँ एक ट्यूटोरियल है कि सामान्य SYN flooders से परे चला जाता है: http://www.enderunix.org/docs/en/rawipspoof/

आशा है कि यह किसी के लिए सहायक हो सकता है।

0

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

+0

मुझे पता है कि यह 4 साल का सवाल है लेकिन आपका सुझाव काफी दिलचस्प लग रहा है इसलिए मैंने आपको स्पष्टीकरण के लिए पूछने का फैसला किया। सवाल यह है: क्या गलत डिवाइस के मैक पते के साथ कुछ मशीन पर प्रतिक्रिया पैकेट को रूट करते समय राउटर के साथ कोई समस्या है? क्या पैकेट को आजकल फायरवॉल या एंटीवायरस द्वारा फ़िल्टर किया जाएगा? –

+0

यदि वे पोर्ट सुरक्षा के लिए कॉन्फ़िगर किए गए हैं तो एक स्पूफ़ेड मैक स्विच द्वारा फ़िल्टर किया जा सकता है। मैक परत पर एसीएल हो सकता है, लेकिन आम तौर पर एमएसी को धोखा देने से आपको रोक नहीं है। आपको केवल यह सुनिश्चित करने की ज़रूरत है कि आपका नेटवर्क कार्ड इस स्पूफेड मैक के जवाब स्वीकार करेगा (मैक को स्वीकृत पैकेट की तालिका में जोड़कर या प्रोमीस्क मोड में डालकर)। यदि आप अधिकृत नहीं हैं तो ऐसा करना एक बुरा विचार है। – eckes

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