Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: И снова интернет-шлюз  (Прочитано 1212 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн A.i.D.

  • Автор темы
  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
И снова интернет-шлюз
« : 06 Февраля 2014, 15:42:11 »
Хочу поднять интернет-шлюз, не обычный прокси для раздачи трафика, а именно интернет-шлюз с:
1. ограничением трафика по пользователям
2. статистикой по пребываем сайтам
3. отчетами
4. аутентификацией пользователей по AD, тех кто не в домене по ip.
SQUID умеет многое не умеет ограничивать трафик, SAMS парсит логи сквида и не может оборвать закачку файла, если у пользователя истек трафик во время закачки, аутентифицирует пользователей либо по IP либо по AD.

Сталкивался кто-нибудь?
« Последнее редактирование: 06 Февраля 2014, 15:59:56 от A.i.D. »
Ubuntu 12.04, Centos 6.2, SAMS, SQUID, VuurMuur, ISPConfig.

Оффлайн ulan44

  • Участник
  • *
  • Сообщений: 166
    • Просмотр профиля
Re: И снова интернет-шлюз
« Ответ #1 : 07 Февраля 2014, 17:20:32 »
У меня реализовано так. единственное. что если вам нужно чтоб проходила авторизация по 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();
« Последнее редактирование: 10 Февраля 2014, 09:46:17 от ulan44 »

Оффлайн A.i.D.

  • Автор темы
  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: И снова интернет-шлюз
« Ответ #2 : 10 Февраля 2014, 10:31:39 »
Хорошая реализация.. но везде, где используется SQUID невозможно оборвать закачку. Конечно,запрет по расширению - выход, но выход от части.
Большое спасибо за приведенный код. Похоже что из бесплатного софта - парсинг сквида является единственным решением.
Ubuntu 12.04, Centos 6.2, SAMS, SQUID, VuurMuur, ISPConfig.

 

Страница сгенерирована за 0.051 секунд. Запросов: 25.