तो, यहाँ क्या आवश्यक है: वेब सर्वर पर कॉल का लॉग होता है, यह अपाचे या नगनेक्स (यह दोनों विकल्प प्रदान करना बेहतर है) से कोई फर्क नहीं पड़ता, यह ज्ञात है कि इस लॉग के पंजीकरण के दौरान सर्वर ddos हमले के तहत था। यह एक स्क्रिप्ट लिखने के लिए आवश्यक है कि जितनी जल्दी हो सके और जितना संभव हो उतनी सटीक रूप से उन्हें अवरुद्ध करने के लिए हमलावर नोड के पते निर्धारित करेगा।
यह समझा जाता है कि आपदा के लिए अवरुद्ध Google, एक बड़ी आपदा नहीं है। खोज इंजनों की सूची लेना और उचित संशोधन करना मुश्किल नहीं है।
बेशक, निर्धारित मापदंडों के आधार पर निर्धारण की सटीकता और गति, हमले की ताकत (आवधिकता, शामिल नोड्स की संख्या) के आधार पर भिन्न हो सकती है।
मैं एक समाधान संलग्न कर रहा हूं जो मैंने स्वयं समस्या की उपस्थिति के बाद लिखा था, उस समय जब यह विशेष रूप से "अधीर" था। समाधान काफी सरल और मोटा है, लेकिन एक ही समय में प्रभावी (20 सेकंड में लॉग के 80 मेगाबाइट)। यह वह स्क्रिप्ट थी जिसने 1,500 लोफर्स सर्वर पर टूटने पर एक परियोजना को एक हमले से बचाने में मदद की थी।
समय के साथ, यह स्पष्ट हो गया कि एक हमले में यातायात का मूल्यांकन करना अधिक सटीक है (अधिक विस्तृत और समय लेने वाला दृष्टिकोण, जो कोई भी अधिक बार आया - यह करता है): पैकेट की सामग्री, हेडर, लेकिन, फिर भी, अनुभव दिखाया गया है कि इस समस्या को हल करने में स्पष्टता देता है एक विशेषज्ञ के स्तर का एक विचार जो एक अनुभवी डेवलपर होने का दावा करता है और वेब प्रोग्रामिंग के क्षेत्र में "एक कुत्ते को खा जाता है"।
निर्णय एक घंटे से दो बार (किसी व्यक्ति के विचार के पाठ्यक्रम के आधार पर) को दिया गया था, पिछली बार इसे 1 मिनट 20 मिनट में हल किया गया था। कुल मिलाकर, लगभग 10% आवेदकों ने समस्या को हल किया।
अब हमारे पास एक और काम होगा।
स्रोत कोड: लॉग स्ट्रीम या फ़ाइल से पढ़ सकते हैं, यदि आवश्यक हो, तो फ़ायरवॉल पर अवरुद्ध नियम जोड़ें। नियमित अभिव्यक्तियों की अस्वीकृति उत्पादकता में उल्लेखनीय वृद्धि देती है। आकार में 500 मेगाबाइट तक की फ़ाइलों पर परीक्षण किया गया।
बेशक, यह सब मोती पर थोड़ा छोटा और सुंदर लिखा जा सकता है, लेकिन मैं php में समस्या का कुछ हल निकालना चाहता था।
#! / usr / स्थानीय / बिन / php <? php अगर (खाली ($ argv [1])) $ fname = $ argv [1]; $ $ fname = 'access.log'; $ fh = fopen ($ fname, 'r'); # $ fh = fopen ('php: // stdin', 'r'); $ timeLimit = 1; $ उलटी गिनती = 50; $ स्थिति = सरणी (); जबकि ($ स्ट्रिंग = फ़िज़ ($ fh)) { $ आईपी = पदार्थ ($ स्ट्रिंग, 0, स्ट्रैप्स ($ स्ट्रिंग, '')); अगर (खाली ($ स्थिति [$ ip] ['अवरुद्ध')) जारी है; $ st = strpos ($ string, '[') + 1; $ समय = स्ट्रेटोटाइम (पदार्थ ($ स्ट्रिंग, $ सेंट, स्ट्रैप्स ($ स्ट्रिंग, ']), $ सेंट + 1) - $ सेंट); $ st = strpos ($ string, '"') + 1; $ req = root ($ स्ट्रिंग, $ st, strpos ($ string, '"', $ st + 1) - $ st); $ st = strpos ($ req, "") + 1; $ doc = root ($ req, $ st, strpos ($ req, "", $ st) - $ st); $ dot = strrpos ($ doc, ""); $ डॉट = $ डॉट? strlen ($ doc) - $ dot: 0; अगर ($ डॉट !! $ डॉट> 5) { अगर (खाली ($ स्थिति [$ ip])) $ स्थिति [$ ip] = सरणी ('गिनती' => 0); अगर (खाली ($ स्थिति [$ ip] ['समय') && $ समय - $ स्थिति [$ ip] ['समय'] <= $ timeLimit) { $ स्थिति [$ ip] ['गिनती'] ++; अगर ($ स्थिति [$ ip] ['गिनती']> = $ countLimit) { इको "$ ip: $ doc \ n"; # सिस्टम ("ipfw तालिका 1 में $ ip जोड़ें"); #echo "$ ip \ n"; $ स्थिति [$ ip] ['अवरुद्ध'] = १; } } $ स्थिति [$ ip] ['समय'] = $ समय; $ स्थिति [$ ip] ['doc'] = $ doc; } } ?>