Лимит по траффику...

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Urgor
лейтенант
Сообщения: 663
Зарегистрирован: 2006-03-14 16:30:18
Откуда: Гилея (СПб)
Контактная информация:

Непрочитанное сообщение Urgor » 2006-04-10 13:02:08

Приделал режика :) Прикольно.... вежливый посыл на попытку качать порнуху и кины/музон. Настройка простейшая.
Только остался один косяк с прозрачным режимом работы сквида: адреса хостов ресольвятся "когда как", но если дать команду nslookup -- находит, а ип подставленный в урл работает... странно. Сделал пока не прозрачняй, но канал у юзверя зажался и на почту.
Власть в руках у чужаков, и ты им платишь дань...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2460 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Urgor
лейтенант
Сообщения: 663
Зарегистрирован: 2006-03-14 16:30:18
Откуда: Гилея (СПб)
Контактная информация:

Непрочитанное сообщение Urgor » 2006-04-26 7:31:26

Пока выложу то что есть, хотя еще хотса добавить работу юзера по расписанию, а не как сейчас -- круглосуточно. Но времени, увы, пока нету :(
Проксик у меня не прозрачный, части народа нужна была авторизация, а прикручивать ntlm не хотелось. Так что тем у кого прозрачный проксик, придется поменять запросы и строки что пишутся в файл с фарволом.... hostdeny нужен для портсентру, туда вносятся хосты что сканили машину.

Код: Выделить всё

CREATE DATABASE trafd;
USE trafd;

CREATE TABLE `groups` (
  `idGroup` int(10) unsigned NOT NULL auto_increment,
  `NameGroup` char(45) NOT NULL default '',
  `quota` char(12) NOT NULL default '100000000',
  `email` char(30) NOT NULL default '',
  `boss` char(30) NOT NULL default '',
  `step1` char(12) NOT NULL default '',
  `mailed` char(1) NOT NULL default '0',
  PRIMARY KEY  (`idGroup`)
) TYPE=MyISAM;

CREATE TABLE `hostallow` (
  `idHost` int(10) unsigned NOT NULL auto_increment,
  `hostname` char(40) NOT NULL default '',
  `idGroup` int(10) unsigned NOT NULL default '0',
  `ttl` date NOT NULL default '0000-00-00',
  `bps` char(12) NOT NULL default '64000',
  `bps2` char(12) NOT NULL default '32000',
  `User` char(30) NOT NULL default '',
  `pwd` char(15) NOT NULL default '""',
  PRIMARY KEY  (`idHost`)
) TYPE=MyISAM;

CREATE TABLE `hostdeny` (
  `host` char(16) NOT NULL default '',
  `name` char(50) NOT NULL default '',
  `ports` char(4) NOT NULL default '',
  `date` datetime NOT NULL default '0000-00-00 00:00:00'
) TYPE=MyISAM;

INSERT INTO `groups` (`idGroup`,`NameGroup`,`quota`,`email`,`boss`,`step1`,`mailed`) VALUES
 (1,'Отдел 1','419430400','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','32000000','0'),
 (2,'Отдел 2','104857600','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','32000000','0'),
 (3,'Отдел 3','999999999','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','104000000','0'),
 (4,'Отдел 4','104857600','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','104000000','0'),
 (5,'Отдел 5','999999999','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','999999999','0'),
 (6,'Отдел 6','104857600','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','104000000','0'),
 (7,'Отдел 7','100000000','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','104000000','0'),
 (8,'Отдел 8','100000000','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','100000000','0');

INSERT INTO `hostallow` (`idHost`,`hostname`,`idGroup`,`ttl`,`bps`,`bps2`,`User`,`pwd`) VALUES
 (4,'192.168.0.28',1,'2099-12-30','64000','32000','Имя юзера',''),
 (5,'192.168.0.50',5,'2099-12-30','128000','128000','Имя юзера',''),
 (6,'192.168.0.131',5,'2099-12-30','128000','128000','Имя юзера',''),
 (7,'192.168.0.12',1,'2099-12-30','64000','32000','Имя юзера',''),
 (8,'192.168.0.46',3,'2099-12-30','64000','32000','Имя юзера',''),
 (9,'192.168.0.110',6,'2099-12-30','64000','32000','Имя юзера','1111'),
 (10,'192.168.0.55',1,'2099-12-30','64000','32000','Имя юзера',''),
 (11,'192.168.0.144',7,'2099-12-30','64000','32000','Имя юзера',''),
 (12,'192.168.0.77',3,'2099-12-30','64000','32000','Имя юзера','');
И сам скрипт:

Код: Выделить всё

#!/usr/bin/perl
use DBI();
$rcfw = "/etc/rc.firewall";
$nwfw = ">/etc/rc.firewal.new";
$hostsallow = ">/usr/local/etc/squid/hostsallow.conf";
$db   = "trafd";
$user = "trafd";
$pass = "trafd";
$iface = "xl0";
$admemail  = "admin\@mbfkk.spb.ru";
$RobotName = "Stat Robot";
$RobotAddr = "admin\@mbfkk.spb.ru";
$admbody = "";

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
$year += 1900;
++$mon;
$mon2 = $mon + 1;

sub SendEMail {
    open (SENDMAIL, "|/usr/sbin/sendmail -t") or die "sendmail not ready";
    print SENDMAIL "From: $RobotName <$RobotAddr>\n";
    print SENDMAIL "To: $_[0]\n";
    print SENDMAIL "Reply-To: Evgeniy V. Podlesniy <$admemail>\n";
    print SENDMAIL "Content-Type: text/plain; charset=windows-1251\n";
    print SENDMAIL "Subject: $_[1]\n\n";
    print SENDMAIL "$_[2]";
    close (SENDMAIL) or warn "sendmail didn`t close nicely";
};

$dbh = DBI->connect("DBI:mysql:$db", $user, $pass) || die "Can\'t connect to MySQL\n";
# Выбираем траффик по не отключенным группам
$sql="select `hostallow`.`idgroup`, namegroup, boss, email, quota, \n".
     "step1, mailed, sum(allbytes) \n".
     "from hostallow, ${iface}_$year \n".
     "left join groups on `groups`.`idgroup` = `hostallow`.`idgroup` \n".
     "where to_ip = hostname \n".
     "  and ((from_ip = '192.168.0.200' and \n".
     "        port_from_ip = '3128') or \n".
     "      from_ip not like '192.168.%') \n".
     "  and mailed < 2 \n".
     "  and month(`${iface}_$year`.`date`) = $mon \n".
     "group by `hostallow`.`idgroup`;\n";
$sth = $dbh->prepare($sql);
$sth->execute();
while (@tmp = $sth->fetchrow_array()) {
    ($idgroup, $NameGroup, $boss, $email, $quota, $step1, $mailed, $traffic) = @tmp;
  if ($traffic > $quota) {
    # Метим и отсылаем уведомление
    $sql="update groups set mailed = '2' where idGroup = $idgroup;\n".
    $stb = $dbh->prepare($sql);
    $stb->execute();
    # Выбираем статистику группы по хостам
    $sql="select hostname, user, sum(allbytes)\n".
         "from hostallow, ${iface}_$year \n".
         "where  to_ip = hostname\n".
         "  and ((from_ip = '192.168.0.200' and\n".
         "        port_from_ip = '3128') or\n".
         "       from_ip not like '192.168.%')\n".
         "  and month(`${iface}_$year`.`date`) = $mon\n".
         "  and idgroup = $idgroup\n".
         "group by user;\n";
    $stb = $dbh->prepare($sql);
    $stb->execute();
    $report = '';
    while (($host, $user, $usertraff) = $stb->fetchrow_array()) {
      $usertraff = int($usertraff / 1048576 * 100) / 100;
      $report .= "\n$host\t${usertraff} Mb \t$user";
    };
    $stb->finish();
    $traffic = int($traffic / 1048576 * 100) / 100;
    $quota = int($quota / 1048576 * 100) / 100;
    $body = "Здравствуйте, $boss!\n\n".
            "Настоящим сообщаю, что Ваш отдел $NameGroup\n".
            "перешол порог отключения, который составляет $quota Mb.\n".
            "На текущий момент у вас получено $traffic Mb.\n\n".
            "Статистика:\n$report";
    SendEMail("$boss <$email>", "Интернет отключен", "$body");
    $admbody .= "Отдел: $NameGroup\tОтключен\tВыбрано: ${traffic}Mb из ${quota}Mb".
                $report."\n\n";
  } elsif (($traffic > $step1) and ($mailed = 0)) {
    # Метим и отсылаем уведомление
    $sql="update groups set mailed = '1' where idGroup = $idgroup;\n".
    $stb = $dbh->prepare($sql);
    $stb->execute();
    # Выбираем статистику группы по хостам
    $sql="select hostname, user, sum(allbytes), bps2 \n".
         "from hostallow, ${iface}_$year \n".
         "where  to_ip = hostname\n".
         "  and ((from_ip = '192.168.0.200' and\n".
         "        port_from_ip = '3128') or\n".
         "       from_ip not like '192.168.%')\n".
         "  and month(`${iface}_$year`.`date`) = $mon\n".
         "  and idgroup = $idgroup\n".
         "group by user;\n";
    $stb = $dbh->prepare($sql);
    $stb->execute();
    $report = '';
    while (($host, $user, $usertraff, $bps) = $stb->fetchrow_array()) {
      $users[$#user + 1] = [($host, $bps)];
      $usertraff = int($usertraff / 1048576 * 100) / 100;
      $report .= "\n$host\t${usertraff} Mb \t$user";
    };
    $stb->finish();
    $traffic = int($traffic / 1048576 * 100) / 100;
    $quota = int($quota / 1048576 * 100) / 100;
    $body = "Здравствуйте, $boss!\n\n".
            "Настоящим сообщаю, что Ваш отдел $NameGroup\n".
            "приблизился к порогу отключения, который составляет $quota Mb.\n".
            "На текущий момент у вас получено $traffic Mb.\n\n".
            "Статистика:\n$report";
    SendEMail("$boss <$email>", "Вы подошли к порогу отключения", "$body");
    $admbody .= "Отдел: $NameGroup\tПредупреждение\tВыбрано: ${traffic}Mb из ${quota}Mb".
                $report."\n\n";
    $stb->finish();
  }; # if
} # while (@tmp
$sth->finish();
if ($admbody) { # Если ругались на юзверей -- жалуемся админу
  SendEMail("Urgor <$admemail>", "Интернет: зверства", "Гигабитного тебе коннекта, Urgor!\n\n $admbody");
}
# Выбираем список юзеров кому можно в инет
$sql="select hostname, mailed, bps, bps2, pwd\n".
     "from hostallow, groups\n".
     "where `groups`.`idgroup` = `hostallow`.`idgroup`\n".
     "  and ttl > now()\n".
     "  and mailed < 2;\n";
$stb = $dbh->prepare($sql);
$stb->execute();
while (($host, $mailed, $bps, $bps2, $pwd) = $stb->fetchrow_array()) {
  if ($mailed == 0) {$users[$#users + 1] = [($host, $bps, $pwd)]}
  else {$users[$#users + 1] = [($host, $bps2, $pwd)]};
};
$stb->finish();

open(f1,$rcfw) || die "Can\'t open file: $rcfw\n";
open(f2,$nwfw) || die "Can\'t create file: $nwfw\n";
open(squid,$hostsallow) || die "Can\'t create file: $hostsallow\n";
while (<f1>) {
  print f2 $_;
  if (index($_, "--pipe") > 0) {
    $pipe = 10;
    for $i (0 .. $#users) {
      ($host, $bps, $pwd) = @{$users[$i]};
      print f2 "\${FwCMD} add pipe $pipe ip from \${IpIn} 3128 to $host\n";
      print f2 "\${FwCMD} pipe $pipe config bw $bps"."bit/s\n";
      if ($pwd eq "") { print squid "$host\n" };
      ++$pipe;
    }; # for $i
    # Открываем черный список
    $sql="select host\n".
         "from hostdeny;\n";
    $stb = $dbh->prepare($sql);
    $stb->execute();
    while (($host) = $stb->fetchrow_array()) {
      print f2 "\${FwCMD} add deny ip from $host to any\n";
    }; # while
    $stb->finish();
  }; # if --pipe
  if (index($_, "--divert") > 0) {
    for $i (0 .. $#users) {
      ($host, $bps, $pwd) = @{$users[$i]};
      print f2 "\${FwCMD} add divert natd ip from $host to any out via ${LanOut}\n";
    }; # for $i
  }; # if --pipe
}; # while (<f1>)
close(f1);
close(f2);
close(squid);
$dbh->disconnect;
$comm = `/bin/sh /etc/rc.firewall.new`;
$comm = `squid -k reconfigure`;
Власть в руках у чужаков, и ты им платишь дань...