cppmm 19.08.2012 03:56

Talks!Костыль для логов iptables

Сидел тут недавно, пил пиво и внезапно захотелось мне посмотреть, чего там у меня в логах 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();
}
}



Тэги: perl script костыль
+ 6 -
Похожие Поделиться