Итак, возникла задача считать траффик. Тут поможет Solaris extended accounting.
Читаем man acctadm, запускаем acctadm: acctadm -e extended -f /var/adm/flowacct
Теперь весь траффик пишется в файл /var/adm/flowacct.
Создаем правила для ipqosconf - файлик flow.qos с содержимым:
fmt_version 1.0
action {
module ipgpc
name ipgpc.classify
params {
global_stats TRUE
}
class {
name default
next_action acct
enable_stats TRUE
}
}
action {
module flowacct
name acct
params {
global_stats TRUE
timer 10000
timeout 10000
max_limit 2048
next_action continue
}
}
Применяем правила: ipqosconf -a flow.qos
Теперь как-то надо получить удобоваримый вывод из файла flowacct.
Здесь поможет perl и его модули Sun::Solaris::Exacct(стоит по умолчанию) и NetAddr::IP (надо ставить с cpan):
Создаем исполняемый файл traffshow.pl:
#!/usr/bin/perl
use strict;
use Sun::Solaris::Exacct qw(:EXACCT_ALL);
use NetAddr::IP ':aton';
die("Usage: traffshow.pl \n") unless (@ARGV == 1);
my $ef = ea_new_file($ARGV[0], &O_RDONLY) || die(error_str());
printf "\nSource\t\t\tDestination\t\tSrcPort\tDstPort\tProto\tPackets\tBytes\n";
while (my $obj = $ef->get()) {
dump_object($obj);
}
# if errors
if (ea_error() != EXR_OK && ea_error() != EXR_EOF) {
printf("nERROR: %sn", ea_error_str());
exit(1);
}
exit(0);
sub dump_object {
my ($obj) = @_;
my @cat = $obj->catalog()->value();
my %rec = ();
if ($obj->type() == &EO_ITEM) {
my $val = $obj->value();
if (ref($val)) {
dump_object($val);
} else {
return ($cat[2], $val);
}
} else {
foreach my $val ($obj->value()) {
my ($c, $v) = dump_object($val);
if($c eq 'EXD_FLOW_V4SADDR'){$rec{'saddr'} = my_inet_aton($v)}
elsif($c eq 'EXD_FLOW_V4DADDR'){$rec{'daddr'} = my_inet_aton($v)}
if($c eq 'EXD_FLOW_SPORT'){$rec{'sport'} = $v}
elsif($c eq 'EXD_FLOW_DPORT'){$rec{'dport'} = $v}
elsif($c eq 'EXD_FLOW_PROTOCOL'){$rec{'proto'} = $v}
elsif($c eq 'EXD_FLOW_DSFIELD'){$rec{'dsfld'} = $v}
elsif($c eq 'EXD_FLOW_NBYTES'){$rec{'nbytes'} = $v}
elsif($c eq 'EXD_FLOW_NPKTS'){$rec{'npkts'} = $v}
}
}
if (defined $rec{'npkts'} ) {
printf ("%s\t%s\t%s\t%s\t%s\t%s\t%s ", $rec{'saddr'},$rec{'daddr'},$rec{'sport'},$rec{'dport'},$rec{'proto'},$rec{'npkts'},$rec{'nbytes'});
print "\n";
}
}
sub my_inet_aton {
my $a = shift;
my $ip = new NetAddr::IP($a);
return $ip;
}
Запускаем traffshow.pl /var/adm/flowacct > /var/log/traffic.log
Вывод :
Source Destination SrcPort DstPort Proto Packets Bytes
192.168.168.254/32 192.168.168.161/32 22 42042 6 43 12124
192.168.168.161/32 192.168.168.254/32 42042 22 6 53 4052
192.168.168.254/32 192.168.168.140/32 2638 56647 6 44 2849
192.168.168.254/32 192.168.168.140/32 2638 56647 6 4 208
192.168.168.140/32 192.168.168.254/32 56647 2638 6 44 3266
192.168.168.254/32 192.168.168.140/32 2638 56648 6 43 2747
192.168.168.254/32 192.168.168.140/32 2638 56648 6 4 208
192.168.168.140/32 192.168.168.254/32 56648 2638 6 44 3202
192.168.168.254/32 192.168.168.140/32 2638 56642 6 736 74386
192.168.168.254/32 192.168.168.140/32 2638 56642 6 5 260
192.168.168.140/32 192.168.168.254/32 56642 2638 6 731 52827
192.168.168.254/32 192.168.168.140/32 2638 56649 6 42 2663
192.168.168.254/32 192.168.168.140/32 2638 56649 6 4 208
192.168.168.140/32 192.168.168.254/32 56649 2638 6 41 3018
192.168.168.254/32 192.168.192.2/32 123 123 17 1 76
Можно не заморачиваться с perl, в /usr/demo/libexacct можно скомпилировать с-ишный exdump.c и парсить его вывод либо прописать
вывод, подобный приведенному, самому (если вы дружите с си). По деталям - читаем на sun "System Administration Guide: IP Services"