The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Squid + LightSquid + Perl = ограничение по трафику
Очередное решение на наболевшую тему.

Задача: имея squid с настроенной авторизацией пользователей и сбором статистики 
сделать ограничение на используемый трафик (квоты).

Лично мне от sams пришлось отказаться т.к. он прикручивается к авторизации пользователей, 
а для меня это неприемлемо.

Решение подойдет для тех, кому не сильно критично точное лимитирование. 
Я сильно не хотел менять устоявшуюся систему авторизации пользователей.

итак.


1. настраиваем сквид (статей много, описывать не буду)
В squid.conf , желательно перед остальными ACL, надо будет добавить следующее

   # блокировка юзеров которые превысили лимит (файл user-deny),
   # и разрешение этим пользователям только к тем IP и сайтам, которые перечислены в файле no_quota_url.txt
   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
   очень_нужный_домен.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>Вы превысили месячный лимит на интеренет.</STRONG>
   <P>
   </UL>
   <P>С Уважением отдел АСУ.


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];
   if ($month<10){
          $month="0".$month
   }
   $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

Этот момент как выяснилось нужно объяснять. Дело в том, что Squid читает файлы конфигурации 
и все остальные кстати тоже, только при чтении конфигурации. Поэтому после отработки скрипта 
или изменении файла no_quota_url.txt  обязательно надо перечитать конфиг 
(рестарт не желателен из-за сброса кэша). Команда как не трудно догадаться
/etc/init.d/squid reload :) .

собственно все :) . естественно, что правильно оно начнет работать только с 1 числа 
следующего за установкой месяца, если статистика до этого не собиралась.

Удачи.

Если есть вопросы пишите на loninia"сабака"apksouz.ru

Пока статья на opennet лежала еще кусочек родился

> А по ip адресу возможно тоже самое или только по юзерам работает
> лимитирование?

да, если у тебя нет авторизации, то статистика будет собираться по ip машин.
только с привилегированными пользователями затык скорее всего будет&#8230;
попробуй их назначать либо так

   $vip_user{"192.168.0.123"}{size}=5;

либо так

   $user1="192.168.0.123";
   $vip_user{$user1}{size}=5;
 
16.10.2008 , Автор: Mosson , Источник: http://www.itdepartament.ru/index.p...
Ключи: squid, proxy, limit, statistic
Раздел:    Корень / Администратору / Сетевые сервисы / Прокси сервер Squid / ACL, ограничения трафика и пользователей

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, OLD (ok), 11:11, 16/10/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Если юзер качает фильм то поможет только автоматическое создание правила файервола на него.
     
     
  • 2.5, mc_ (?), 13:42, 17/10/2008 [^] [^^] [^^^] [ответить]  
  • +/
    есть патчи под squid, которые позволяют писать в лог записи не по окончанию закачки, а каждые xxx кб.  
     

  • 1.2, sapun (??), 14:24, 16/10/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    У меня Самса+Сквид шикарно работает с авторизацией по ip
     
     
  • 2.22, Unknown (??), 16:50, 14/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Вопрос такой, почему при превышении трафика mail.agent isq skype все равно работают в чем проблема у меня стоит squid+sams+rejik авторизация по ip вроде остальное все работает и блокирует при превышении лимита??? Спасибо!
     

  • 1.3, luserz (?), 08:18, 17/10/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    dhcp в локалке + терминальный сервер разрывает данную связку в клочья ;)
    AD в локалке существует для своих собственных нужд.
     
  • 1.4, demimurych (?), 10:17, 17/10/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    был такой проект stc
    он все это делал и даже еще больше
    при чем имел веб морду
    stc.nixdev.org

    правда если не ошибаюсь уже очень давно не развивается.

     
     
  • 2.7, Kisa (??), 17:35, 19/10/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, не был. Есть такой проект. И по старому адресу. Может, не особо развивается, но поддерживается.
     
     
  • 3.8, igoritl (??), 10:47, 20/10/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Все бывшие разработчики на опеннете собрались?:)
     

  • 1.6, Аноним (6), 16:57, 17/10/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    последний sams вполне устойчив
     
  • 1.9, NicK (?), 10:29, 22/10/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    а как же Traffpro?
     
  • 1.10, ArtemK (?), 16:34, 10/11/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Не получается с vip_users.
     
  • 1.11, IZubov (?), 10:03, 18/11/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Доброго времени суток. У меня проблема с http_access. При написании конфига сквида по образцу автора, у меня даже заблокированные пользователи ходят в сеть. Использую авторизацию в AD через winbind.
    кусок squid.conf :
    http_access allow no_quota banusers REAL
    deny_info ERR_QUOTA.html all
    http_access deny banusers
    http_access allow REAL
    http_access deny all
    Нюхом чую, что проблема где то в этих строках, но сам к сожалению найти ее не могу.
     
     
  • 2.12, root1985 (?), 11:37, 22/01/2009 [^] [^^] [^^^] [ответить]  
  • +/
    http_access allow no_quota banusers REAL - здесь разрешается выход banusers
    http_access deny banusers - здесь запрещается banusers выход
    http_access allow REAL

    Судя по этим строкам Вы одновременно и разрешаете banusers выход в интернет.
    уберите http_access allow no_quota banusers REAL и попробуйте еще раз

     

  • 1.13, Mosson (??), 15:46, 18/03/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    нифига ж себе.... тема ожила :)
    на правах автора размещаю ссылку на оригинал статьи
    http://www.itdepartament.ru/index.php/archives/60

    давно я тут не был. давайте отвечу всем и по порядку:

    1.
    нашел баг маленький: файлик 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;

    были досадные очепятки в строчке описания

    2.
    по поводу других проектов и точности ограничения: я написал в статье почему их нее использую. невнимательно читали.

    3.
    to luserz
    >dhcp в локалке + терминальный сервер разрывает данную связку в клочья ;)
    >AD в локалке существует для своих собственных нужд.

    ничего он не разрывает если сквид настроен на авторизацию пользователя, а не ip сервера, у меня у самого три терминальных+150 тонких клиентов

    4.
    to IZubov
    скорее всего надо так ;) если REAL это ACL по проверке пользователей
    http_access deny banusers REAL

    5.
    to root1985
    неправда Ваша. Опять же невнимательно читали статью
    http_access allow no_quota banusers REAL - здесь разрешается даже пользователям превысившим квоту ходить на сайты прописанные в файлике no_quota_url.txt.
    http_access deny banusers - здесь запрещается превысившим все остальное
    http_access allow REAL - а здесь запрещается не авторизованным качать что-бы то нибыло


    уффф вроде пока все...

     
  • 1.14, Mosson (??), 17:02, 18/03/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    ну вот... еше один серьезный косяк. в коде traf_limit.pl меняем кусок

    $month=1 + $dat[4];
    if ($month<10){
        $month="0".$month
    }
    $filter="$year$month";

     
  • 1.15, Anhel (ok), 12:51, 22/01/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо за статью!
    У мен тут ошибка (SQUID 2.7)

    #/usr/local/etc/rc.d/squid onerestart
    Starting squid.
    2010/01/22 12:35:25| Invalid Proxy Auth ACL 'acl banusers proxy_auth_regex -i "/etc/squid/user_deny.txt"' because no authentication schemes are fully configured.
    FATAL: Bungled squid.conf line 612: acl banusers proxy_auth_regex -i "/etc/squid/user_deny.txt"
    Squid Cache (Version 2.7.STABLE7): Terminated abnormally.
    /usr/local/etc/rc.d/squid: WARNING: failed to start squid

     
     
  • 2.17, Mosson (??), 14:47, 27/01/2010 [^] [^^] [^^^] [ответить]  
  • +/
    по моему нет файла /etc/squid/user_deny.txt

    в общем внимательно перечитайте статью и сделайте все как надо :)
    для тех кто читает не все комменты - основной текст статьи тут http://www.itdepartament.ru/index.php/archives/60

     
     
  • 3.18, Anhel (ok), 14:51, 27/01/2010 [^] [^^] [^^^] [ответить]  
  • +/
    >по моему нет файла /etc/squid/user_deny.txt
    >
    >в общем внимательно перечитайте статью и сделайте все как надо :)
    >для тех кто читает не все комменты - основной текст статьи тут
    >http://www.itdepartament.ru/index.php/archives/60

    файл был. но я уже сделал еще раз по вашей ссылке (что по ссылке), и все заработало, в чем было дело не помню :)))


     

  • 1.16, Anhel (ok), 13:55, 22/01/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Подскажите в чем дело, пожалуйста :)
     
  • 1.19, lex1974 (?), 09:46, 01/03/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Проблемма! OS freesco 0.3.8 squid 2.5 Все сделал все по схеме (ну естесественно прописал свои пути) выдает такую ошибку в чем проблема понять не могу! Кто встречался с такой проблеммой подскажите в чем косяк!
    2010/03/01 17:20:04| aclParseAclLine: IGNORING: Proxy Auth ACL 'acl banusers proxy_auth_regex -i “/usr/local/squid/etc/user_deny.txt"' because no authentication schemes are fully configured.
     
  • 1.20, serega3333 (ok), 21:10, 13/03/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Скрипт работает, но не записывает в user_deny.txt IP адреса юзеров, чей трафик превышен
     
  • 1.21, rdsden (??), 08:48, 12/04/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    скажите, если я хочу сделать более точное ограничение, допустим скрипт выполнять раз в пять минут, это не сильно нагрузит сервер? или для этого существуют другие решения?
     
  • 1.23, Sergey (??), 16:48, 23/12/2013 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Спасибо за скрипт! Подскажите, что поменять, чтоб скрипт записывал в блок-лист пользователей, которые привысили дневной лимит?:)
     
  • 1.24, Igor Mitichev (?), 11:48, 18/03/2014 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Господа, подскажите как правильно прописывать пользователей в $vip_user, если в имени пользователя присутствует точка? Сейчас на этих строчках скрипт затыкается :(
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    Слёрм
    Inferno Solutions
    Hosting by Ihor
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру