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

Лимит трафика для пользователей

http://www.gentoo.ru/node/8891

А теперь по порядку.
1) Настраиваем acl
Для начала создадим каталог. У меня /etc/squid/quota. Каталог должен быть доступен сквиду для чтения, руту для записи. В каталог помещаем файлик deny.lst. В него добавляем фиктивного юзверя и подопытного кролика (из под него будем ломиться в тырнет). Фиктивный нужен потому как сквид ругаеццо на пустой acl

baduser
mydomen+krolik


В файле не должно быть пустых строчек, после имен юзера не должно быть пробелов.

Затем пропишем этот файлик в конфиге сквида /etc/squid/squid.conf

.....
acl quota_deny proxy_auth "/etc/squid/quota/deny.lst"
http_access deny quota_deny
deny_info ERR_QUOTA quota_deny
......



Ну тут все просто. Создаем лист типа авторизации со списком юзверей в файле, запрещаем доступ и выводим страничку с сообщением. Особенности - запрещать надо до того как разрешать, к тому же ы строчках не должно быть лишних пробелов.
далее /usr/sbin/squid -k reconfigure и лезем сначала под собой (нам должно быть можно), затем под кроликом (ему долно быть нельзя). Файлик ERR_QUOTA должен лежать там где его ищет сквид (у меня /usr/share/squid/errors/English). Ежели заработало идем дальше.

2) Настраиваем квоты.
"Много думать надо нет". Файлик квот будет состоять из строк. Строки из слов. Слова разделены пробелами. Первое слово - лимит в байтах. Второе и последующее - имена юзерей. Ежели имен нет - квота распространяется на всех, для кого явно не указана. Создаем файл /etc/squid/quota/quota.conf

5000000
10000000 mydomen+loozer1 mydomen+loozer2
10000000 mydomen+looser3
1000000000 mydomen+looser4



Постарайся не писать лишних пробелов и не добавляй пустых строк. Здесь мы ограничиваем до ~5 метров всем. Лузерам 1, 2, 3 ставим 10 метров, лузеру 4 - 100.

3) Пишем скрипт на перле (/etc/squid/quota/getdeny.pl)

#! /usr/bin/perl
# koi8-r

#Вызов скрипта
# getdeny.pl файл_квот файл_лога

# читаем файл квот
# Формат файла: квота пользователь пользователь ....
# Заполняем хеш квоты{пользователь}=квота

open qfh, $ARGV[0];
my %quotas;
while (){
chomp;
@fields = split / /;
$quota=$fields[0];
splice @fields,0,1;
$default_quota=$quota if (!@fields);
foreach $user (@fields){
$quotas{$user}=$quota;
}
}
close qfh;


#Определяем системное время
@currenttime=localtime;

# Анализ сквидового лога (7 поле пользователь, 4 количество байтов (вычитаем из квоты),1 дата)

open ac, $ARGV[1];
while(){
s/\s+/ /g;
@fields = split / /;
#Дневное ограничение, 3 поле списка - день месяца
@logtime=localtime($fields[0]);
if ($logtime[3]==$currenttime[3]){
$quotas{$fields[7]}=$default_quota if !exists $quotas{$fields[7]};
$quotas{$fields[7]}-=$fields[4];
}
}

close ac;

# Выдаем список для запрещения доступа
print "baduser";
foreach $user (sort keys %quotas){
if ($quotas{$user}<0){
printf "\n%s", $user;
}
}



Скриптик после некоторых раздумий должен выдать список юзерей, превысивших квоту. Для отладки брал небольшой кусок лога, и ставил самому активному юзеру квоту в 10 байт. Как только убеждаемся в том что скриптик делает то что надо - ставим это дело в крон. Я постаил каждые 10 мин.

crontab -e и добавляем запись

*/10 * * * * /etc/squid/quota/getdeny.pl /etc/squid/quota/quotas.conf /var/log/squid/access.log >/etc/squid/quota/deny.lst;/usr/sbin/squid -k reconfigure

Вот собсно и все.


Глюки.
Вобщем как бы все хорошо, токмо мозилка и ие требуют поемуто авторизацию.

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