среда, 11 февраля 2009 г.

Squid + LightSquid + Perl = ограничение по трафику

http://www.opennet.ru/tips/info/1797.shtml

итак.

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 создадим по образу и подобию всех остальных страниц с ошибками.
Я поставил что-бы получать другой текст. вот так получилось:


Превышен лимит

ПРЕВЫШЕН ЛИМИТ






Заблокированный URL:
%U




  • Вы превысили месячный лимит на интеренет.

    Если Вы считаете это неправильным, свяжитесь с отделом АСУ по телефонам
    1013 или 1066



    Если этот сайт необходим для работы, то он может быть открыт по служебной записке.



С Уважением отдел АСУ.


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=;chomp $totaluser;$totaluser=~s/^user: //;
$totalsize=;chomp $totalsize;$totalsize=~s/^size: //;

while () {

($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 числа следующего за установкой месяца.

Комментариев нет: