如何将网络数据包捕获到MySQL

问题描述:

我要为WiFi(802.11)设计一个网络分析仪 目前我使用tshark捕获和解析WiFi帧,然后将输出传输到perl脚本以存储解析的信息到Mysql数据库。如何将网络数据包捕获到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; 

任何可以帮助改善性能的想法是ap preciated.Or可能有一个可以做得更好的替代机制。 现在我的表现是50%,这意味着我可以将大约一半的数据包存储在mysql中。

+0

禁止你在捕捉表有任何按键。每次更新都会导致密钥更新,当您执行插入风暴时可能会导致主要的减速。关闭键,然后在完成插入后重建/重新启用索引。 –

写入管道的东西不会丢失,可能真正发生的是tshark尝试写入管道,但perl + mysql太慢而无法处理输入,因此pipeb已满,写入将会阻塞tshark只是丢弃数据包。

瓶颈可能是MySQL或Perl本身,但可能是数据库。检查CPU使用情况,测量插入率。然后选择更快的数据库或写入多个数据库。您也可以尝试批量插入并增加管道缓冲区的大小。

更新

while (<STDIN>) 

这种读取一行到$_,那么你忽略它。

+0

我过滤了我的tshark捕获,因此我将帧捕获速率降低到e.x 10每分钟。问题变得更糟。我在DB中看不到任何框架!看来我的Perl可能有一些问题。我想知道如何使用文本文件作为Tshark和Perl之间的缓冲区。所以我可以让它们不同步! thsrak ---> textfile as buffer ---> Perl ----> MySQL 问题是我不知道如何保持文件打开,并在每次写入新帧时继续读取文件文件??! 你有什么想法吗? – hra

+0

ahhh。请参阅更新。 –

+0

yey。谢谢!!这就解决了我的第一个问题,现在在重帧率下我几乎有100%的表现!但是,当我减慢帧速率为例如每分钟10帧我无法捕捉帧。你知道当perl脚本退出while循环时以及在tshark捕获另一个数据包之后(例如10分钟)会发生什么。我想我应该去学习更多关于管道是如何在Linux中工作的! – hra

您可以使用FIFO文件,然后读取数据包并使用插入延迟插入到mysql中。

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

管道的问题,可以提高数据包捕获与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)