Сидел тут недавно, пил пиво и внезапно захотелось мне посмотреть, чего там у меня в логах iptables'а пишется(фаер настроен сотни лет назад и давно не трогался). Сначала за 15 минут набросал парсер. Потом прикрутил подсветку. А потом появилась мысль написать анализатор. Но пиво сыграло свою роль, ну и в принципе штука ненужная. Однако, подумалось мне, для общего образования идея интересная.
Поэтому я выложу набросанный скрипт и предлагаю всем желающим
обосрать воспользоваться тем, что работает и придумать варианты анализа лога. На мой взгляд, задачка под пиво самое оно. У нас тут был когда-то конкурс скриптописателей. Давайте, кому интересно, поиграемся в такой же неофициально. ;)
Свой вариант пока убираю(функция f_analyze). Пускай это будет мелкой задачкой. ;)
В статистике надо вывести топ айпишников, откуда выходят пакеты, топ айпишников, куда они идут, топ исходящих портов и топ портов назначения.
Вот скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
#!/usr/bin/perl #
use warnings; use strict; use feature ":5.10"; use IO::Handle; use Term::ANSIColor; use Getopt::Std;
my %opts; my $filename;
sub f_help { print "Usage: iptables_log_format.pl -f <logfile> -a action Actions: read - read file in real time and show every packet(like tail -f) analyze - analyze file and show statistics \n"; exit 1; }
sub f_analyze { # Вот тут самое интересное, ага. exit 1; }
sub f_read { my $timeout = 1;
open(my $logfile, $filename) or die "Can't open logfile: $!\n"; seek($logfile, 0, 2); for (;;) { while (<$logfile>) { my @string = split(/\s+/, $_); @string = grep(/=/, @string); my %packet; foreach my $item (@string) { chomp($item); my ($key, $value) = split(/=/, $item); $packet{$key} = $value; } my $date = localtime(time()); print "[ $date ] ", color("green"), "#-------", color("red"), " $packet{'PROTO'} packet ", color("green"), "-------#\n", color("reset"); print color("cyan"), "FROM = ", color("white"), "$packet{'SRC'}:$packet{'SPT'}", color("cyan"), " TO = ", color("white"), "$packet{'DST'}:$packet{'DPT'}\n", color("reset"); } sleep $timeout; $logfile->clearerr(); } }
getopts("a:f:", \%opts);
my @opts_n = keys %opts;
f_help() if (($#opts_n != 1) || (!$opts{a}));
$filename = $opts{'f'};
given($opts{a}) { when (/read/) { f_read(); } when (/analyze/) { f_analyze(); } }
|