The OpenNET Project
 
Поиск (ключи):    ПРОГРАММЫ СТАТЬИ СОВЕТЫ ФОРУМ
  WIKI НОВОСТИ (+) MAN'ы ДОКУМЕНТАЦИЯ

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 / ACL, ограничения трафика и пользователей

Обсуждение [ Линейный режим | Показать все | RSS ]
 
  • 1.1, OLD, 11:11, 16/10/2008 [ответить] [смотреть все]
  • +/
    Если юзер качает фильм то поможет только автоматическое создание правила файервола на него.
     
     
  • 2.5, mc_, 13:42, 17/10/2008 [^] [ответить] [смотреть все] [показать ветку]
  • +/
    есть патчи под squid, которые позволяют писать в лог записи не по окончанию зака... весь текст скрыт [показать] [показать ветку]
     
  • 1.2, sapun, 14:24, 16/10/2008 [ответить] [смотреть все]  
  • +/
    У меня Самса+Сквид шикарно работает с авторизацией по 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, Аноним, 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 [ответить] [смотреть все]  
  • +/
    нифига ж себе тема ожила на правах автора размещаю ссылку на оригинал ст... весь текст скрыт [показать]
     
  • 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, 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, 14:51, 27/01/2010 [^] [ответить] [смотреть все]  
  • +/
    >по моему нет файла /etc/squid/user_deny.txt
    >
    >в общем внимательно перечитайте статью и сделайте все как надо :)
    >для тех кто читает не все комменты - основной текст статьи тут
    >http://www.itdepartament.ru/index.php/archives/60

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


     
  • 1.16, Anhel, 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, 21:10, 13/03/2010 [ответить] [смотреть все]  
  • +/
    Скрипт работает, но не записывает в user_deny.txt IP адреса юзеров, чей трафик превышен
     
  • 1.21, rdsden, 08:48, 12/04/2010 [ответить] [смотреть все]  
  • +/
    скажите, если я хочу сделать более точное ограничение, допустим скрипт выполнять раз в пять минут, это не сильно нагрузит сервер? или для этого существуют другие решения?
     

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

     Добавить заметку
     Версия для печати
     
     Поиск заметки:
     

    Последние заметки
    - 12.05 Организация шифрованного бэкапа с помощью rdiff-backup, encfs и Dropbox
    - 11.05 Настройка беспроводного соединения в Debian GNU/Linux
    - 07.05 Использование Google Drive в Linux
    - 18.04 Использование нескольких сетевых стеков в Linux
    - 15.04 Восстановление стандартного KDE меню после его удаления (например, wine)
    - 11.04 Настройка gmirror при использовании GPT во FreeBSD 9
    - 09.04 Маршрутизатор на базе FreeBSD с приоритизация трафика средствами PF и ALTQ
    - 02.04 Частичное восстановление данных MySQL из бэкапа, созданного с использованием LVM
    - 21.03 Настройка DNSSEC в BIND 9.9
    - 17.03 Набор номера на Cisco IP Phone 7960/7940 из скрипта
    RSS | Следующие 15 записей >>


    ПОДПИШИСЬ НА ЖУРНАЛ Linux Format 2012!

    Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке, посвящённый Linux и свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных администраторов, учителей школ и преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости индустрии OpenSource, обзоры новинок свободного ПО, обучающие и методические статьи.

    Каждый, кто оформит подписку, получает бонусы и подарки- объёмные наклейки на системный блок, диск с архивом номеров за 2005-2011 г.г. и ежемесячно электронную версию журнала в pdf-формате.

    Оформить подписку на год


      Закладки на сайте
      Проследить за страницей
    Created 1996-2012 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    RUNNet TopList