Автоматическое отключение пользователе&
-
Автоматическое отключение пользователей после превышения лимита в Pfsense 2.0
делал по этой инструкции http://warelab.ru/node/11
Для работы биллинга устанавливаем пакеты squid, Lightsquid, cron. Соответственно учитывается только трафик, проходящий через squid. В каталоге /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,") { ($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). <minute>1,31</minute> <hour>8-20</hour> <mday>*</mday> <month>*</month> <wday>*</wday> <who>root</who> <command></command>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"; вышеуказанные строки должны стоять после строки "acl password proxy_auth REQUIRED" и перед строками (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" в системном логе.
но по всей видимости он написан для версии 1.*
в скрипте ter.pl я изменил адреса ссылок (но пробовал и с оригинальными)
при запуске скрипта в консоле выдаёт ошибки[2.0-RC1][root@pfsense.localdomain]/root(4): perl /usr/local/etc/squid/ter.pl Bareword found where operator expected at /usr/local/etc/squid/ter.pl line 41, near "/etc/squid" (Missing operator before quid?) String found where operator expected at /usr/local/etc/squid/ter.pl line 44, near "print FF ("" (Might be a runaway multi-line "" string starting on line 41) (Missing semicolon on previous line?) Backslash found where operator expected at /usr/local/etc/squid/ter.pl line 44, near "$user\" (Missing operator before \?) String found where operator expected at /usr/local/etc/squid/ter.pl line 49, near "printf("" (Might be a runaway multi-line "" string starting on line 44) (Missing semicolon on previous line?) Can't modify pattern match (m//) in local at /usr/local/etc/squid/ter.pl line 41, near "/etc/squid" syntax error at /usr/local/etc/squid/ter.pl line 41, near "/etc/squid" Unmatched right curly bracket at /usr/local/etc/squid/ter.pl line 54, at end of line syntax error at /usr/local/etc/squid/ter.pl line 54, near "}" Execution of /usr/local/etc/squid/ter.pl aborted due to compilation errors.
кусок кода начиная с 41 строки
open FF,">","/usr/local/etc/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'
пробовал его редактировать, но в файл блокер_юсерс пользователи не добавлялись (для теста я использовал лимит в 1 и 1024 байт)
на файл blocked_users ставил права на редактирование любым пользователем, пробовал запускать и без этого файла
подскажите куда копать?
и вообще работает ли этот скрип если прокси работает в прозрачном режиме (то есть будут ли записывать не имена, а ипы) ? -
помогите пожалуйста ::)
-
попробуй изменить 41 строку
open(FF,"> /usr/local/squid/blocked_users"); -
спасибо, сейчас попробуемс)
-
как успехи ?
отпишись plz -
Извините, что не сразу ответил
пробовал
open(FF,"> /usr/local/squid/blocked_users");
open(FF,"> /usr/local/etc/squid/blocked_users");
теперь выдает такие ошибки[2.0-RC2][root@pfsense.localdomain]/root(1): perl /usr/local/etc/squid/ter.pl String found where operator expected at /usr/local/etc/squid/ter.pl line 44, near "print FF ("" (Might be a runaway multi-line "" string starting on line 41) (Missing semicolon on previous line?) Backslash found where operator expected at /usr/local/etc/squid/ter.pl line 44, near "$user\" (Missing operator before \?) String found where operator expected at /usr/local/etc/squid/ter.pl line 49, near "printf("" (Might be a runaway multi-line "" string starting on line 44) (Missing semicolon on previous line?) syntax error at /usr/local/etc/squid/ter.pl line 41, near "/usr/local" Unmatched right curly bracket at /usr/local/etc/squid/ter.pl line 54, at end of line syntax error at /usr/local/etc/squid/ter.pl line 54, near "}" Execution of /usr/local/etc/squid/ter.pl aborted due to compilation errors.
44я строка соответственно
print FF ("$user\n") if ($h{$user}{size} > $tt{$user}{limit});
как понимаю он ругается на ввод информации в файл /usr/local/etc/squid/limit
файлу я на всякий случай присвоил 777 права -
c.35-40
open FF," while (<ff>) { ($user,$limit)=split; $tt{$user}{limit}=$limit; } close FF;</ff>
-
c.35-40
open FF," while (<ff>) { ($user,$limit)=split; $tt{$user}{limit}=$limit; } close FF;</ff>
спасибо тебе о великий гуру пфсенса ;)
с этим изменением скрипт запускается
но вроде бы в файл limit всё равно пользователи не добавляются =\ поковыряюсь пока ещё со скриптомтолько не сердитесь, тут велез другой вопрос, который я задавал ранее
о возможности блокировки пользователей по ипу
этой строчкой баняться только учетные записи
_acl bl_users proxy_auth_regex -i '/usr/local/squid/blocked_users'_к сожалению инфы по настройке асл для фряхи я ещё не нашел (но сейчас продолжаю поиск)
или подскажите какой каким параметром заменить proxy_auth_regex, чтобы блокировался ип? -
этой строчкой баняться только учетные записи
_acl bl_users proxy_auth_regex -i '/usr/local/squid/blocked_users'_к сожалению инфы по настройке асл для фряхи я ещё не нашел (но сейчас продолжаю поиск)
или подскажите какой каким параметром заменить proxy_auth_regex, чтобы блокировался ип?url_regex верно?
ипы я прописываю вида 192.168.0.х/32 -
В сквиде есть опция
acl banned_hosts src "/var/squid/acl/banned_hosts.acl"
содержит
10.10.10.10
10.100.2.100Только опция появляется, если что-то было добавлено в Proxy server: Access control > Banned host addresses
Можно в опции настроек ГУИ добавить фиктивный адрес и потом спокойно использовать указанный файл.
-
ух половину проблемы решили) с такой командой все баняться на отличненько ;D
acl bl_users src "/usr/local/squid/blocked_users"
http_access deny bl_usersпойду добивать, почему пользователи не добавляются в файл blocked_users
-
ух половину проблемы решили) с такой командой все баняться на отличненько ;D
acl bl_users src "/usr/local/squid/blocked_users"
http_access deny bl_usersпойду добивать, почему пользователи не добавляются в файл blocked_users
Попробуй сквид погасить - может он держит файл.
-
сейчас отключены хавп, сквид и сквидгуард
результ прежний =(
-
-
пробовал развные, включая 777
-
Если нет необходимости вести лог трафика, а нужно лишь контролировать его лимит, то лучше использовать Captive Portal + Radius.
Правда, по умолчанию FreeRadius в pfSense не умеет считать трафик, но с помощью командной строки и правки пары конфигурационных файлов его можно этому научить.Вместо CP можно использовать PPPoE или PPTP. Причём лучше второе.
Вариант с радиусом позволяет контролировать весь трафик, а не только тот, который проходит через сквид.
Если кому интересно, напишу подробнее, что нужно править в конфигурационных файлах.
Я реализовывал этот вариант на базе 2.0 RC1, но в промышленную эксплуатацию в нашей компании он не пошёл, так как в этом случае не ведётся логирование, т.е. нельзя узнать кто на что этот трафик потратил.
Можно конечно использовать в дополнение к радиусу что-то типа ntop, но во-первых он у меня не заработал (какие-то там библиотеки кривые), а во-вторых железо слабовато (PF стоит на ALIX). -
Если нет необходимости вести лог трафика, а нужно лишь контролировать его лимит, то лучше использовать Captive Portal + Radius.
Правда, по умолчанию FreeRadius в pfSense не умеет считать трафик, но с помощью командной строки и правки пары конфигурационных файлов его можно этому научить.Вместо CP можно использовать PPPoE или PPTP. Причём лучше второе.
Такой вариант позволяет контролировать весь трафик, а не только тот, который проходит через сквид.
Если кому интересно, напишу подробнее, что нужно править в конфигурационных файлах.
Я реализовывал этот вариант на базе 2.0 RC1, но в промышленную эксплуатацию в нашей компании он не пошёл, так как в этом случае не ведётся логирование, т.е. нельзя узнать кто на что этот трафик потратил.
Можно конечно использовать что-то типа nmap, но во-первых он у меня не заработал (какие-то там библиотеки кривые), а во-вторых железо слабовато (PF стоит на ALIX).если можно расскажи по подробней плиз очень интересно
-
Правда, по умолчанию FreeRadius в pfSense не умеет считать трафик, но с помощью командной строки и правки пары конфигурационных файлов его можно этому научить.
Считает вроде без шаманства? что за правки? если не секрет -)
Отредактировано: Считает вроде без шаманства. что за правки? если не секрет -)
-
Отлично всё работает. Как уже говорилось, для блокирования по ip забиваем через гуи фиктивный адрес, а потом используем файл /var/squid/acl/banned_hosts.acl
Нюансы:1. нужно пропускать первые 2 строки в файле .total:
$totaluser=<ff>;chomp $totaluser;$totaluser=~s/^user: //;
$totalsize=<ff>;chomp $totalsize;$totalsize=~s/^size: //;
while (<ff>) {
($user, $size, $hit) = split;
$h{$user}{size}+=$size;
$h{$user}{hit}+=$hit;2. Если пока никто не забанен, то получается пустой файл, поэтому через скрипт прописываем тот же фиктивный ip в файл banned_hosts.acl:
open FF,">","/var/squid/acl/banned_hosts.acl";
print FF ("фиктивный ip\n");
foreach $user (sort {$h{$b}{size}<=>$h{$a}{size}} keys %h) {
print FF ("$user\n") if ($h{$user}{size} > $tt{$user}{limit});3. Так как скрипт пользуется результатами работы скрипта /usr/local/www/lightsquid/lightparser.pl то более логично дописать весь этот функционал именно в него.</ff></ff></ff>