Очередное решение на наболевшую тему.Задача: имея squid с настроенной авторизацией пользователей и сбором статистики 
сделать ограничение на используемый трафик (квоты).
Лично мне от sams пришлось отказаться т.к. он прикручивается к авторизации пользователей, 
а для меня это неприемлемо.
Решение подойдет для тех, кому не сильно критично точное лимитирование. 
Я сильно не хотел менять устоявшуюся систему авторизации пользователей.
итак.
1. настраиваем сквид (статей много, описывать не буду)
В squid.conf , желательно перед остальными ACL, надо будет добавить следующее
 # блокировка пользователей которые превысили лимит (файл user-deny),
 # и разрешение этим пользователям только тех IP и сайтов, которые перечислины в файле host.acl
 acl no_quota url_regex -i "/etc/squid/no_quota_url.txt"
 acl banusers proxy_auth_regex -i "/etc/squid/user_deny.txt"
 http_access allow no_quota banusers allowedhost
 deny_info ERR_QUOTA all
 http_access deny banusers allowedhost all
по порядку что к чему с файлами:
no_quota_url.txt - ведется руками.
текст:
 # файд содержит сайты, который открываются, даже если превышена квота и пользователь попал в users_deny.txt
 test.ru
 icq.com
 205.188.
user_deny.txt - в дальнейшем создастся сам, но без него перечитать настройки squid не получиться
 # файл содержит пользователей превысивших квоту.
 # автоматически переписывается скриптом traf_limit.pl
 dolzhen_bit_odin_user
 user1
 user2
ERR_QUOTA создадим по образу и подобию всех остальных страниц с ошибками. 
Я поставил что-бы получать другой текст. вот так получилось:
 <HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=koi8-r">
 <TITLE>Превышен лимит</TITLE>
 </HEAD><BODY>
 <H1><font color="FF0000">ПРЕВЫШЕН ЛИМИТ</font></H1>
 <H2>
 </H2>
 <HR>
 <P>Заблокированный URL:
 <A HREF="%U">%U</A>
 <P>
 <UL>
 <LI>
 <STRONG> Вы превысили месячный лимит на интеренет. 
 <br> Если Вы считаете это неправильным, свяжитесь с отделом АСУ по телефонам 
 1013 или 1066 
 <br>
 <br>Если этот сайт необходим для работы, то он может быть открыт по  служебной записке.
 </STRONG>
 <P>
 </UL>
 <P>С Уважением отдел АСУ.
 </BODY></HTML>
allowedhost - мое правило проверки пользователей.
2. LightSquid абсолютно штатный. вот официальный сайт http://lightsquid.sourceforge.net/
Ставится и настраивается минут 5-10. Собственно вся настройка у меня заключалась в том, 
что-бы рассортировать пользователей по группам. Для тех у кого еще есть http сервер 
дополнительно будет красивая статистика. ;)
3. в /etc/squid создадим папку traf_limit
4. в /etc/squid/traf_limit создаем два файла
traf_limit.pl
 #!/usr/bin/perl
 #
 # Довесок на LightSquid Project (c) 2004-2005 Sergey Erokhin aka ESL
 #
 # Скрипт создает файлик user_deny для ограничения инета по трафику
 # Автор: Иван Лонин loninia@apksouz.ru  2008 год.
 use File::Basename;
 # коряво конечно напрямую писать путь к конфигу, но лениво было sh файлик для крона делать :)
 require "/etc/squid/traf_limit/config";
 #($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
 @dat=localtime(time);
 $year =1900+$dat[5];
 $month=1 + $dat[4];
 $filter="$year$month";
 #print "$log_path/$filter*\n";
 @daylist=glob("$log_path/$filter*");
 foreach $daypath (sort @daylist) {
   open FF,"<$daypath/.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;
   }
   close FF;
 }
 #
 $cummulative=0;
 open RES,">$res_file";
 print RES "# файл содержит юзеров превысивших квоту.\n
 # автоматически переписывается скриптом traf_limit.pl\ndolzhen_bit_odin_user\n";
 foreach $user (sort {$h{$b}{size}<=>$h{$a}{size}} keys  %h) {
     $all4user=$h{$user}{size}/1024/1024;
     if ($vip_user{$user}{size} > 0) {
         $limit=$vip_user{$user}{size};
     }else{
         $limit=$all_limit;
     }
     if ($all4user >= $limit) {
         print RES "$user\n";
 #        print "$h{$user}{size}\n";
     };
 }
 __END__
и файлик config
 #!/usr/bin/perl
 # конфигурационный файл для скрипта traf_limit.pl
 #
 # путь к логам lightsquid
 $log_path="/www/lightsquid/report";
 # файл в который пушутся пользователи превысившие лимит
 $res_file="/etc/squid/user_deny.txt";
 # лимит инета в мегабайтах
 $all_limit=150;
 # привелигированные пользователи с повышенным или пониженным лимитом
 # для каждого пользователя строка формата:
 #$vip_user={<имя_юзера}{size}=<лимит_в_мегабайтах>;
 $vip_user{user1}{size}=5;
 $vip_user{qwe}{size}=50;
назначим файликам нужного владельца и права на запуск
5. осталось в только в cron добавить запуск. Я сделал раз в сутки в 5-00. 
делать вечером в 20 с чем нибудь категорически не рекомендую т.к. скрипт работает 
на текущую дату (первого числа будут использоваться прошломесячные данные)
делаем 
 crontab -e 
и добавляем для скрипта строчку вида
 45 04 * * * /etc/squid/traf_limit/traf_limit.pl
и для сквида
 0 05 * * * /etc/init.d/squid reload
собственно все :). естественно, что правильно оно начнет работать только с 1 числа следующего за установкой месяца. 
Удачи.
Если есть вопросы пишите на loninia@apksouz.ru
URL: 
Обсуждается: http://www.opennet.dev/tips/info/1797.shtml