Нажмите CTRL-D чтобы добавить нас в закладки
HackZone.RU - Биллинг (учет трафика) для squid proxy
Войти / Регистрация / Участники
Определение даты выпуска iPhone по серийному номеру
-
Поиск по сайту
Форумы



Реклама

Поиск ТОП Добавить публикацию

Биллинг (учет трафика) для squid proxy

09.05.2007

Может плохо искал, а может действительно нет статей по написанию online биллинга для squid.

Вводные данные:

1. Сервер Linux FedoraCore3, mysql, squid, php+mysql

2. Авторизация пользователей squid сделана через сервер samba

Задача:

1. Учет web-трафика пользователей.

2. Установка лимитов пользователей (дневных, недельных, месячных) с автоматическим отключением

Решение:

1. Создаем именованный канал (named pipe) в который squid будет сливать статистику, а наш скрипт брать данные для обработки

mkdir /var/log/squid

/usr/bin/mkfifo /var/log/squid/pipe

chown squid.squid /var/log/squid -R

chmod 770 /var/log/squid

2. Создаем базу и структуру

create database squid_my;

use squid_my;

CREATE TABLE `logger` (

`id` int(11) NOT NULL auto_increment,
`userident` char(15) default NULL,
`date` date default NULL,
`time` time default NULL,
`elapsed` decimal(10,0) default NULL,
`bill` double default NULL,
`code` tinyint(3) unsigned NOT NULL default '0',
`status` decimal(3,0) default NULL,
`bytes` double default NULL,
`url` char(255) default NULL,
`host` char(15) default NULL,
`data` date default NULL,
`site` varchar(64) default NULL,
PRIMARY KEY (`id`),
KEY `logg2` (`userident`),
KEY `logg1` (`date`)
);

CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`username` char(12) default NULL,
`daily` bigint(15) NOT NULL default '0',
`weekly` bigint(15) NOT NULL default '0',
`monthly` bigint(15) NOT NULL default '0',
`maxdaily` bigint(15) NOT NULL default '0',
`maxweekly` bigint(15) NOT NULL default '0',
`maxmonthly` bigint(15) NOT NULL default '0',
`check_limit` char(1) default 'Y',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
);

3. Добавляем пользователя test с установкой лимитов (в байтах) (10Мб - дневной, 30Мб - недельный, 100Мб - месяц)

insert into users (username,daily,weekly,monthly) values ('test','test',1048576*10,1048576*30,1048576*100);

4. Создаем набор скриптов.

4.1. Файл /etc/squid/bin/config.php

set_time_limit(0);
ini_set('output_buffering',0);
$squid_log="/var/log/squid/pipe";

$db=mysql_connect("localhost","root","*****");
mysql_select_db('squid_my');
?>

4.2. Файл /etc/squid/bin/check_limit.php

#!/usr/local/bin/php -q

include('/etc/squid/bin/config.php');

while (1) {
list($login,$ip)=split(' ',chop(readline()));

$res='ERR';

if ($login) {

$stmt="select * from users where username='$login'";
$result=mysql_query($stmt);
$row=mysql_fetch_object($result);
MyDebug($stmt);

if ($row->username) {
if ($row->check_limit!='Y' or (
($row->maxdaily==0 or $row->daily<=$row->maxdaily) and
($row->maxweekly==0 or $row->weekly<=$row->maxweekly) and
($row->maxmonthly==0 or $row->monthly<=$row->maxmonthly))) $res='OK';
}

$fp=fopen('/var/log/squid/check_limit','a+');
fputs($fp,date("d.m.Y H:i:s")." -> $login - $res\n");
fclose($fp);
}
echo "$res\n";
ob_flush();
}

function readline() {
$f=fopen("php://stdin",'r') or die("can't read stdin");
$input=fgets($f,100);
fclose($f);
return $input;
}

function MyDebug($str) {
$fp=fopen('/var/log/squid/debug','a+');
fputs($fp,date("d.m.Y H:i:s")." -> $str\n");
fclose($fp);
}

?>

4.3. Файл /etc/squid/bin/squid2db.php

#!/usr/local/bin/php -q


include('/etc/squid/bin/config.php');

$fp = fopen($squid_log,"r+");
$my="/var/log/squid/access.log";
$mf=fopen($my,"a+");
while (1) {
$str=fgets($fp);
if ($str) {
fputs($mf,$str);
Parse($str);
}
}

fclose($fp);
fclose($mf);

// ****************************************
Function Parse($str) {
global $mf;
$d=date('Y-m-d');
$t=date('H:i:s');

$str=ereg_replace("[ ]+"," ",$str);

list($cts,$duration,$clientip,$codestatus,$objsize,$method,$rul,$username,$peerstatus,$objtype)=explode(' ',$str);

$valuepermeg=150; # 150 kop=1.5 roubles per meg
$valueperhour=0; # none per hour, leased line +2880p

list($cts,$duration,$host,$codestat,$objectsize,$method,$url,$userident,$peerstatus,$objtype)=explode(' ',$str);

$codestatus=explode('/',$codestat);
if ($codestatus[0]=="TCP_HIT") { $_code=0; }
if ($codestatus[0]=="TCP_MISS") { $_code=1; }
if ($codestatus[0]=="TCP_REFRESH_HIT") { $_code=2; }
if ($codestatus[0]=="TCP_REF_FAIL_HIT") { $_code=3; }
if ($codestatus[0]=="TCP_REFRESH_MISS") { $_code=4; }
if ($codestatus[0]=="TCP_CLIENT_REFRESH_MISS") { $_code=5; }
if ($codestatus[0]=="TCP_IMS_HIT") { $_code=6; }
if ($codestatus[0]=="TCP_SWAPFILE_MISS") { $_code=7; }
if ($codestatus[0]=="TCP_NEGATIVE_HIT") { $_code=8; }
if ($codestatus[0]=="TCP_MEM_HIT") { $_code=9; }
if ($codestatus[0]=="TCP_DENIED") { $_code=10; }
if ($codestatus[0]=="TCP_OFFLINE_HIT") { $_code=11; }
if ($codestatus[0]=="UDP_HIT") { $_code=12; }
if ($codestatus[0]=="UDP_MISS") { $_code=13; }
if ($codestatus[0]=="UDP_DENIED") { $_code=14; }
if ($codestatus[0]=="UDP_INVALID") { $_code=15; }
if ($codestatus[0]=="UDP_MISS_NOFETCH") { $_code=16; }
if ($codestatus[0]=="NONE") { $_code=17; }

$_status=$codestatus[1];

if ($username!='-') {
$stmt="select * from users where username='$username'";
$result=mysql_query($stmt);
$row=mysql_fetch_object($result);
}

if ($_code!=10 and $username!='-' and $_status!='404' and $_status!='400') {
$url=str_replace("'","\\'",$url);
$site=parse_url($url);
$bill=(($duration/60000)*($valueperhour/60))+(($objectsize/1048576)*$valuepermeg);
$stmt="insert into logger (date,time,elapsed,bill,code,status,bytes,site,url,userident,host) ".
" values ('$d','$t','$duration','$bill','$_code','$_status','$objectsize','".$site[host]."','$url','$userident','$host')";
$result=mysql_query($stmt);
fputs($mf,"$stmt\n");
if (mysql_errno()) fputs($fp,'MySQL error #'.mysql_errno() . ': ' . mysql_error() . "\n");

$stmt="update users set daily=daily+$objectsize,weekly=weekly+$objectsize,monthly=monthly+$objectsize where username='$username'";
$result=mysql_query($stmt);
fputs($mf,"$stmt\n============\n");
if (mysql_errno()) fputs($fp,'MySQL error #'.mysql_errno() . ': ' . mysql_error() . "\n");
}
}

?>
4.4. Файл /etc/squid/bin/reset_cnt.php
#!/usr/local/bin/php

include('/etc/squid/bin/config.php');

$d=date("j");
$dow=date("w");

$set="daily=0";
if ($dow=='m' or $dow==1) $set.=",weekly=0";
if ($d==1) $set.=",monthly=0";

$stmt="update users set $set";
$result=mysql_query($stmt);
$fp=fopen("/var/log/squid/reset","a+");
fputs($fp,"$stmt;\n");
fclose($fp);
?>

 

5. Правим /etc/inittab

5.1. Добавляем строку

prox:2345:respawn:/etc/squid/bin/squid2db.php

5.2. Перепускаем inittab

/sbin/init Q

 

6. Правим /etc/squid/squid.conf

заменяем

cache_access_log /var/log/squid/pipe

добавляем строки

external_acl_type check_limits ttl=60 %LOGIN %SRC /etc/squid/bin/check_limit.php

acl have_limit external check_limits

после правил авторизации вставляем

http_access deny !have_limit

7. Прописываем в cron (не забываем перепустить его потом)

0 0 * * * /etc/squid/bin/reset_cnt.php

7. Перезапускаем squid

/etc/init.d/squid restart

-----------

Copyright by Alex Varavva

 

При копировании материалов ссылка на HackZone.RU обязательна

Добавить страницу в закладки

 Детали
Категория: Системное администрирование
Опубликовал: DiMan
Просмотров: 26393
Проголосовало через SMS: 0
  Разместить у себя на сайте
Прямая ссылка
HTML
BBCode ссылка
BBCode ссылка с текстом

 Комментарии (оставить свой комментарий можно здесь)
Только зарегистрированные пользователи могут оставлять комментарии

Зарегистрироваться *** Авторизоваться


 Последние новости и статьи  Последние сообщения с форумов
  • Релиз ядра Linux 5.9
  • Российские хакеры вооружились уязвимостью Zerologon
  • Тысячи приватных звонков американских заключенных оказались в отк...
  • Шифровальщик атаковал немецкую компанию Software AG
  • Злоумышленники используют службу Windows Error Reporting для бесф...
  • Microsoft предупредила о вымогателях, которые выдают себя за МВД ...
  • Инфостилер Valak ворует информацию из почтовых систем Microsoft E...
  • GitLab обнаружил множество уязвимостей в исходном коде проектов с...
  • Хакеры используют службу WER в бесфайловых кибератаках
  • Ботнет HEH способен уничтожить все данные на IoT-девайсах

    Все новости... Все статьи... Прислать новость RSS
  • Взлом и безопасность / Game console » Re: консольные команды для Call of Duty 4 - Modern Warfare
  • Взлом и безопасность / Разное » Re: Нужна помощь в скачивании файла
  • Взлом и безопасность / Разное » Re: Нужна помощь в скачивании файла
  • Взлом и безопасность / Разное » Нужна помощь в скачивании файла
  • Разное / Предложения работы » требуется взлом почт на постоянной основе
  • Разное / Предложения работы » необходим взлом почты
  • Взлом и безопасность / Новичкам » Re: Сборщик емэйлов "обрезает" адреса.
  • Взлом и безопасность / Новичкам » Re: Анализ открытых баз данных ElasticSearch (легкий гайд)
  • Взлом и безопасность / Новичкам » Re: Сборщик емэйлов "обрезает" адреса.
  • Взлом и безопасность / Новичкам » Re: Сборщик емэйлов "обрезает" адреса.

    Все форумы... RSS


  • Разместить рекламу
    © HackZone Ltd. 1996-2020. Все права зарегистрированы.
    Перепечатка материалов без согласования и указания источника будет преследоваться по Закону

    О проекте | История проекта | Размещение рекламы | Обратная связь | Правила поведения на портале
    contador de visitas счетчик посещений

    #{title}

    #{text}

    x

    #{title}

    #{text}