Биллинг на PfSense 1.2.3

Для работы биллинга устанавливаем пакеты squid, Lightsquid, cron. Соответственно учитывается только трафик, проходящий через squid.
В настройках proxy server ставлю локальную аутентификацию и соответственно завожу пользователей.
В настройках proxy report выставляю IP resolve method (future) как Squidauth. Обновления proxy report через 20 минут.

В каталоге /usr/local/squid создаем файлы limit и ter.pl

Скрипт блокирования за месяц:

#!/usr/bin/perl
# файл /usr/local/squid/ter.pl

use Sys::Syslog;
use File::Basename;
push (@INC,(fileparse($0))[1]);

require "/usr/local/etc/lightsquid/lightsquid.cfg";
#require "common.pl";

openlog("blocator", "ndelay,pid", "local0");
syslog(LOG_WARNING,"trafic blocator");
closelog();

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime;
$year=sprintf("%02d",$year+1900);
$month=sprintf("%02d",$mon+1);

$filter="$year$month";

@daylist=glob("$reportpath/$filter*");

print "lightsquid blocator\n";
foreach $daypath (sort @daylist) {
open FF,"<$daypath/.total";
# GetRealName($daypath,"?"); # init realname for day
while () {
($user,$size,$hit)=split;
$h{$user}{size}+=$size;
$h{$user}{hit}+=$hit;
}
close FF;
}

open FF," while () {
($user,$limit)=split;
$tt{$user}{limit}=$limit;
}
close FF;

open FF,">","/usr/local/squid/blocked_users";

foreach $user (sort {$h{$b}{size}<=>$h{$a}{size}} keys %h) {
print FF ("$user\n") if ($h{$user}{size} > $tt{$user}{limit});
}
close FF;

foreach $user (sort {$h{$b}{size}<=>$h{$a}{size}} keys %h) {
printf("%20s", $user);
printf("%20d", $h{$user}{size});
printf("%20d", $tt{$user}{limit});
printf(" BLOKED")if($h{$user}{size} > $tt{$user}{limit});
printf("\n");
}
exec '/usr/local/sbin/squid -k reconfigure'

Файл /usr/local/squid/limit:

yich 500000000
lvoronova 150000000
lpopova 500000000

Скрипт запускается каждые 30 минут через cron. При выполнении скрипта формируется файл /usr/local/squid/blocked_users в котором записываются имена пользователей, превысивших свой лимит. Реально израсходованный трафик можно посмотреть в lightsquid.

Соответствующая запись в файле конфигурации cron (xml).


1,31
8-20
*
*
*
root
perl /usr/local/squid/ter.pl

Имена, представленные в /usr/local/squid/blocked_users блокируются в ACL squid:


acl bl_users proxy_auth_regex -i '/usr/local/squid/blocked_users'
http_access deny bl_users

Чтобы указанные строки появлялись в /usr/local/etc/squid/squid.conf при изменениях, внесенных в webConfigurator нужно внести изменения в файл /usr/local/pkg/squid.inc:


$conf .= "#Shipilov\n";
$conf .= "acl bl_users proxy_auth_regex -i '/usr/local/squid/blocked_users'\n";
$conf .= "http_access deny bl_users\n";
$conf .= "#Shipilov\n";

вышеуказанные строки должны стоять после строк:


$conf .= << auth_param basic children $processes
auth_param basic realm $prompt
auth_param basic credentialsttl $auth_ttl minutes
acl password proxy_auth REQUIRED

EOD;

и перед строками (~1040 строка)


// Onto the ACLs
password = array('localnet', 'allowed_subnets');
....
$conf .= "# Default block all to be sure\n";
$conf .= "http_access deny all\n";

Очень важно положение данной записи в файле /usr/local/etc/squid/squid.conf!

Чтобы все заработало необходимо, чтобы имена совпадали в limit и squid и в первый раз необходимо сохранить изменения в конфигурации squid в webConfigurator.

Убедиться в работе скрипта можно по наличию сообщения "trafic blocator" в системном логе.