Использование инструментов командной строки для фильтрации и соответствия критериям потока пакетов

У меня есть файл pcap с 8 миллионами пакетов, который я сократил до файла txt всего с тремя полями: время (в секундах), IP-адрес источника, тип (трафика).

Мне нужно извлечь из этого файла из 8 миллионов строк только те IP-адреса, которые имеют 100 или более пакетов, исключив те адреса, которые не соответствуют критериям в 100 или более пакетов, уменьшив размер файла.

Но мне нужно сохранить все 3 поля и все пакеты в потоке остальных адресов (более 100 пакетов) в сокращенном текстовом файле, потому что мне нужно рассчитать продолжительность потока пакетов для каждого исходного IP-адреса (время окончания потока - время начала потока) и оставить только те IP-адреса источника, продолжительность потока которых составляет 60 секунд и более, тем самым еще больше уменьшив мой файл.

Когда я использовал инструменты командной строки для выполнения первого критерия (100 пакетов и более), я устранял весь поток пакетов для этих адресов. Как я могу достичь этих двух условий с помощью инструментов командной строки, чтобы иметь возможность автоматизировать процесс с помощью сценария bash? Ниже приведен пример моего файла, к которому мне нужно применить два критерия. Большое спасибо за Вашу помощь!

1385957611.118522 99.61.34.145 TCP 1385957859.425248 99.61.34.145 TCP 1385958784.632631 99.61.34.145 TCP 1385959038.972602 99.61.34.145 TCP 1385959481.571627 99.61.34.145 TCP 1385860339.225421 37.139.6.111 TCP 1385860339.238402 37.139.6.111 TCP 1385860339.286538 37.139.6.111 TCP 1385860339.379029 37.139.6.111 TCP 1385860339.380669 37.139.6.111 TCP 1385860339.425247 37.139.6.111 TCP 1385860339.556737 37.139.6.111 TCP 1385860339.583913 37.139.6.111 TCP 1385860339.623861 37.139.6.111 TCP 1385857840.419300 103.248.63.253 TCP 1385857841.739372 103.248.63.253 TCP 1385857848.593171 103.248.63.253 TCP 1385857850.411457 103.248.63.253 TCP


person MaryB.    schedule 28.11.2016    source источник


Ответы (1)


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

awk '{
    line = $0;
    addr = $2;
    addrcount[addr]++;
}
END {
    for (addr in addrcount) {
        if (addrcount[addr] >= 100) {
            print addr;
        }
    }
}' [DATA_FILE] | xargs -P [MAXPROCS] -I 'IP_ADDR' awk '{ if ($2 == "IP_ADDR") { print $0 } }' [DATA_FILE] | awk '{
    timestamp = $1
    addr = $2;
    traffictype = $3;
    if (!(addr in minfor)) {
        minfor[addr] = timestamp;
    }
    maxfor[addr] = timestamp;
    typefor[addr] = traffictype;
}
END {
    for (addr in minfor) {
        print addr, minfor[addr], maxfor[addr], maxfor[addr] - minfor[addr], typefor[addr]
    }
}' | awk '{ if ($4 >= 60) { print $1, $5} }'

Первый бит awk определяет, какие IP-адреса имеют более 100 записей, и выводит их по одному адресу в строке. Это передается в xargs, который запускает другой скрипт awk, который печатает только те строки в вашем файле, которые имеют эти IP-адреса. Это должно предотвратить потерю контекста при попытке отфильтровать более 100 пакетов. Предпоследний сценарий awk просматривает каждую строку отфильтрованных данных и записывает минимальную и максимальную временные метки, а затем распечатывает разницу. Он также записывает тип трафика. Окончательный сценарий awk фильтрует данные таким образом, что только те IP-адреса с разницей во времени более 60 печатают IP-адрес и тип трафика.

person David    schedule 28.11.2016
comment
Это прекрасно работает! Спасибо. Но второй критерий: как из этого недавно сгенерированного файла (с IP-адресами всего 100+ пакетов) я могу сохранить только те IP-адреса, продолжительность потока пакетов которых превышает 60 секунд. Длительность потока пакетов: конечное время потока - начальное время потока для каждого IP-адреса - person MaryB.; 28.11.2016
comment
Как это можно добавить в ваш скрипт: определите первое вхождение IP-адреса (в файле только с 100+ адресами пакетов), посмотрите на начальное время (поле времени, соответствующее первому вхождению IP-адреса), посмотрите на конечное время потока, вычтите, и если разница ›= 60, сохраните этот IP-адрес и соответствующее ему поле типа (TCP/UDP/ICMP) и поместите в новый окончательный файл, который я могу позже преобразовать в файл csv. Спасибо большое за вашу помощь. - person MaryB.; 28.11.2016
comment
Я обновил скрипт, чтобы фильтровать время больше 60 и сохранять тип трафика. Правки добавляют массив typefor и последний канал через другой скрипт awk. - person David; 28.11.2016
comment
Спасибо за это обновление Дэвид. Я хотел бы попробовать это прямо сейчас; тем не менее, вчера вечером я запустил первый скрипт, и он работает нормально, но медленно. Я запустил его прошлой ночью, и сегодня утром он все еще работал, очень медленно выдавая желаемый результат. Какие изменения в логике можно сделать, чтобы она работала быстрее, чтобы я мог попробовать и вторую часть, которую вы добавили? Спасибо за помощь. - person MaryB.; 28.11.2016
comment
Вы можете попробовать добавить опцию xargs -P [maxprocs]. Это должно распараллелить второй скрипт awk и может значительно ускорить этот шаг. Я бы попробовал установить maxprocs как количество ядер на вашем компьютере. Если это все еще слишком медленно, вы можете подумать о написании специализированной программы для этого, а не полагаться только на стандартные инструменты. - person David; 29.11.2016
comment
Как добавить эту опцию? Мне его скачивать или в коде? Где? Извините, очень неопытен здесь. Спасибо. - person MaryB.; 29.11.2016
comment
Вы также можете попробовать разбить исходный файл и запустить сценарий над файлами меньшего размера, один за другим. Я полагаю, что если AWK использует слишком много памяти, это может сильно замедлить работу, а использование файлов меньшего размера должно сократить использование памяти. - person David; 29.11.2016
comment
Я обновил скрипт, чтобы показать, где будет использоваться xargs -P. - person David; 29.11.2016
comment
Мой первый подход состоял в том, чтобы разделить мой pcap-файл размером 822 МБ с помощью editcap примерно на 800 файлов, потому что команда сортировки зависала. Но чтобы соответствовать критерию длительности потока >=60 секунд, разделение файлов также отрезает поток пакетов для многих IP-адресов, разбросанных по большому файлу pcap (один и тот же IP-адрес появляется во многих меньших файлах). Вместо этого я решил записать в текстовый файл только те 3 поля, которые мне нужны, и использовать инструменты для соответствия другим критериям. Но, кажется, это было бы невозможно. Я должен был попытаться сделать это без кодирования и посмотреть, как много можно сделать. Большое спасибо за Вашу помощь. - person MaryB.; 29.11.2016
comment
Хорошо, я запущу новый скрипт и посмотрю. Но вы упомянули что-то о сопоставлении с количеством ядер на моей машине, поэтому замените скобки [maxprocs], включенные для количества ядер на моей машине? - person MaryB.; 29.11.2016
comment
Да, верно, замените [maxprocs] на количество ядер в вашей машине. Если вы используете Linux, вы сможете запустить lscpu, чтобы найти этот номер. Если вы используете Mac OS или FreeBSD, вы можете запустить sysctl -n hw.ncpu, чтобы получить количество ядер. - person David; 29.11.2016
comment
Спасибо, я сделал. Заменил [maxprocs] на 4. Теперь он работает. спасибо - person MaryB.; 29.11.2016
comment
Это заняло около часа, но получил немного уменьшенный список IP-адресов, чем без фильтра ›=60 сек. Спасибо большое! - person MaryB.; 29.11.2016