nginx: डीबगिंग के लिए HTTP अनुरोधों को डंप करें


17
  • उबंटू 10.04.2
  • nginx 0.7.65

मैं अपने nginx सर्वर पर आने वाले कुछ अजीब HTTP अनुरोध देखता हूं।

यह समझने के लिए कि क्या चल रहा है, मैं ऐसे प्रश्नों के लिए संपूर्ण HTTP अनुरोध डेटा को डंप करना चाहता हूं। (मैं सभी अनुरोध हेडर और शरीर को डंप करता हूं कहीं मैं उन्हें पढ़ सकता हूं।)

क्या मैं यह नगनेक्स के साथ कर सकता हूं? वैकल्पिक रूप से, क्या कुछ HTTP सर्वर है जो मुझे इसे बॉक्स से बाहर करने की अनुमति देता है, जिससे मैं इन अनुरोधों को nginx के माध्यम से प्रॉक्सी कर सकता हूं?

अद्यतन: ध्यान दें कि इस बॉक्स में सामान्य ट्रैफ़िक का एक गुच्छा है, और मैं निम्न स्तर पर सभी को कैप्चर करने (कहने, साथ tcpdump) और बाद में इसे फ़िल्टर करने से बचना चाहूंगा ।

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

और मैं नहीं चाहता कि फर्जी ट्रैफिक को किसी दूसरे बॉक्स में डाल दिया जाए ताकि वह वहां पर कब्जा कर सके tcpdump

अद्यतन 2: थोड़ा और अधिक विवरण देने के लिए, फर्जी अनुरोध fooमें उनके GET क्वेरी में पैरामीटर (नाम) का नाम (कहना) है (पैरामीटर का मान भिन्न हो सकता है)। अच्छे अनुरोधों की गारंटी है कि यह पैरामीटर कभी नहीं होगा।

अगर मैं इसके द्वारा tcpdumpया ngrepकिसी भी तरह से फ़िल्टर कर सकता हूँ - कोई समस्या नहीं है, तो मैं इनका उपयोग करूँगा।


क्या आप उन अनुरोधों को चिह्नित / वर्गीकृत कर सकते हैं जिन्हें आप "अजीब" मानते हैं? यदि आप हमारे साथ साझा नहीं करते हैं तो 'सामान्य' और 'फर्जी' क्या है?
होबोडेव

मैं एक नियम नहीं पूछता - मैं इसे आसानी से खुद लिख सकता हूं। मैं HTTP अनुरोध डेटा को डंप करने का साधन पूछता हूं।
अलेक्जेंडर ग्लैडीश

@hobodave: लेकिन वैसे भी, जब से आपने पूछा है, मैंने इस जानकारी को प्रश्न में जोड़ दिया है।
अलेक्जेंडर ग्लैडीश

जवाबों:


30

आवश्यकतानुसार पूर्व / पोस्ट लाइनों (-B और -A args) की संख्या को समायोजित करें:

tcpdump -n -S -s 0 -A 'tcp dst port 80' | grep -B3 -A10 "GET /url"

यह आपको एक बड़ी PCAP फ़ाइल उत्पन्न किए बिना, बॉक्स पर, आपके द्वारा इच्छित HTTP अनुरोध प्राप्त करने देता है, जिसे आपको कहीं और लोड करना होगा।

ध्यान रखें, बीपीएफ फ़िल्टर कभी भी सटीक नहीं होता है, अगर किसी भी बॉक्स के माध्यम से बड़ी संख्या में पैकेट बहते हैं, तो बीपीएफ पैकेट छोड़ देगा।


5

मुझे नहीं पता कि आपके अनुरोध का क्या मतलब है लेकिन आप डेटा का विश्लेषण करने के लिए tcpdump और / या वायरशार्क का उपयोग कर सकते हैं :

# tcpdump port 80 -s 0 -w capture.cap

और आप फ़ाइल खोलने और सर्वरों के बीच बातचीत देखने के लिए वायरशार्क का उपयोग कर सकते हैं।


धन्यवाद, लेकिन मेरे पास इस सर्वर पर काफी ट्रैफ़िक है (इसमें से 99% अच्छा है), और मुझे लगता है कि उस फर्जी 1% डेटा के लिए उस गुच्छा को फ़िल्टर करना मुश्किल होगा।
अलेक्जेंडर ग्लैडीश

... अगर मैं सभी को इतने निचले स्तर पर कब्जा कर लेता हूं। :-)
अलेक्जेंडर ग्लैडीश

मैंने उस प्रश्न को प्रतिबिंबित करने के लिए अद्यतन किया है।
अलेक्जेंडर ग्लैडीश

अलेक्जेंडर - अच्छी तरह से इसका मतलब है कि हर 100 अनुरोधों में से 1 में अजीब हेडर होंगे जिनकी आप तलाश कर रहे हैं। थोड़ी देर के लिए एक कब्जा चलाएं और फिर परिणामी लॉग के माध्यम से खोज करें जो आप चाहते हैं हेडर की तलाश करें - यह निश्चित रूप से एक असहनीय राशि नहीं है।
EEAA

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

0

यदि आप mod_php के साथ अपाचे के अनुरोधों को प्रॉक्सी करते हैं तो आप अनुरोधों को डंप करने के लिए निम्न PHP स्क्रिप्ट का उपयोग कर सकते हैं:

<?php
$pid = getmypid();
$now = date('M d H:i:s');
$fp = fopen('/tmp/intrusion.log', 'a');

if (!function_exists('getallheaders')) 
{ 
    function getallheaders() 
    { 
           $headers = ''; 
       foreach ($_SERVER as $name => $value) 
       { 
           if (substr($name, 0, 5) == 'HTTP_') 
           { 
               $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; 
           } 
       } 
       return $headers; 
    } 
} 

function ulog ($str) {
    global $pid, $now, $fp;
    fwrite($fp, "$now $pid {$_SERVER['REMOTE_ADDR']} $str\n");
}

foreach (getallheaders() as $h => $v) {
    ulog("H $h: $v");
}
foreach ($_GET as $h => $v) {
    ulog("G $h: $v");
}
foreach ($_POST as $h => $v) {
    ulog("P $h: $v");
}
fclose($fp);

ध्यान दें कि जब से आप nginx का उपयोग कर रहे हैं, तब तक $_SERVER['REMOTE_ADDR']यह बेकार हो सकता है। आपको अपाचे के माध्यम से असली आईपी पास करना होगा proxy_set_header X-Real-IP $remote_addr;, और आप इसके बजाय इसका उपयोग कर सकते हैं (या बस इसके माध्यम से लॉग किए जाने पर भरोसा कर सकते हैं getallheaders())।


धन्यवाद। लेकिन मेरे सर्वर पर PHP नहीं है। फिर भी यह विचार किसी भी अन्य HTTP- अवगत प्रोग्रामिंग लैगेज के लिए मान्य है। :-)
अलेक्जेंडर ग्लैडीश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.