मुझे अपने अपाचे लॉग में इस तरह दिखने वाले कई अनुरोध मिल रहे हैं
www.example.com:80 10.240.1.8 - - [06/Mar/2013:00:39:19 +0000] "-" 408 0 "-" "-" -
लगता है कोई अनुरोध नहीं है और कोई उपयोगकर्ता एजेंट नहीं है। क्या किसी ने इसे पहले कभी देखा है?
मुझे अपने अपाचे लॉग में इस तरह दिखने वाले कई अनुरोध मिल रहे हैं
www.example.com:80 10.240.1.8 - - [06/Mar/2013:00:39:19 +0000] "-" 408 0 "-" "-" -
लगता है कोई अनुरोध नहीं है और कोई उपयोगकर्ता एजेंट नहीं है। क्या किसी ने इसे पहले कभी देखा है?
जवाबों:
क्या आप किसी भी तरह से अपने वेब सर्वर को अमेज़न पर एक इलास्टिक लोड बैलेंसर के पीछे चला रहे हैं?
ऐसा लगता है कि वे अपने स्वास्थ्य की जाँच के कारण 408 प्रतिक्रियाएँ उत्पन्न करते हैं ।
उस फोरम थ्रेड से कुछ समाधान:
RequestReadTimeout header=0 body=0
यह 408 प्रतिक्रियाओं को निष्क्रिय कर देता है अगर कोई अनुरोध बार करता है।
ELB IP पते के लिए लॉगिंग को अक्षम करें:
SetEnvIf Remote_Addr "10\.0\.0\.5" exclude_from_log
CustomLog logs/access_log common env=!exclude_from_log
और इस ब्लॉग पोस्ट से :
RequestReadTimeout header=0 body=0
सभी एक साथ टाइमआउट पढ़ने के लिए अनुरोध को अक्षम करेगा, मैं यह सलाह नहीं
कुछ पोर्ट से कनेक्ट हो रहा है और फिर कभी डेटा नहीं भेज रहा है। HTTP 408 एक "टाइमआउट" त्रुटि है। यहाँ एक अच्छा राइटअप है: http://www.checkupdown.com/status/E408.html
यहां पहले से ही कुछ अच्छे उत्तर हैं, लेकिन मैं एक अतिरिक्त नोट को खतरे में डालना चाहूंगा जिसे विशेष रूप से संबोधित नहीं किया गया है। पहले से उल्लेख किए गए पिछले टिप्पणीकारों में से कई, 408 एक समयबाह्य इंगित करता है; और ऐसी बहुत सारी परिस्थितियाँ हैं जिनमें किसी वेब सर्वर पर टाइमआउट होता है।
उस के साथ, विभिन्न प्रकार के मामलों में 408 त्रुटियां उत्पन्न हो सकती हैं, जहां आपके सर्वर को कारनामों के लिए स्कैन किया जा रहा है। ऐसे मामलों में ग्राहक शायद ही कभी एक उपयोगकर्ता एजेंट को पेश करते हैं और अक्सर कनेक्शन को अचानक समाप्त कर देते हैं, जिसके परिणामस्वरूप उस कनेक्शन के लिए गर्भपात बंद हो जाता है जो 408 त्रुटि उत्पन्न कर सकता है।
उदाहरण के लिए, मान लें कि मैं एक खतरनाक हैकर हूं, जो उन कंप्यूटरों के लिए इंटरनेट को स्कैन कर रहा है जो अभी भी POODLE भेद्यता के लिए असुरक्षित हैं। जैसे, मैंने एक स्क्रिप्ट लिखी है जो सर्वरों को खोजने के लिए आईपी पतों के बड़े हिस्से के लिए कनेक्शन खोलता है जो एसएसएल संस्करण 3 को स्वीकार करेगा - बाद में मैं उस सूची का उपयोग विशेष रूप से अच्छे कारनामे को स्कैन करने के लिए करूंगा। यह पहली स्क्रिप्ट जो SSLv3 की जाँच करने के लिए Opensl का उपयोग करके एक कनेक्शन स्थापित करती है, जैसे:
openssl s_client -connect [IP]:443 -ssl3
यह आदेश, अपाचे के कई विन्यासों में, 408 संदेश में परिणाम देगा जैसा आपने वर्णित किया है। मेरे दो सर्वरों पर इस कमांड को करने से एक्सेस लॉग में प्रवेश होता है:
<remote IP address> - - [04/Nov/2015:08:09:33 -0500] "-" 408 - "-" "-"
मैं यह भी स्पष्ट करना चाहता था कि ऐसी स्थिति में भी जब ओपी किसी भी प्रकार के लोड संतुलन का उपयोग नहीं कर रहा था, 408 त्रुटियां विभिन्न प्रकार की परिस्थितियों में हो सकती हैं - कुछ दुर्भावनापूर्ण, कुछ क्लाइंट के साथ परेशानी, और कुछ सर्वर के साथ परेशानी का संकेत दे रही हैं। (मैंने ओपी द्वारा प्रदान किए गए लॉग में देखा कि एक स्थानीय आईपी को रिमोट आईपी के रूप में इंगित किया गया था, लेकिन ओपी ने विशेष रूप से लोड बैलेंसर के उपयोग का उल्लेख नहीं किया था, इसलिए मुझे यकीन नहीं था कि ओपी ने प्रयोजनों के लिए बस एक गैर-परिवर्तनीय आईपी का उपयोग किया था प्रदर्शन का, जैसा कि उन्होंने यूआरएल के साथ किया था)
वैसे भी, भले ही मेरी पोस्ट अगर जाहिर तौर पर ओपी की मदद करने के लिए दिन में बहुत देर हो जाती है, तो यह उन अन्य लोगों की मदद कर सकता है जो उन सभी समयबद्ध त्रुटियों के समाधान की तलाश में यहां पहुंचते हैं।
408 टाइमआउट के विभिन्न कारण हैं। लेकिन एक आधार से शुरू करते हैं कि सब कुछ ठीक है तो किसी समय ये 408 की शुरुआत आपके एक्सेस लॉग में दिखाई दे रही है - यानी 408 0 "-" "-"।
नेट पर कई बिंदुओं की तरह, एक 408 एक कनेक्शन का प्रतिनिधित्व करता है, लेकिन उचित समय के पैमाने में कोई अनुरोध नहीं भेजा जाता है, इसलिए सर्वर 408 के साथ कनेक्शन को छोड़ देता है। एक अभिमानी व्यक्ति ने वास्तव में किसी से इस मुद्दे पर मदद के लिए जवाब दिया - "टाइमआउट का कौन सा हिस्सा आपको समझ नहीं आ रहा है"।
मुझे लगता है कि यह बहुत ही नौसिखिया उत्तर है और वेब-सर्वर सॉफ्टवेयर के साथ कुछ सुरक्षा तरीकों को कैसे काम करता है, यह समझने की कुल कमी दर्शाता है।
तो शुरुआत में, मैं इन 408 को क्यों देख रहा हूं। एक चीज जो हम में से बाकी लोगों के पास होती है, वह यह है कि एक सर्वर को प्रबंधित करना एक बड़ी मात्रा में हमला है जो आपको दैनिक आधार पर प्राप्त होता है। अब, आप इन के बारे में क्या करते हैं? ठीक है: आप उनसे निपटने के लिए अपने चुने हुए सुरक्षा तरीकों को नियुक्त करते हैं, यही बदलाव है।
आइए एक बहुत ही आसान उदाहरण लेते हैं, एक आईपी एड्रेस ड्रॉप करें। एक iptabes फ़ाइल (नियमों.v4) में शामिल है "आपके पास"-ufw-user-input -s 37.58.64.228 -j DROP "है। तो 37.58.64.228 के साथ फ़ायरवॉल आईपी को पहचानता है और कनेक्शन को छोड़ देता है। बहुत सारे कॉन्फ़िगरेशन में आपको पता भी नहीं होगा कि यह दरवाजे पर दस्तक दे चुका है।
अब एक और अधिक उन्नत उदाहरण लेने देता है, कुछ मानदंडों के आधार पर कनेक्शन को छोड़ें। एक iptabes फ़ाइल (rules.v4) में शामिल है "आपके पास" -एक INPUT -p tcp -m tcp --dport 80 -m string --string "cgi" --algo bm --to 1000 -j AROP "। यह अलग है क्योंकि इस iptable रूल में हम कह रहे हैं कि रिक्वेस्ट स्ट्रिंग के पहले 1000 बाइट्स देखें और देखें कि क्या आप "cgi" का सब-स्ट्रिंग पा सकते हैं और यदि आप उस सब-स्ट्रिंग को ढूंढते हैं तो किसी भी तरह से न जाएं इसके अलावा, बस कनेक्शन छोड़ दें।
यहाँ सुरक्षा विधि अच्छी है, लेकिन जहाँ तक आपके लॉग भ्रामक संबंध हैं। 408 0 "-" "-" उत्पन्न सबसे अच्छा अपाचे इन परिस्थितियों में कर सकता है। कनेक्शन बनाया गया था और स्ट्रिंग तुलना नियम को लागू करने के लिए अनुरोध को एक बिंदु तक स्वीकार किया जाना था, जो अंततः 408 में परिणाम देता है क्योंकि आपके नियम ने कनेक्शन को छोड़ने के लिए मानदंडों को पूरा किया। इसलिए, हमारे छोटे नौसिखिए डार्लिंग अधिक गलत नहीं हो सकते यदि वे कोशिश करते हैं। एक कनेक्शन बनाया गया था और एक अनुरोध प्राप्त हुआ था (आपको इन परिस्थितियों में इसकी दृश्यता नहीं होगी)। हालांकि एक 408 उत्पन्न होता है, यह 'टाइमआउट' नहीं है; आपके सर्वर ने आपके फ़ायरवॉल नियम के साथ अनुरोध किए जाने के बाद बस कनेक्शन को छोड़ दिया। कई अन्य नियम हैं, जो समान 408 स्थिति पैदा करेंगे। डॉन'
आदर्श रूप से एक और अपाचे जनरेट किया हुआ एरर कोड होगा, उदाहरण के लिए - '499' जिसका मतलब होगा 'सर्वर रीड योर रिक्वेस्ट एंड डिसाइड इट जस्ट बॉनट बी बीटर्ड एन एंटरटेनिंग यू - सोद ऑफ हाहा'।
नवीनतम वेब-सर्वर सॉफ्टवेयर के साथ आप व्यावहारिक रूप से डॉस हमलों को बाहर कर सकते हैं और भविष्यवाणियों को शामिल करने वाले ब्राउज़रों के नए जीन इस समस्या का कारण नहीं बन सकते हैं जैसा कि कुछ ने सुझाव दिया है।
संक्षेप में, 408 जेनरेट होता है क्योंकि सर्वर ने रिक्वेस्ट का जवाब नहीं दिया है, इसलिए जहां तक क्लाइंट का संबंध है समय समाप्त हो गया है, जब वास्तव में सर्वर ने रिक्वेस्ट पढ़ी थी, लेकिन टाइमआउट के इंतजार के अलावा अन्य कारणों से कनेक्शन को छोड़ दिया गया था एक दरख्वास्त।
हमारे पास यह बहुत समस्या थी, और काफी समय से इस पर हैरान था। सबसे अच्छा समाधान जो हम साथ आए थे, वह एडब्ल्यूएस समर्थन की ईएलबी टीम द्वारा सुझाया गया था। यह अनिवार्य रूप से यह सुनिश्चित करने पर टिका है कि आपके httpd सर्वर की टाइमआउट सेटिंग्स आपकी ELB idle timeout
सेटिंग (जो कि 60 वर्ष से अधिक की चूक) से अधिक हैं।
Timeout
निर्देश मूल्य idle timeout
आपके ईएलबी की सेटिंग से दोगुना है ।KeepAlive
सुविधा चालू करें , यह सुनिश्चित करें कि MaxKeepAliveRequests
बहुत बड़ी है (या तो अनंत के लिए या बहुत अधिक है, 2000 की तरह), और वह KeepAliveTimeout
आपके ELS की तुलना में अधिक है idle timeout
।हमने पाया कि KeepAlive
(और संबद्ध सेटिंग्स) सेटिंग ने विशेष रूप से 0 तक प्रभावी रूप से 408 की मात्रा कम कर दी है (हम कुछ देखते हैं, लेकिन बहुत कम)।
मेरे पास AWS इलास्टिक लोड बैलेंसर के पीछे यह मुद्दा था। स्वास्थ्य जांच ने लॉग में 408 प्रतिक्रियाओं की एक भयानक मात्रा उत्पन्न की।
एकमात्र समाधान है कि मेरे लिए काम किया है करने के लिए था लोड बैलेंसर के निष्क्रिय समय समाप्त की स्थापना कम अपने से स्वास्थ्य जाँच के रिस्पांस समय समाप्त ।
एक सहकर्मी ने हाल ही में टिप्पणी की कि जब मेरी पिछली पोस्ट ने एक वैध विवरण दिया कि एक सुरक्षा उपाय के साथ 408 का जुड़ाव कैसे हो सकता है, तो इसने कोई समाधान नहीं दिया।
पाइप्ड एक्सेस लॉग मेरा व्यक्तिगत समाधान है।
निम्नलिखित को अधिकांश उबंटू विन्यासों पर आउट-ऑफ-द-बॉक्स काम करना चाहिए, और अन्य अपाचे कॉन्फ़िगरेशन पर न्यूनतम टिंकरिंग के साथ। मैंने PHP को चुना है क्योंकि यह समझना सबसे आसान है। दो स्क्रिप्ट हैं: पहला आपके एक्सेस लॉग पर लिखे गए 408 को रोकता है। दूसरी स्क्रिप्ट सभी 408s को एक अलग लॉग फ़ाइल में भेजती है। किसी भी तरह से परिणाम आपके पहुंच लॉग में 408s नहीं है। यह आपकी पसंद है कि किस स्क्रिप्ट को लागू करना है।
अपने पसंदीदा टेक्स्ट एडिटर का उपयोग करें, मैं नैनो का उपयोग करता हूं। उस फ़ाइल को खोलें जहाँ आपके पास 'LogFormat' और 'CustomLog' निर्देश हैं। सामान्य # के साथ मूल-टिप्पणी करें और निम्नलिखित जोड़ें। आपको नीचे दिए गए फ़ाइल में ये निर्देश मिल सकते हैं।
sudo नैनो / etc / apache2 / साइट्स-उपलब्ध / डिफ़ॉल्ट
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" AccessLogPipe
CustomLog "|/var/log/apache2/PipedAccessLog.php" AccessLogPipe env=!dontlog
नोट: मैं अपने एक्सेस लॉग में छवियों को लॉग नहीं करता। मेरे etc / apache2 / httpd.conf फ़ाइल में मैं लाइन शामिल करता हूँ
SetEnvIfNoCase Request_URI ".(gif)|(jpg)|(png)|(css)|(js)|(ico)$" dontlog
यदि यह आपके लिए कोई दिलचस्पी नहीं है, तो निर्देश env=!dontlog
से हटा दें CustomLog
।
अब निम्नलिखित PHP लिपियों में से एक बनाएं ( #!/usr/bin/php
दुभाषिया के स्थान का एक संदर्भ है, सुनिश्चित करें कि स्थान आपके सिस्टम के लिए सही है - आप इसे $ प्रांप्ट पर लिखकर कर सकते हैं; whereis php
- इसे कुछ इस तरह वापस करना चाहिए php: /usr/bin/php /usr/bin/X11/php /usr/share/man/man1/php.1.gz
। देख सकते हैं #!/usr/bin/php
मेरे सेटअप के लिए सही है)।
सुडो नैनो / सवर / लौकी / पचे 2/PededAccessLog.php
#!/usr/bin/php
<?php
$file = '/var/log/apache2/access.log';
$no408 = '"-" 408 0 "-" "-"';
$stdin = fopen ('php://stdin', 'r');
ob_implicit_flush (true);
while ($line = fgets ($stdin)) {
if($line != "") {
if(stristr($line,$no408,true) == "") {
file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
}
}
}
?>
सुडो नैनो / सवर / लौकी / पचे 2/PededAccessLog.php
#!/usr/bin/php
<?php
$file = '/var/log/apache2/access.log';
$file408 = '/var/log/apache2/408.log';
$no408 = '"-" 408 0 "-" "-"';
$stdin = fopen ('php://stdin', 'r');
ob_implicit_flush (true);
while ($line = fgets ($stdin)) {
if($line != "") {
if(stristr($line,$no408,true) != "") {
file_put_contents($file408, $line, FILE_APPEND | LOCK_EX);
}
else {
file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
}
}
}
?>
PipedAccessLog.php
स्क्रिप्ट को सहेजने के बाद ; सुनिश्चित करें कि $ प्रांप्ट पर निम्नलिखित को निष्पादित करके रूट का स्वामित्व है।
sudo chown -R root:adm /var/log/apache2/PipedAccessLog.php
PipedAccessLog.php
स्क्रिप्ट पढ़ी की आवश्यकता होगी / लिखने और निष्पादित अनुमतियाँ तो $ प्रॉम्प्ट पर निम्नलिखित निष्पादित।
sudo chmod 755 /var/log/apache2/PipedAccessLog.php
अंत में काम करने के लिए आपको अपाचे सेवा को पुनः आरंभ करने की आवश्यकता है। $ प्रांप्ट पर निम्नलिखित को निष्पादित करें।
sudo service apache2 restart
यदि आपके अपाचे लॉग कहीं और स्थित हैं तो अपने कॉन्फ़िगरेशन के अनुरूप पथ बदलें। शुभ लाभ।
मैंने पाया है कि संख्या और आवृत्ति दोनों में 408 त्रुटियां बढ़ रही हैं। उनके द्वारा उत्पन्न किए जाने वाले IP पतों की सीमा भी बढ़ रही है (ये अपनी अलग फ़ाइल में लॉग इन हैं)। आईपी के समान समूहों से लगातार 408 प्रदर्शित होने वाले स्पष्ट लॉग पैटर्न भी हैं जो सामान्य सर्वर टाइमआउट के कारण नहीं हैं, जिसमें प्रवर्तक एक चक्रीय पैटर्न में 2 या 3 सेकंड के अलावा कनेक्शन का प्रयास कर रहा है (एक दूसरे से पहले टाइमआउट की प्रतीक्षा नहीं है कनेक्शन प्रयास) मैं इन्हें साधारण DDOS शैली कनेक्शन प्रयासों के रूप में देखता हूं। मेरी राय में, ये प्रवर्तक के लिए एक प्रकार का पुष्टिकरण संदेश है कि एक सर्वर ऑनलाइन है ... फिर वे बाद में विभिन्न उपकरणों के साथ वापस आते हैं .... यदि आप अपना टाइमआउट अंतराल बढ़ाते हैं, तो आप बस उन्हें चलाने के लिए एक बड़ा time_allocation दे रहे हैं उनके हैक कार्यक्रमों के भीतर।