nginx: ডিবাগিংয়ের জন্য ডাম্প HTTP অনুরোধ


17
  • উবুন্টু 10.04.2
  • nginx 0.7.65

আমি দেখতে পাচ্ছি কিছু অদ্ভুত HTTP অনুরোধগুলি আমার এনগিনেক্স সার্ভারে আসছে।

কী চলছে তা আরও ভালভাবে বুঝতে, আমি এই জাতীয় প্রশ্নের জন্য সম্পূর্ণ এইচটিটিপি অনুরোধ ডেটা ডাম্প করতে চাই। (আমি সমস্ত অনুরোধ শিরোনাম এবং বডি কোথাও আমি সেগুলি পড়তে পারি dump

আমি কি এনজিনেক্স দিয়ে এটি করতে পারি? বিকল্পভাবে, এমন কোনও এইচটিটিপি সার্ভার রয়েছে যা আমাকে এই বাক্সটি বাইরে বের করে দেওয়ার অনুমতি দেয়, যার সাথে আমি এনজিঞ্জের মাধ্যমে এই অনুরোধগুলি প্রক্সি করতে পারি?

আপডেট: নোট করুন যে এই বাক্সটিতে প্রচুর ট্রাফিক রয়েছে এবং আমি এগুলি সমস্ত নিম্ন স্তরে ক্যাপচার (বলতে বলি tcpdump) এবং এটিকে পরে ফিল্টার করে এড়াতে চাই ।

আমি মনে করি প্রথমে পুনর্লিখনের নিয়মে ভাল ট্র্যাফিক ফিল্টার করা আরও সহজ হবে (ভাগ্যক্রমে আমি এক্ষেত্রে খুব সহজেই একটি লিখতে পারি), এবং তারপরে কেবল বোগাস ট্র্যাফিকের সাথে মোকাবিলা করব।

এবং আমি এটির সাথে এটি ক্যাপচার করতে সক্ষম হওয়ার জন্য বোগাস ট্র্যাফিকটিকে অন্য বাক্সে চ্যানেল করতে চাই না tcpdump

আপডেট 2: একটি বিট আরো বিস্তারিত জানার দিতে, বাজে অনুরোধ (বলুন) নামক প্যারামিটার আছে fooতাদের তাহলে GET ক্যোয়ারীতে (প্যারামিটারের মান পৃথক হতে পারে)। ভাল অনুরোধগুলি এই প্যারামিটারটি কখনও না রাখার গ্যারান্টিযুক্ত।

যদি আমি এটির মাধ্যমে tcpdumpবা ngrepকোনওভাবে এটির মাধ্যমে ফিল্টার করতে পারি - সমস্যা নেই, আমি এগুলি ব্যবহার করব।


আপনি যে "অনুরোধগুলি" বিবেচনা করছেন তা আপনি কী বৈশিষ্ট্যযুক্ত / শ্রেণিবদ্ধ করতে পারেন? আপনি যদি আমাদের সাথে 'সাধারণ' এবং 'বোগাস' কী তা ভাগ না করেন তবে কীভাবে কেউ আপনাকে সাহায্য করার জন্য একটি বিধি নিয়ে আসতে পারে?
হোবডেভ

আমি কোনও নিয়ম চাই না - আমি নিজেই এটি সহজে লিখতে পারি। আমি HTTP অনুরোধ ডেটা ডাম্প করার উপায় জিজ্ঞাসা করি।
আলেকজান্ডার গ্ল্যাডিশ

@ হোবোডাভ: তবে যাইহোক, যেহেতু আপনি জিজ্ঞাসা করেছেন, আমি এই তথ্যটিকে প্রশ্নের সাথে যুক্ত করেছি।
আলেকজান্ডার গ্ল্যাডিশ

উত্তর:


30

প্রয়োজনীয় হিসাবে পূর্ব / পোস্ট লাইনগুলির সংখ্যা (-বি এবং -এ আরোগুলি) সামঞ্জস্য করুন:

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

এটি আপনাকে অন্য কোনও জায়গায় অফলোড করতে হবে এমন একটি বিশাল পিসিএপি ফাইল তৈরি না করেই বক্সে, আপনি চান এইচটিটিপি অনুরোধগুলি পেতে দেয়।

মনে রাখবেন, বিপিএফ ফিল্টারটি কখনই নির্ভুল হয় না, যদি কোনও বাক্সের মধ্য দিয়ে প্রচুর সংখ্যক প্যাকেট প্রবাহিত হয়, বিপিএফ প্যাকেট ছাড়তে পারে এবং ছাড়তে পারে।


5

অনুরোধটি ডাম্প করার সাথে আপনি কী বুঝছেন তা আমি ঠিক জানি না তবে আপনি ডেটা বিশ্লেষণ করতে tcpdump এবং / অথবা ওয়্যারশার্ক ব্যবহার করতে পারেন :

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

এবং আপনি ফাইলটি খুলতে এবং সার্ভারের মধ্যে কথোপকথনটি দেখতে ওয়্যারশার্ক ব্যবহার করতে পারেন।


ধন্যবাদ, তবে এই সার্ভারে আমার বেশ খানিকটা ট্র্যাফিক রয়েছে (এর 99% ভাল), এবং আমার মনে হয় যে 1% বোগাসের দরকার আমার সেই বগাসের ডেটা গুচ্ছ করে ফিল্টার করা শক্ত হবে।
আলেকজান্ডার গ্ল্যাডিশ

... আমি যদি এগুলি সমস্ত নিম্ন স্তরে ক্যাপচার করি। :-)
আলেকজান্ডার গ্ল্যাডিশ

আমি প্রতিফলিত করতে প্রশ্ন আপডেট করেছি।
আলেকজান্ডার গ্ল্যাডিশ

আলেকজান্ডার - ভাল এর অর্থ হ'ল প্রতি 100 টি অনুরোধের মধ্যে 1 টিতে আপনি যে অদ্ভুত শিরোনাম খুঁজছেন তা থাকবে। কিছু সময়ের জন্য ক্যাপচার চালান এবং তারপরে ফলাফলগুলি লগের মাধ্যমে অনুসন্ধান করুন যে শিরোনামগুলি আপনি চান - এটি অবশ্যই কোনও অসহনীয় পরিমাণের কাজ নয়।
EEAA

সমস্যাটি কাজ নয়, প্রক্রিয়া করার জন্য ডেটা পরিমাণ। (এটি যদিও
বহনযোগ্য

0

যদি আপনি মোড_এফপি ইনস্টল করে অ্যাপাচে অনুরোধগুলি প্রক্সি করে থাকেন তবে অনুরোধগুলি ডাম্প করতে আপনি নীচের পিএইচপি স্ক্রিপ্টটি ব্যবহার করতে পারেন:

<?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);

মনে রাখবেন যে আপনি যেহেতু এনগিনেক্স ব্যবহার করছেন $_SERVER['REMOTE_ADDR']এটি অর্থহীন হতে পারে। আপনাকে অ্যাপাচি এর মাধ্যমে আসল আইপিটি পাস করতে হবে proxy_set_header X-Real-IP $remote_addr;এবং আপনি এটি ব্যবহার করতে পারেন (বা কেবল এটির মাধ্যমে লগ হওয়ার উপর নির্ভর করতে পারেন getallheaders())।


ধন্যবাদ. তবে আমার সার্ভারগুলিতে আমার পিএইচপি নেই। তবুও এই ধারণাটি অন্য কোনও http-সচেতন প্রোগ্রামিং ল্যাগুয়েজের জন্য বৈধ। :-)
আলেকজান্ডার গ্ল্যাডিশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.