У меня реализовано так. единственное. что если вам нужно чтоб проходила авторизация по ip нужно подправить конфиг, а и еще домен у меня на samba4.
Реализован такой паровоз.
squid -> perl парсер -> mysql -> Самописный веб на smarty
Конфиг осьминога
http_port 10.0.100.252:3128 transparent
cache_peer 10.0.100.250 parent 3128 3130 no-query default login=USER:PASS
never_direct allow all
visible_hostname web.my.domen.ru
cache_effective_user proxy
cache_effective_group proxy
cache_mgr admin@my.domen.ru
access_log /var/log/squid3/access.log
cache_log /var/log/squid3/cache.log
acl net src 10.0.100.0/255.255.255.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563
acl all src 0.0.0.0/0.0.0.0
acl Safe_ports port 80 #http
acl Safe_ports port 21 #ftp
acl Safe_ports port 443 563 9443 #https, snews
acl Safe_ports port 70 #gopher
acl Safe_ports port 210 #wais
acl Safe_ports port 1025-65535 #unregistered ports
acl Safe_ports port 280 #http-mgmt
acl Safe_ports port 488 #gss-http
acl Safe_ports port 591 #filemaker
acl Safe_ports port 777 #multiting http
acl CONNECT method CONNECT
extension_methods REPORT MERGE MKACTIVITY CHECKOUT
# Выключаем протокол icp
icp_port 0
# Свой DNS
dns_nameservers 10.0.100.250
dns_v4_first on
############### Редирект поисковиков ####################
acl search_engines dstdomain ya.ru
http_access deny search_engines
deny_info http://google.ru search_engines
#########################################################
##########Запрет доступа на скачивание файлов############
acl multimedia urlpath_regex -i \.mp3$ \.mpeg$ \.avi$ \.mov$ \.exe$ \.rar$ \.flv$ \.swf$
http_access deny multimedia
#########################################################
#############Закрываем доступ на сайты###################
acl fuckyou dstdomain "/etc/squid3/limit/sites/deny_sites"
http_access deny fuckyou
#########################################################
##########Отключаем кеш для определенных сайтов##########
#######на mail.ru не работало приклепление файлов########
acl sites_nocache dstdomain "/etc/squid3/limit/sites/sites_nocache"
no_cache deny sites_nocache
#########################################################
########Доступ к сайтам без всяких паролей и авторизаций#########
acl worksite src 10.0.100.0/24
acl inet url_regex "/etc/squid3/limit/sites/work_site"
http_access allow inet worksite
#################################################################
####################Авторизация NTLM#############################
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 80
auth_param ntlm keep_alive on
auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 5
auth_param basic realm SMOK Proxy server
auth_param basic credentialsttl 2 hours
external_acl_type nt_group ipv4 ttl=120 %LOGIN /usr/lib/squid3/wbinfo_group.pl
acl SMOK external nt_group Internet
acl nt_group proxy_auth REQUIRED
#################################################################
#########Пользователи которым закрыт доступ к интернету##########
acl banusers proxy_auth_regex -i "/etc/squid3/limit/users/users_deny"
deny_info ERR_QUOTA banusers
http_access deny banusers
#################################################################
#######Пользователи которым можно заходить без авторизации#######
acl non_auth src "/etc/squid3/limit/sites/ip_server"
http_access allow non_auth
#################################################################
http_access allow SMOK
deny_info ERR_NO_Inet all
http_access deny all
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_reply_access allow all
icp_access allow all
coredump_dir /var/spool/squid3
error_directory /usr/share/squid3/errors/Russian-1251/
pid_filename /var/run/squid.pid
Структура таблицы users_proxy
CREATE TABLE IF NOT EXISTS `users_proxy` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) NOT NULL, //Полные ФИО
`login` varchar(32) NOT NULL, //Логин в домене
`pass` varchar(32) NOT NULL, //Необязательный параметр
`status` int(1) NOT NULL, //Вкл Выкд Анлим
`traff` bigint(11) NOT NULL, //Текущий трафик в байтах
`mac` varchar(17) NOT NULL DEFAULT '00:00:00:00:00:00', // тут понятно мак для авторизации через мак адрес
`limit_mb` bigint(11) NOT NULL, //Лимит в байтах, если анлим тогда 0 1Мб*1024*1024=1048576(байт)
`limit_history` bigint(11) NOT NULL, //Лимит для истории
`check_data` date NOT NULL, //Закрыт пользователь до определенной даты
`data_limit` datetime NOT NULL, //Дата когда закончился трафик
`set_limit` int(1) NOT NULL DEFAULT '0', //Функция добавление халявы пользователем через корпоративный джабер 0 не добавлял 1 добавлял, доступна только 1 раз в месяц
`mesg_data` datetime NOT NULL, //Дата когда пользователь воспользовался услугой халявы
UNIQUE KEY `id` (`id`),
UNIQUE KEY `login` (`login`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=95 ;
Настройка Crontab
#баним пользователей прокси за превышение лимита
*/5 * * * * root /etc/squid3/limit/squid.pl
#подсчет трафика прокси
* * * * * root /etc/squid3/limit/squid_to_mysql.pl
#обнуляем лимиты прокси
00 1 1 * * root /etc/squid3/limit/limit_null.pl
Бан пользователей
#!/usr/bin/perl -w
use FindBin;
use lib $FindBin::Bin;
require 'inc/db.pl';
$db=Connect();
$q=$db->prepare("select login from users_proxy where limit_mb<traff and limit_mb<>'0' or status='0'");
$q->execute;
open(FFF,"> /etc/squid3/limit/users/users_deny");
while (($login) = $q->fetchrow_array()){
$q1=$db->prepare("update users_proxy set status='0' where login='$login'");
$q1->execute;
print (FFF "$login\n");
}
close(FFF);
$q->finish();
$db->disconnect();
system `echo no_user >> /etc/squid3/limit/users/users_deny`;
system `cat /dev/null > /var/log/squid/cache.log`;
system "/usr/sbin/squid3 -k reconfigure";
Парсер логов для сквида
#!/usr/bin/perl
use FindBin;
use lib $FindBin::Bin;
require 'inc/db.pl';
$DBH=Connect();
system `/etc/squid3/limit/access_tmp.sh`;
open(FIL, "/tmp/squid_to_mysql") || die;
while($line=<FIL>) {
@mass = split("\t",$line);
$DBH -> do ("INSERT INTO tmp_squid (addr, user_name, time, size, link_href) VALUES (inet_aton('$mass[0]'), '$mass[1]', '$mass[2]', '$mass[3]', '$mass[4]' )");
}
close(FIL);
system(`rm /tmp/squid_to_mysql`);
$STH = $DBH->prepare("SELECT tmp_squid.addr, users_proxy.id, tmp_squid.user_name, tmp_squid.time, tmp_squid.size, tmp_squid.link_href
from tmp_squid, users_proxy
where tmp_squid.user_name=users_proxy.login");
$STH->execute();
while ( @lans = $STH->fetchrow_array ) {
$DBH -> do ("INSERT INTO data_squid (addr, id_user, user_name, time, size, link_href) VALUES ('$lans[0]', '$lans[1]' , '$lans[2]' , '$lans[3]', '$lans[4]', '$lans[5]')");
}
$STH1 = $DBH->prepare("select tmp_squid.user_name, sum(tmp_squid.size) from tmp_squid, users_proxy where tmp_squid.user_name=users_proxy.login group by user_name");
$STH1->execute();
while ( @proxy = $STH1->fetchrow_array ){
$DBH -> do ("update users_proxy set traff=traff+'$proxy[1]' where login='$proxy[0]'");
}
$DBH -> do ("Truncate table tmp_squid ");
1;
Приводим лог файл в нормальный вид для скрипта парсера что находится выше access_tmp.sh
#!/bin/bash
myfile="/var/log/squid3/access.log"
tmpf="/tmp/squid"
tmp_sql="/tmp/squid_to_mysql"
awk '{FS="[ ]+"} {print $3"\t"$8"\t"$1"\t"$5"\t"$7}' $myfile > /tmp/squid
cat /dev/null > $myfile
sed -e "s/'//g" $tmpf > $tmp_sql
rm /tmp/squid
Обнуляем лимиты один раз в месяц первого числа каждого месяца
#!/usr/bin/perl
use FindBin;
use lib $FindBin::Bin;
require 'inc/db.pl';
$DBH=Connect();
$STH = $DBH->prepare("select id, login, limit_mb, limit_history from users_proxy");
$STH->execute;
while (($id, $login, $limit_mb, $limit_history) = $STH->fetchrow_array()){
$STH1 = $DBH->prepare("update users_proxy set limit_mb='$limit_history', traff='0', data_limit='0000-00-00 00:00:00', set_limit='0', status_mesg='0' where id='$id'");
$STH1->execute;
$STH2 = $DBH->prepare("update users_proxy set status='1' where limit_mb>traff and limit_mb<>'0'");
$STH2->execute;
}
$STH1->finish();
$STH->finish();
$DBH->disconnect();