ठीक है, मुझे एहसास है कि यह स्थिति कुछ असामान्य है, लेकिन मुझे केवल कच्चे सॉकेट (सी में, लिनक्स में) का उपयोग करके एक टीसीपी कनेक्शन (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
मुझे पता है कि यह 4 साल का सवाल है लेकिन आपका सुझाव काफी दिलचस्प लग रहा है इसलिए मैंने आपको स्पष्टीकरण के लिए पूछने का फैसला किया। सवाल यह है: क्या गलत डिवाइस के मैक पते के साथ कुछ मशीन पर प्रतिक्रिया पैकेट को रूट करते समय राउटर के साथ कोई समस्या है? क्या पैकेट को आजकल फायरवॉल या एंटीवायरस द्वारा फ़िल्टर किया जाएगा? –
यदि वे पोर्ट सुरक्षा के लिए कॉन्फ़िगर किए गए हैं तो एक स्पूफ़ेड मैक स्विच द्वारा फ़िल्टर किया जा सकता है। मैक परत पर एसीएल हो सकता है, लेकिन आम तौर पर एमएसी को धोखा देने से आपको रोक नहीं है। आपको केवल यह सुनिश्चित करने की ज़रूरत है कि आपका नेटवर्क कार्ड इस स्पूफेड मैक के जवाब स्वीकार करेगा (मैक को स्वीकृत पैकेट की तालिका में जोड़कर या प्रोमीस्क मोड में डालकर)। यदि आप अधिकृत नहीं हैं तो ऐसा करना एक बुरा विचार है। – eckes