The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"SQUID статистика и все остальное"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [Проследить за развитием треда]

"SQUID статистика и все остальное"
Сообщение от JGU emailИскать по авторуВ закладки on 07-Авг-03, 04:43  (MSK)
Смотрю в конференции дофига вопросов на тему учета траффика а так же ограничения пользователей при помощи SQUID-а.
Используя материалы, найденне мной на OpenNet.. и не только, я сделал на своем сервере два типа считалок траффика а так же блокирования юзеров по достижению какого-либо лимита.

Подсчет траффика:
1. по завершении трудового дня, т.е. не в реалтайме - ночером, в 24:00 читается лог, подсчитывается траффик и апдейтается MySQL-база
2. в реальном времени, с периодическим сбрасыванием рассчитанного траффика в файл/MySQL.

"Обламывание" юзеров:
1. при помощи ipfw
2. при помощи acl-ей SQUID.

Короче, ежели кто хочет, могу выложить все что я наработал по этой теме. К тому же все енто еще в процессе разработки (но уже работает), и совместными усилиями возможно мы сможем довести до ума.

З.Ы. Один голова хорошо - а два сапога пара

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "SQUID статистика и все остальное"
Сообщение от Абадонна Искать по авторуВ закладки on 11-Авг-03, 05:26  (MSK)
>тема интересная, тем более для таких как я новичков, хотелось бы узнать как ограничить траффик в squid, я еще эту проблему не разрешил, буду благодарен за подсказку.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "SQUID статистика и все остальное"
Сообщение от JGU emailИскать по авторуВ закладки on 11-Авг-03, 06:20  (MSK)
OK
Тады начну с простейшего варианта:
авторизацию в сквиде можно настроить вообще как угодно, т.е. и по именам под которыми юзера они вощли в домен NT-шный и по IP (если у тебя в сетке статические IP, или DHCP, динамически обновляющий записи на DNS сервере - тож вариант). Можно ваще привязать внешнюю прогу, написанную тобой, которая будет получать от сквида параметры типа IP, чего хочет, куда лезет и т.д. ну и возращать OK иили ERR  в зависимости от каких угодно тебе параметров.
В своем случае я делал авторизацию по IP, т.к. юзера у нас в сети имеют закрепленные за ними машины и никуда не скачут.
После чего заделал MySQL базу, в которой три таблички:

USERZ таблица пользователей
---------------------------
IP - сопесно IP-шник
GID - идентификатор группы, к которой принадлежит юзер
STATE - залоченный или нет юзер
FLAGS - про енто потом скажу

GROUPS - группы
--------------------------
ID - идентификатор
NAME
LIMIT - лимит траффика для группы
STATE - этим флжком можно залочить всю группу

PERMON - статисктика по месяцам
------------------------
MON - месяц
IP
TRAFF - трафик юзера за месяц, в тч и за текущий

В сквидовском конфиге прописываем acl src из внешнего файла и делаем разрешить http_acces тлько тем, кто находится в этом файле.
Конфиг имеет вид:

http_port 192.168.0.250:3128
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
cache_mem 64 MB
error_directory /usr/local/etc/squid/errors/Russian-koi8-r
#лучче происать путь на русские странички с сообщениями об ошибках, там будет лежать наша страничка, на которую перенапрвляются юзера с исчерпанными лимитами
maximum_object_size 16384 KB
quick_abort_pct 60
negative_ttl 1 minutes
dns_nameservers 192.168.0.250
positive_dns_ttl 6 hours
half_closed_clients on

acl ournetw src 192.168.0.0/24

acl shtraff src "/usr/local/etc/squid/shtraff.txt"
#тута лежит список ip-шников, кому можно в инет
http_access deny !shtraff
#все кто не в списке - блочим нафиг
#http_access allow ournetw
http_access deny all

deny_info ERR_SHTRAFF_DENIED shtraff
#указываем имя странички, куда перенаправляются юзера, если они не списке разрешенных

устал блин, работать надо
подожду ваших комментариев и приведу примеры скриптов моих

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "SQUID статистика и все остальное"
Сообщение от Vasia Искать по авторуВ закладки on 11-Авг-03, 08:53  (MSK)
Сказав "А" скажи и "Бэ" :) Раз уж начал выкладывай тему целиком, в принципе интересный вариант, есть вероятность что комуто пригодится, так как вопросов на эту тему среди админов достаточно.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "SQUID статистика и все остальное"
Сообщение от JGU emailИскать по авторуВ закладки on 11-Авг-03, 10:03  (MSK)
>Сказав "А" скажи и "Бэ" :) Раз уж начал выкладывай тему целиком,
>в принципе интересный вариант, есть вероятность что комуто пригодится, так как
>вопросов на эту тему среди админов достаточно.

угумс, говорю "Б" ->
Еще раз скажу что ЭТОТ вариант не очень хорош тем что он не в реалтайме работает, т.е. если юзверь в течении дня превысит свой лимит, то залочится он на следующий день, но это не страшно - можно просто излтшек перенсьти на следующий месяц(неделю или год... как пожелаете). У меня есть и реалтамовская наработка когда SQUID пайпится на прогу, которая уже смотрит лимит и в случае превышения или по внешней команде блокирует IP используя файрвол, но это я в следующей теме опишу.

ну следуем далее...
Упростим задачу а заодно и сделаем более гибко. Таблицу GROUPS нафиг удаляем а в табличку USERZ добавим поле LIMIT - у каждого IP свой лимит будет.
для того, шобы обновить данные в нашей базе  - необхдимо перелопатить squid.log а заодно и запаковать его. Я написал скрипт на перле, который стартует в 00:05 каждые сутки.
алгоритм скриптика следующий:

1. стопаем squid;
2. упаковываем и удаляем access.log;
3. читаем в массив либо напрямую из файла построчно, лучше в массив - больше возможностей над данными поиздеваться;
4. подсчитываем на каждый IP набежавший за день траффик;
5. обновляем данные в таблицах базы;
6. на основе данных таблицы USERZ формируем файл со списком непревысивших свой лимит;
7. запускаем squid;

а вот и сам скрипт:

#!/usr/bin/perl -w
#squidloger.pl

use Mysql;

my $prev_date=`date -v-1d '+%Y%m%d'`;#День вчерашний
chomp($prev_date);

`/usr/local/squid/logs/squidlog_rotate.sh`;
#у меня шеловский скрипт внешний, который bzip-ует файл и дает ему имя #вчерашняя_датаaccess.log.bz2

my $database_name="squid_stat2";
my $log_path='/usr/local/squid/logs/';
my $fn1=$log_path.$yt_d.'access.log.bz2';

my $dbh=Mysql->Connect("",$database_name) || die "Cannot connect to Mysql:$database_name : $!\n";

my @DAT=`bzcat '$fn1'`;#Читаем из запакованного файла access.log в массив

my %userz=();#hash - в него будем считать

foreach (@DAT){
chomp;
if (/(\d{10})\.\d{3}\s+\d+\s\d+\.\d+\.\d+\.(\d+)\s.+\/\d+\s(\d+)\s\w+\s(.+)\s-.+/)
{
$userz{$2}+=$3;
#В $2 - IPшник в $3 кол-во байт
#пробегаемся по массиву и суммируем в HASHе %userz чего кто накачал
};
};


$prev_mon=`date -v-1d '+%m'`;#Вчерашний месяц
chomp($prev_mon);

#Вот здесь начинаем бежать по хешу %userz
#и обновлять данные в табличке permon;
foreach (keys %userz) {
print ("$_\t$userz{$_}\n");
#Так просто вывожу на STDOUT чего кто за день накачал
#крон в почте мне пришлет
my $upd_query=sprintf("update permon,userz set permon.traff=permon.traff+%d where permon.clientip=%d and permon.mon=%d and userz.clientip=permon.clientip and userz.state;",$userz{$_},$_,$prev_mon);
#Перевожу на русский этот мутный запрос:
#инкрементируем в теблице PERMON значение поля TRAFF на кол-во закачанных за день байт
#только в тех записях, где PERMON.CLIETNIP=нужный нам IP, PERMON.MON=вчерашний
#месяц, USERZ.STATE=1
#Проверку USERZ.STATE я добавил потому что
#если USERZ.STATE=0 - значит это уже заблокированный IP  и траффик на него
#можно не считать
$dbh->Query($upd_query);
};


$curmon=`date '+%m'`;#Текущий месяц
chomp($curmon);

if ($curmon>$yt_d) {
#Если $curmon>$prev_mon - значит новый месяц наступил и необходимо
#создать новые записи в PERMON для всех существующих в USERZ IP-шников
#на новый месяц и с нулевыми значениями TRAFF.
my $ins_query=sprintf("insert into permon select clientip,%d,0 from userz;",$curmon);
$dbh->Query($ins_query);
};

$upd_query=sprintf("update permon,userz set userz.state=(userz.tlimit>=permon.traff) where permon.clientip=userz.clientip and permon.mon=%d;",$curmon);
#обновляем таблицу USERZ
#если PERMON.TRAFF>USERZ.LIMIT и PERMON.MON=текущий_месяц - значит USERZ.STATE=0;
$dbh->Query($upd_query);

open (F, ">/usr/local/etc/squid/shtraff.txt");
#Формируем файл shtraff.txt
my $qr=$dbh->Query("select clientip from userz where state=1;");
#Выбираем из таблицы USERZ только тех, у кого STATE=1 - короче
#всех кто не заблокирован
while (@qline=$qr->FetchRow) {
print F "192.168.0.$qline[0]\n";
#... ну и пишем в файл
};
close F;

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "SQUID статистика и все остальное"
Сообщение от denn emailИскать по авторуВ закладки on 11-Авг-03, 10:11  (MSK)
а как фарволом зверей отключаешь? их же нужно в автомате включать и выключать. если номер правила в ipfw  на юзера учитыватьв базе?
  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "SQUID статистика и все остальное"
Сообщение от JGU emailИскать по авторуВ закладки on 11-Авг-03, 10:22  (MSK)
> а как фарволом зверей отключаешь? их же нужно в автомате включать
>и выключать. если номер правила в ipfw  на юзера учитыватьв
>базе?

ну в случае блокирования через IPFW проще выделить диапазон правил в файрвола, например с 3000 по 3256 и все, т.е. каждому IP соответствует правило 3xxx - где xxx это IPадрес машины.
а выглядеть это может так:

3001 allow tcp from 192.168.0.1 to proxyhost proxyport
3012 allow tcp from 192.168.0.12 to proxyhost proxyport
3025 allow tcp from 192.168.0.25 to pxoyhost proxyport
30256 deny ip from any to proxyhost proxyport

соответственно если превышен лимит у 192.168.0.25 то надо удалить правило 3025

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "SQUID статистика и все остальное"
Сообщение от JGU emailИскать по авторуВ закладки on 11-Авг-03, 10:27  (MSK)
> а как фарволом зверей отключаешь? их же нужно в автомате включать
>и выключать. если номер правила в ipfw  на юзера учитыватьв
>базе?

а можно и от обратного, т.е.
вначале идут запреты а последним правилом разрешение для всей сетки

фиг знает что лучше

  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "SQUID статистика и все остальное"
Сообщение от denn emailИскать по авторуВ закладки on 11-Авг-03, 10:33  (MSK)
>> а как фарволом зверей отключаешь? их же нужно в автомате включать
>>и выключать. если номер правила в ipfw  на юзера учитыватьв
>>базе?
>
>а можно и от обратного, т.е.
>вначале идут запреты а последним правилом разрешение для всей сетки
>
>фиг знает что лучше

как по мне, можно пойти по принципу ipa, писанул в ипфв правило на зверя -занес номер в базу. там, он пополнит счет - по этому номеру дал команду ipfw del.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "SQUID статистика и все остальное"
Сообщение от JGU emailИскать по авторуВ закладки on 11-Авг-03, 10:42  (MSK)
>>> а как фарволом зверей отключаешь? их же нужно в автомате включать
>>>и выключать. если номер правила в ipfw  на юзера учитыватьв
>>>базе?
>>
>>а можно и от обратного, т.е.
>>вначале идут запреты а последним правилом разрешение для всей сетки
>>
>>фиг знает что лучше
>
>как по мне, можно пойти по принципу ipa, писанул в ипфв правило
>на зверя -занес номер в базу. там, он пополнит счет -
>по этому номеру дал команду ipfw del.

угумс
тож вариант


  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "SQUID статистика и все остальное"
Сообщение от Дима emailИскать по авторуВ закладки on 11-Авг-03, 10:40  (MSK)
Тоже занят этой темой. Я сделал так.
У меня скрипт на перле реал-тайм ловит логи сквида, сразу пишет в базу MySQL, при превышении лимита заносит имя пользвателя (у меня NCSA-аутентификация) в файл LIMIT.USERS , потом передергивает сквид который работает вместе со squidGuard. Если имя пользователя есть в файле LIMIT.USERS - squidGuard перенаправляет все запросы пользователя на страничку статистики.
Сейчас доделываю web-страничку управления системой (установка через браузер новых пользователей, лимитов и пр.).
Все находится в стадии тестирования. Но работает хорошо.
Если кому интересно - могу скинуть - бо сам пока до всего дошел - заколебался.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "SQUID статистика и все остальное"
Сообщение от denn emailИскать по авторуВ закладки on 11-Авг-03, 10:45  (MSK)
какой интервал времени на обновление
  Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "SQUID статистика и все остальное"
Сообщение от JGU emailИскать по авторуВ закладки on 11-Авг-03, 10:49  (MSK)
у меня не скрипт а на Сях написана софтинка, на которую сквидовский лог перенаправляется а в памяти сидит массив с текущей статистикой и каждые 10 минут по сигналу HUP все енто скидывается в MySQL. Просто я не решился в реальном времени писать в MySQL - мне кажется процессорного времени много скушается.
В принципе можно  сделать расашренную область памяти а сквиду (или squidGuard-у) прописать путь к внешней програмке acl которая из этой самой расшаренной области памяти и будет тянуть текущий статус пользователя и соответственно возвращать ERR или OK.
Я просто предпочитаю идти по пути минимальной загрузки системы ;)
  Рекомендовать в FAQ | Cообщить модератору | Наверх

13. "SQUID статистика и все остальное"
Сообщение от mAdDuke emailИскать по авторуВ закладки on 11-Авг-03, 11:14  (MSK)
Доброе время суток!
тут вот все так хорошо описано, но как быть с тем, что сквид дает ну очень приблизительную статистику: я сначала тоже считал логами сквида - прописал в crontab команду, которая скидывает на мой маил отчетик (у sarg'a есть такая возможность). Смортю один пользователь начинает фигеть я ему говорю "еще 1 мб и я тебя отключу" а он мне - "я в инете не сижу". Стал разбираться - оказывается сквид посчитал весь его трафик по локалке (файлы по расшаренным ресурсам), в общем отказался я считать трафик сквидом, поставил trafd, написал скриптики на awk все гладко и чисто, правда не в real-time ...
p.s. а еще: кто-нибудь может сказать - sarg какой трафик показывает - только глобальный или глобальный + из кэша?
  Рекомендовать в FAQ | Cообщить модератору | Наверх

14. "SQUID статистика и все остальное"
Сообщение от JGU emailИскать по авторуВ закладки on 11-Авг-03, 12:17  (MSK)
>Доброе время суток!
>тут вот все так хорошо описано, но как быть с тем, что
>сквид дает ну очень приблизительную статистику: я сначала тоже считал логами
>сквида - прописал в crontab команду, которая скидывает на мой маил
>отчетик (у sarg'a есть такая возможность). Смортю один пользователь начинает фигеть
>я ему говорю "еще 1 мб и я тебя отключу" а
>он мне - "я в инете не сижу". Стал разбираться -
>оказывается сквид посчитал весь его трафик по локалке (файлы по расшаренным
>ресурсам), в общем отказался я считать трафик сквидом, поставил trafd, написал
>скриптики на awk все гладко и чисто, правда не в real-time
>...
>p.s. а еще: кто-нибудь может сказать - sarg какой трафик показывает -
>только глобальный или глобальный + из кэша?

Извини но мне кажется чтото здесь не так.
Какое отношение SQUID имеет к расшаренным ресурсам? Неужели юзерные машины обращаются к потру прокси-сервера когда по самбе файлы тянут, или что ты имел в виду под "расшаренные ресурсы"?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

16. "SQUID статистика и все остальное"
Сообщение от mAdDuke emailИскать по авторуВ закладки on 11-Авг-03, 12:43  (MSK)
JGU:
"расшаренные ресурсы" в нашей локалке - это папки на компах доступ к которым осуществляется с применением политики безопасности Windows.
Я тогда сильно не разбирался, но точно определил что почти весь трафик, посчитанный sarg'eм был не www, возможно почта, не уверен, не помню.

На счет учета и ограничений трафика есть хорошая штука ipa (живет в /usr/ports/sysutils/ipa) - основана на правилах firwall'a (count ipfw), есть лимиты, сроки действия лимитов, многое другое - есть два samples, в которых все на РУССКОМ языке расписано, работает отлично - статистика в виде таблиц аля MySQL, но у меня не прижилась - была необходимость перевести всех на прозрачный прокси, а когда пакеты "заруливаются" на прокси их перестает считать ipa. В общем, я долго грустил по поводу того что прихлось ее убрать (одна конструкция "пользователю дается 20 метров в день, но не более 10 мегабайт за час, если больше 10 метров за час, то пользователь вылетает на 2 часа, если больше 20 в день, то до конца дня" чего стоит, и все это - несколько строк в одном конфиге).


  Рекомендовать в FAQ | Cообщить модератору | Наверх

15. "SQUID статистика и все остальное"
Сообщение от JGU emailИскать по авторуВ закладки on 11-Авг-03, 12:21  (MSK)
Конечно оптимальным является подсчет траффика при помощи файрвола или демона специально под енто дело заточенного.. типа trafd.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

20. "SQUID статистика и все остальное"
Сообщение от boykov emailИскать по авторуВ закладки on 12-Авг-03, 14:30  (MSK)
>Конечно оптимальным является подсчет траффика при помощи файрвола или демона специально под
>енто дело заточенного.. типа trafd.

Вообще-то есть еще один метод -- пользовать bpf То есть ловить все пакеты и класть инфу о них в базу. Вариантов тут много есть.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

17. "SQUID статистика и все остальное"
Сообщение от Михаил emailИскать по авторуВ закладки on 11-Авг-03, 13:49  (MSK)
>p.s. а еще: кто-нибудь может сказать - sarg какой трафик показывает -
>только глобальный или глобальный + из кэша?
он показывает то, что в логах сквида найдет
и вообще - сарг ничего сам не показывает, он только генерит отчеты из логов, сам он ничего не считает и не меряет!
  Рекомендовать в FAQ | Cообщить модератору | Наверх

18. "SQUID статистика и все остальное"
Сообщение от mAdDuke emailИскать по авторуВ закладки on 11-Авг-03, 14:00  (MSK)
Михаил:
хорошо, задам вопрос по другому:
сквид пишет в логи все что отдал (или не отдал) пользователю, без разбору, или он все таки разделяет глоб. трафик от кэша, и что значит IN-CACHE-OUT в отчетах sarg'a, сколько "положено" в кэш, или, наоборот, сколько "взято" - ведь "взять" может не только тот кто "положил"?, "вот в чем вопрос" - почти цитата.


  Рекомендовать в FAQ | Cообщить модератору | Наверх

19. "SQUID статистика и все остальное"
Сообщение от Михаил emailИскать по авторуВ закладки on 11-Авг-03, 17:39  (MSK)
>Михаил:
>хорошо, задам вопрос по другому:
>сквид пишет в логи все что отдал (или не отдал) пользователю, без
>разбору, или он все таки разделяет глоб. трафик от кэша, и
>что значит IN-CACHE-OUT в отчетах sarg'a, сколько "положено" в кэш, или,
насколько я помню, это означает попадания в кэш и промахи мимо кэша.

>наоборот, сколько "взято" - ведь "взять" может не только тот кто
>"положил"?, "вот в чем вопрос" - почти цитата.
положить может только сам сквид, и когда брать из кэша, а когда из интернета он решает сам.
если происходит промах мимо кэша и если политика кэширования позволяет, то сквид положит в кэш файл, который он скачал для какого-то пользователя.

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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