nginx: copia solicitações HTTP para depuração

15
  • Ubuntu 10.04.2
  • nginx 0.7.65

Eu vejo alguns pedidos HTTP estranhos chegando ao meu servidor nginx.

Para entender melhor o que está acontecendo, quero despejar dados inteiros de solicitações HTTP para essas consultas. (Por exemplo, despejo todos os cabeçalhos de pedidos e o corpo em algum lugar que eu possa lê-los.)

Posso fazer isso com o nginx? Alternativamente, existe algum servidor HTTP que me permite fazer isso fora da caixa, para o qual eu posso fazer proxy dessas solicitações por meio do nginx?

Atualização: Note que esta caixa tem um monte de tráfego normal, e eu gostaria de evitar capturar tudo em baixo nível (digamos, com tcpdump ) e filtrá-lo depois.

Eu acho que seria muito mais fácil filtrar o tráfego bom primeiro em uma regra de reescrita (felizmente eu posso escrever um facilmente neste caso), e então lidar apenas com tráfego falso.

E eu não quero canalizar tráfego falso para outra caixa apenas para poder capturá-lo com tcpdump .

Atualização 2: Para dar um pouco mais de detalhes, a solicitação falsa tem o parâmetro chamado (digamos) foo em sua consulta GET (o valor do parâmetro pode ser diferente). Boas solicitações são garantidas para não ter este parâmetro nunca.

Se eu puder filtrar por isso em tcpdump ou ngrep de alguma forma - não há problema, vou usá-los.

    
por Alexander Gladysh 13.03.2011 / 02:05

3 respostas

26

Ajuste o número de linhas pré / pós (-B e -A args) conforme necessário:

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

Isso permite que você obtenha as solicitações HTTP que você quer, na caixa, sem gerar um arquivo PCAP enorme que você precise descarregar em outro lugar.

Tenha em mente que o filtro BPF nunca é exato, se houver um grande número de pacotes fluindo através de qualquer caixa, o BPF pode e irá descartar pacotes.

    
por 13.03.2011 / 16:12
5

Eu não sei exatamente o que você quer dizer com o despejo da solicitação, mas você pode usar o tcpdump e / ou wireshark para analisar os dados :

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

E você pode usar o wireshark para abrir o arquivo e ver a conversa entre os servidores.

    
por 13.03.2011 / 02:16
0

Se você fizer proxy das requisições para o Apache com o mod_php instalado, você pode usar o seguinte script PHP para descarregar as requisições:

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

Observe que, como você está usando o nginx, o $_SERVER['REMOTE_ADDR'] pode ser inútil. Você terá que passar o IP real para o Apache via proxy_set_header X-Real-IP $remote_addr; , e você pode usá-lo em vez disso (ou apenas confiar que ele está logado via getallheaders() ).

    
por 13.03.2011 / 20:30