nginx: Hata ayıklama için HTTP isteklerini döküm


17
  • Ubuntu 10.04.2
  • nginx 0.7.65

Nginx sunucuma bazı garip HTTP istekleri geliyor.

Neler olup bittiğini daha iyi anlamak için, bu tür sorgular için tüm HTTP istek verilerini dökümü istiyorum. (Ben tüm istek üstbilgileri ve vücut onları okuyabilir bir yere dökümü.)

Bunu nginx ile yapabilir miyim? Alternatif olarak, bu istekleri nginx aracılığıyla proxy yapabileceğim kutudan çıkarmama izin veren bazı HTTP sunucusu var mı?

Güncelleme: Bu kutunun bir sürü normal trafiği olduğunu ve bunların tümünü düşük düzeyde (örneğin, ile tcpdump) yakalayıp daha sonra filtrelemekten kaçınmak istiyorum .

Bence bir yeniden yazma kuralında iyi trafiği filtrelemek çok daha kolay olurdu (neyse ki bu durumda oldukça kolay bir tane yazabilirim) ve sonra sadece sahte trafik ile başa çıkmak.

Ve sadece orada yakalamak için sahte trafik başka bir kutuya kanalize etmek istemiyorum tcpdump.

Güncelleme 2: Biraz daha fazla ayrıntı vermek için, sahte istek fooGET sorgularında (parametrenin değeri değişebilir) adında (say) parametresine sahiptir. İyi taleplerin bu parametreye sahip olmaması garanti edilir.

Buna göre filtreleyebilirsem tcpdumpveya bir ngrepşekilde - sorun olmazsa, bunları kullanacağım.


"Tuhaf" olduğunu düşündüğünüz talepleri karakterize edebilir / sınıflandırabilir misiniz? Bizimle paylaşmazsanız, 'normal' ve 'sahte' olanı size nasıl yardımcı olacak bir kural ortaya çıkabilir?
hobodave

Kural istemiyorum - kolayca kendim yazabilirim. HTTP istek verilerini dökümü için araçlar istiyorum.
Alexander Gladysh

@hobodave: ama yine de, sorduğunuzdan beri, bu bilgiyi soruya ekledim.
Alexander Gladysh

Yanıtlar:


30

Ön / son satır sayısını (-B ve -A bağımsız değişkenleri) gerektiği gibi ayarlayın:

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

Bu, başka bir yere boşaltmanız gereken büyük bir PCAP dosyası oluşturmadan, istediğiniz HTTP isteklerini kutuda almanızı sağlar.

BPF filtresinin hiçbir zaman kesin olmadığını, herhangi bir kutudan akan çok sayıda paket varsa, BPF'nin paketleri bırakabileceğini ve bırakacağını unutmayın.


5

İsteği dökümü ile ne demek istediğini tam olarak bilmiyorum ama verileri analiz etmek için tcpdump ve / veya wireshark kullanabilirsiniz:

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

Ve dosyayı açmak ve sunucular arasındaki sohbeti görmek için wireshark kullanabilirsiniz.


Teşekkürler, ancak bu sunucuda oldukça fazla trafik var (% 99'u iyi) ve bu sahte veriye ihtiyacım olan% 1 veriyi filtrelemenin zor olacağını düşünüyorum.
Alexander Gladysh

... hepsini bu kadar düşük seviyede yakalarsam. :-)
Alexander Gladysh

Soruyu bunu yansıtacak şekilde güncelledim.
Alexander Gladysh

Alexander - bu, her 100 talepten 1'inde aradığınız tuhaf üstbilgilere sahip olacağı anlamına gelir. Bir süre bir yakalama gerçekleştirin ve sonuçta istediğiniz başlıkları aramak için elde edilen günlükte arama yapın - bu kesinlikle dayanılmaz bir iş değildir.
EEAA

Sorun iş değil, işlenecek veri miktarıdır. (Yine de katlanılabilir olabilir, ama her neyse, daha dostane bir çözüm görmek istiyorum.)
Alexander Gladysh

0

Mod_php yüklü Apache isteklerini proxy yaparsanız, istekleri dökmek için aşağıdaki PHP komut dosyasını kullanabilirsiniz:

<?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 kullandığınız için $_SERVER['REMOTE_ADDR']bunun anlamsız olabileceğini unutmayın. Gerçek IP'yi Apache'ye üzerinden geçirmeniz gerekir proxy_set_header X-Real-IP $remote_addr;ve bunun yerine bunu kullanabilirsiniz (veya sadece oturum açtığınıza güvenebilirsiniz getallheaders()).


Teşekkür ederim. Ama sunucularımda PHP yok. Yine de bu fikir http farkında olan diğer programlama dilleri için de geçerlidir. :-)
Alexander Gladysh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.