Я вижу странные 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()
).