Назад | Перейти на главную страницу

nginx: дамп HTTP-запросов для отладки

Я вижу странные HTTP-запросы, поступающие на мой сервер nginx.

Чтобы лучше понять, что происходит, я хочу выгрузить полные данные HTTP-запроса для таких запросов. (То есть дамп всех заголовков и тела запроса где-нибудь, где я могу их прочитать.)

Могу ли я сделать это с помощью nginx? В качестве альтернативы, есть ли какой-то HTTP-сервер, который позволяет мне делать это из коробки, на который я могу проксировать эти запросы с помощью nginx?

Обновить: Обратите внимание, что в этом блоке есть много обычного трафика, и я бы хотел избежать захвата всего этого на низком уровне (скажем, с tcpdump) и отфильтровывая его позже.

Я думаю, что было бы намного проще сначала фильтровать хороший трафик в правиле перезаписи (к счастью, в этом случае я могу написать его довольно легко), а затем иметь дело только с фиктивным трафиком.

И я не хочу направлять фальшивый трафик в другой ящик, чтобы иметь возможность перехватить его там с помощью tcpdump.

Обновление 2: Чтобы дать немного больше информации, у фиктивного запроса есть параметр с именем (скажем) foo в их запросе GET (значение параметра может отличаться). Гарантируется, что у хороших запросов этот параметр никогда не будет.

Если я могу отфильтровать это в tcpdump или ngrep как-то - без проблем, я воспользуюсь этим.

При необходимости измените количество строк до / после (аргументы -B и -A):

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

Это позволяет вам получать нужные HTTP-запросы прямо в коробке, не создавая огромного файла PCAP, который вам нужно выгрузить в другое место.

Имейте в виду, что фильтр BPF никогда не бывает точным, если через какой-либо ящик проходит большое количество пакетов, BPF может отбрасывать пакеты.

Я не знаю точно, что вы имеете в виду под dump запросом, но вы можете использовать tcpdump и / или WireShark для анализа данных:

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

И вы можете использовать wirehark, чтобы открыть файл и увидеть диалог между серверами.

Если вы проксируете запросы к Apache с установленным 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'] может быть бессмысленным. Вам нужно будет передать настоящий IP-адрес в Apache через proxy_set_header X-Real-IP $remote_addr;, и вы можете использовать это вместо этого (или просто положиться на его регистрацию через getallheaders()).