Как перехватить сетевые пакеты в MySQL - PullRequest
2 голосов
/ 13 сентября 2011

Я собираюсь спроектировать сетевой анализатор для WiFi (802.11). В настоящее время я использую tshark для захвата и разбора кадров WiFi, а затем передаю выходные данные скрипту perl для сохранения проанализированной информации в базе данных Mysql.

Я просто обнаружил, что в этом процессе я пропускаю много кадров.Я проверил, и кадры, кажется, теряются во время конвейера (когда выходные данные доставляются в perl для получения данных в Mysql). Вот как это происходит

(Tshark) ------- кадры теряются----> (Perl) --------> (MySQL) это то, как я передаю вывод tshark в скрипт:

sudo tshark -i mon0 -t ad -T fields -e frame.time -e frame.len -e frame.cap_len -e radiotap.length | perl tshark-sql-capture.pl 

это простой шаблон скрипта perlЯ использую (tshark-sql-capture.pl)

# preparing the MySQL
my $dns = "DBI:mysql:capture;localhost";
my $dbh = DBI->connect($dns,user,pass);
my $db = "captured";

while (<STDIN>) {
    chomp($data = <STDIN>);
    ($time, $frame_len, $cap_len, $radiotap_len) = split "  ", $data;
    my $sth = $dbh-> prepare("INSERT INTO $db VALUES (str_to_date('$time','%M %d, %Y %H:%i:%s.%f'), '$frame_len', '$cap_len', '$radiotap_len'\n)" );
    $sth->execute;
}

#Terminate MySQL
$dbh->disconnect;

Любая идея, которая может помочь улучшить производительность, ценится. Или, может быть, существует альтернативный механизм, который может работать лучше.Сейчас моя производительность составляет 50%, что означает, что я могу хранить в mysql около половины пакетов, которые я перехватил.

Ответы [ 3 ]

1 голос
/ 13 сентября 2011

Вещи, записанные в трубе, не теряются, вероятно, на самом деле происходит то, что tshark пытается записать в канал, но perl + mysql слишком медленно обрабатывает ввод, так что pipeb заполнен, запись блокирует, так что tsharkпросто отбрасывает пакеты.

Узким местом может быть либо MySQL, либо сам Perl, но, вероятно, БД.Проверьте использование процессора, измерьте скорость вставки.Затем выберите более быструю БД или запишите несколько БД.Вы также можете попробовать пакетные вставки и увеличить размер буфера канала.

Обновление

while (<STDIN>)

, это читает строку в $_, затем вы игнорируете ее.

0 голосов
/ 22 марта 2013

При проблемах с конвейером вы можете улучшить захват пакетов с помощью GULP http://staff.washington.edu/corey/gulp/

со страниц руководства:

1) reduce packet loss of a tcpdump packet capture:
      (gulp -c works in any pipeline as it does no data interpretation)

        tcpdump -i eth1 -w - ... | gulp -c > pcapfile
      or if you have more than 2, run tcpdump and gulp on different CPUs
        taskset -c 2 tcpdump -i eth1 -w - ... | gulp -c > pcapfile

      (gulp uses CPUs #0,1 so use #2 for tcpdump to reduce interference)
0 голосов
/ 23 февраля 2012

вы можете использовать файл FIFO, затем читать пакеты и вставки в MySQL, используя задержку вставки.

sudo tshark -i mon0 -t ad -T fields -e frame.time -e frame.len -e frame.cap_len -e radiotap.length > MYFIFO
...