如何将网络数据包捕获到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中。
写入管道的东西不会丢失,可能真正发生的是tshark尝试写入管道,但perl + mysql太慢而无法处理输入,因此pipeb已满,写入将会阻塞tshark只是丢弃数据包。
瓶颈可能是MySQL或Perl本身,但可能是数据库。检查CPU使用情况,测量插入率。然后选择更快的数据库或写入多个数据库。您也可以尝试批量插入并增加管道缓冲区的大小。
更新
while (<STDIN>)
这种读取一行到$_
,那么你忽略它。
我过滤了我的tshark捕获,因此我将帧捕获速率降低到e.x 10每分钟。问题变得更糟。我在DB中看不到任何框架!看来我的Perl可能有一些问题。我想知道如何使用文本文件作为Tshark和Perl之间的缓冲区。所以我可以让它们不同步! thsrak ---> textfile as buffer ---> Perl ----> MySQL 问题是我不知道如何保持文件打开,并在每次写入新帧时继续读取文件文件??! 你有什么想法吗? – hra
ahhh。请参阅更新。 –
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)
禁止你在捕捉表有任何按键。每次更新都会导致密钥更新,当您执行插入风暴时可能会导致主要的减速。关闭键,然后在完成插入后重建/重新启用索引。 –