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

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

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35071
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2006-03-29 16:59:10

надо тома оттестить - на работе траффик немеряный, не поймёшь... Да и труб сотня...
Убей их всех! Бог потом рассортирует...

Хостинговая компания 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/

Аватара пользователя
northern
лейтенант
Сообщения: 778
Зарегистрирован: 2006-02-08 20:48:45
Откуда: Днепропетровск
Контактная информация:

Непрочитанное сообщение northern » 2006-03-29 21:03:56

вот оттестил дома, пока всё подтверждается, при one_pass=1:

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

${FwCMD} add pipe 2 ip from  any to any in via ${LanOut}
${FwCMD} add pipe 2 ip from  any to any out via ${LanOut}
${FwCMD} pipe 2 config bw 260Kbit/s

${FwCMD} add 900 deny log ip from any to any
работает, сбрасываю в 0 - работает deny.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35071
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2006-03-29 21:50:55

а диверт где?
Мне интересно - если пипе это не просто правило, то диверт - он просто или тоже в некотором роде к трубам относится?
Убей их всех! Бог потом рассортирует...

Аватара пользователя
northern
лейтенант
Сообщения: 778
Зарегистрирован: 2006-02-08 20:48:45
Откуда: Днепропетровск
Контактная информация:

Непрочитанное сообщение northern » 2006-03-30 8:57:01

не всё сразу :), до диверта вчера руки не дошли, сегодня поразбираюсь...
Смотри чё в мане:

divert порт
Перенаправляет пакеты, соответствующие правилу, на сокет
divert(4), связанный с указанным портом. Дальнейший поиск
прекращается
.

tee порт
Посылает копию пакетов, соответствующих правилу, на сокет
divert(4), связанный с указанным портом. Дальнейший поиск
прекращается и исходный пакет принимается
(см., однако,
раздел ОШИБКИ далее).

fwd ip-адрес[,порт]
Изменяет следующий переход (next-hop) для соответствующих
пакетов, направляя их по указанному ip-адресу, который
можно задавать либо в виде четверки чисел через точку,
либо по имени хоста. Если ip-адрес непосредственно не
доступен, вместо него используется соответствующий
маршрут, полученный по локальной таблице маршрутизации.
Если ip-адрес - локальный, при поступлении в систему
пакета с удаленного хоста он будет перенаправлен на
заданный порт на локальной машине, так что локальный
адрес сокета остается установленным в соответствии с
исходным IP-адресом, по которому направлялся пакет. Это
действие предназначено для использования в прозрачных
промежуточных серверах. Если IP-адрес - не локальный
дальнейший поиск прекращается
; однако, при выходе из
канала если переменная sysctl( 8 ) net.inet.ip.fw.one_pass
не установлена, пакет снова передается брандмауэру для
проверки, начиная со следующего правила
.
на работе на своём 486, я разбирался со squidом, пример для ipfw твой, а там стоит fwd на локальный адрес, поэтому вчера у меня при one_pass=1 пакеты после fwd не уходили из ipfw. С дивертом надо разобраться.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35071
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2006-03-30 9:04:17

мда - век живи, век учись :)))
Убей их всех! Бог потом рассортирует...

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

Непрочитанное сообщение Urgor » 2006-03-30 11:32:48

У тебя в конфиге прописано для всех:

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

${FwCMD} add divert natd ip from ${NetIn}/${NetMask} to any out via ${LanOut}
${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut}
А как прописать для одного ипа? Так чтобы пакеты в мир только с него уходили...

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

${FwCMD} add divert natd ip from 192.168.0.1 to any out via ${LanOut}
${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut}
Так? Что-то пока доку читал совсем запутался :(
Власть в руках у чужаков, и ты им платишь дань...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35071
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2006-03-30 11:37:49

ага. если не заработает - маску поставь 255,255,255,255
хотя вряд ли надо... он и сам не дурак :)
Убей их всех! Бог потом рассортирует...

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

Непрочитанное сообщение Urgor » 2006-03-30 13:38:15

Хы :) Я, таки, это сделал. Траффик считает по доменным именам, правила для фарвола генерит, сквиду создает hostsallow (надобность в авторизации отпала), мыло шлет начальнику отдела и админу... уфффф :) Осталось украшательства навести.
Власть в руках у чужаков, и ты им платишь дань...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35071
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2006-03-30 13:42:30

покажи?
Убей их всех! Бог потом рассортирует...

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

Непрочитанное сообщение Urgor » 2006-03-30 15:49:30

От блин :( Рано обрадовался :( Нашелся странный косяк в sql'е...
Сделал две базы:
1. База хостов которым можно со ссылкой на вторую
2. База групп (отделов) где и лежит квота, начальник, адрес начальника...
Надо: выбрать ВСЕ хосты подтянув к ним квоту и суммарный инетный траффик.
Власть в руках у чужаков, и ты им платишь дань...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35071
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2006-03-30 15:54:02

если не базы а таблицы - надо общее поле и выборка по двум таблицам....
в чём проблема-то?
Убей их всех! Бог потом рассортирует...

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

Непрочитанное сообщение Urgor » 2006-03-30 16:01:34

да, таблицам.. оговорился. Вот мои таблицы. К траффику добавил поле from_host которое связано с `hostallow`.`hostname`.
Можешь примерчик накидать?

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

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',
  `traffic` char(12) 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',
  PRIMARY KEY  (`idHost`)
) TYPE=MyISAM;
Власть в руках у чужаков, и ты им платишь дань...

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

Непрочитанное сообщение Urgor » 2006-03-30 16:25:11

Поясню:

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

mysql> select to_ip, hostname, sum(allbytes) as allbytes,
    ->   NameGroup, quota
    -> from hostallow
    -> left join groups on `hostallow`.`idgroup` = `groups`.`idgroup`
    -> left join xl0_2006 on to_host = hostname
    -> where ttl > NOW()
    -> group by to_host;
+--------------+--------------+----------+-----------+-----------+
| to_ip        | hostname     | allbytes | NameGroup | quota     |
+--------------+--------------+----------+-----------+-----------+
| NULL         | okid.kk.com  |     NULL | OKID      | 104857600 |
| 192.168.0.37 | urgor.kk.com |  4519414 | ASU       | 104857600 |
+--------------+--------------+----------+-----------+-----------+
2 rows in set (0.02 sec)
Т.е. обе записи есть, а после добавления and from_IP NOT LIKE '192.168.0.%':

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

mysql> select to_ip, hostname, sum(allbytes) as allbytes,
    ->   NameGroup, quota
    -> from hostallow
    -> left join groups on `hostallow`.`idgroup` = `groups`.`idgroup`
    -> left join xl0_2006 on to_host = hostname and from_IP NOT LIKE '192.168.0.%'
    -> where ttl > NOW()
    -> group by to_host;
+-------+-------------+----------+-----------+-----------+
| to_ip | hostname    | allbytes | NameGroup | quota     |
+-------+-------------+----------+-----------+-----------+
| NULL  | okid.kk.com |     NULL | OKID      | 104857600 |
+-------+-------------+----------+-----------+-----------+
1 row in set (0.02 sec)
Почему вторая строка пропадает????????!
Власть в руках у чужаков, и ты им платишь дань...

Аватара пользователя
trubb
лейтенант
Сообщения: 864
Зарегистрирован: 2005-03-16 17:42:26
Откуда: сами мы не местные, приехали на лечение

Непрочитанное сообщение trubb » 2006-03-30 16:42:37

and from_ip not like и т.д. в where передвинь...
а то какой-то странный запрос получается...
иГрАюВсТрАйКбОл!

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35071
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2006-03-30 19:01:24

Я не понимаю... Явно нехватает таблицы с траффиком.
Дай все таблицы и дампу с них, строк по несколько....
Убей их всех! Бог потом рассортирует...

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

Непрочитанное сообщение Urgor » 2006-03-31 12:00:12

and from_ip not like и т.д. в where передвинь...
а то какой-то странный запрос получается...
Тогда те кто не был еще в инете, так в него и не попадут. А ON для связанной таблицы равен WHERE для обычного SELECT. По крайней мере с ограничением выборки по датам проблемы нет.
Власть в руках у чужаков, и ты им платишь дань...

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

Непрочитанное сообщение Urgor » 2006-03-31 12:41:20

Переписал один большой запрос на много маленьких, приделал еще одну таблицу... вроде работает как надо.
Требования:
/usr/ports/databases/p5-DBI
/usr/ports/databases/p5-Mysql
Таблицы:

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

CREATE DATABASE trafd;
USE trafd;
-- Группы aka отделы, квота одна на отдел.
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;
INSERT INTO `groups` (`idGroup`,`NameGroup`,`quota`,`email`,`boss`,`step1`,`mailed`,`traffic`) VALUES
 (1,'IT','419430400','it@mbfkk.spb.ru','Boss Name1','32000000','0','0'),
 (2,'OKID','104857600','okid@mbfkk.spb.ru','Boss Name2','32000000','0','0'),
 (3,'ASU','104857600','admin@mbfkk.spb.ru','Urgor','320000','1','0');
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 '',
  PRIMARY KEY  (`idHost`)
) TYPE=MyISAM;
-- Это те хосты кому можно в инет
INSERT INTO `hostallow` (`idHost`,`hostname`,`idGroup`,`ttl`,`bps`,`bps2`,`User`) VALUES
 (1,'okid.kk.com',2,'2006-04-20','64000','32000','User Name'),
 (2,'urgor.kk.com',3,'2099-04-20','64000','32000','User Name');
-- Временная таблица для выборки траффика
CREATE TABLE `itemp` (
  `hostname` char(40) NOT NULL default '',
  `idgroup` int(10) unsigned NOT NULL default '0',
  `traffic` char(16) NOT NULL default ''
) TYPE=MyISAM;
-- временная таблица для заброски траффика trafd
CREATE TABLE `traffic_tmp` (
  `date` date NOT NULL default '0000-00-00',
  `time` time NOT NULL default '00:00:00',
  `from_IP` char(16) NOT NULL default '',
  `from_host` char(40) default '',
  `port_from_IP` char(8) NOT NULL default '',
  `to_IP` char(16) NOT NULL default '',
  `to_host` char(40) default '',
  `port_to_IP` char(8) NOT NULL default '',
  `protocol` enum('icmp','tcp','udp') NOT NULL default 'icmp',
  `bytes` char(16) NOT NULL default '',
  `allbytes` char(16) NOT NULL default ''
) TYPE=MyISAM COMMENT='tmp_table';
-- Пример того что в ней может быть
INSERT INTO `traffic_tmp` (`date`,`time`,`from_IP`,`from_host`,`port_from_IP`,`to_IP`,`to_host`,`port_to_IP`,`protocol`,`bytes`,`allbytes`) VALUES
 ('2006-03-31','13:25:00','192.168.0.79','','137','192.168.0.255','','137','udp','2700','4212'),
 ('2006-03-31','13:25:00','192.168.0.5','koroleva.kk.com','137','192.168.0.255','','137','udp','1650','2574');
-- Статистика по сетевухе xl0 за 2006 год
CREATE TABLE `xl0_2006` (
  `date` date NOT NULL default '0000-00-00',
  `time` time NOT NULL default '00:00:00',
  `from_IP` char(16) NOT NULL default '',
  `from_host` char(40) default '',
  `port_from_IP` char(8) NOT NULL default '',
  `to_IP` char(16) NOT NULL default '',
  `to_host` char(40) default '',
  `port_to_IP` char(8) NOT NULL default '',
  `protocol` enum('icmp','tcp','udp') NOT NULL default 'icmp',
  `bytes` char(16) NOT NULL default '',
  `allbytes` char(16) NOT NULL default ''
) TYPE=MyISAM COMMENT='tmp_table';

INSERT INTO `xl0_2006` (`date`,`time`,`from_IP`,`from_host`,`port_from_IP`,`to_IP`,`to_host`,`port_to_IP`,`protocol`,`bytes`,`allbytes`) VALUES
 ('2006-03-28','14:14:40','192.168.0.108','quality1.kk.com','137','192.168.0.255','','137','udp','2400','3744'),
 ('2006-03-28','14:14:40','192.168.0.200','asu-002','22','192.168.0.37','urgor.kk.com','client','tcp','26868','29188'),
 ('2006-03-28','14:14:40','192.168.0.27','okorokov.kk.com','137','192.168.0.255','','137','udp','1350','2106'),
 ('2006-03-28','14:14:40','192.168.0.37','urgor.kk.com','client','192.168.0.200','asu-002','22','tcp','2508','4748'),
 ('2006-03-28','14:14:40','192.168.0.5','koroleva.kk.com','137','192.168.0.255','','137','udp','4750','7410'),
 ('2006-03-28','14:14:40','192.168.0.52','','631','192.168.0.255','','631','udp','2351','3471'),
 ('2006-03-28','14:14:40','192.168.0.79','','137','192.168.0.255','','137','udp','8000','12480'),
 ('2006-03-28','14:15:41','192.168.0.108','quality1.kk.com','137','192.168.0.255','','137','udp','3150','4914'),
 ('2006-03-28','14:15:41','192.168.0.200','asu-002','22','192.168.0.37','urgor.kk.com','client','tcp','59800','67640');
Считалка траффика для trafd:

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

#!/usr/bin/perl
use DBI();
use Socket;
$traflog = "/var/traffic";
@ifaces = ("xl0");
$db   = "trafd";
$user = "trafd";
$pass = "trafd";

sub cat {
    open(f1, $_[0]) || die "Can\'t open $_[0]";
    open(f2, ">$_[1]") || die "Can\'t open $_[1]";
    while(<f1>) {
	print f2 $_;
    };
    close(f2);
    close(f1);
};

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
$year = $year + 1900;
++$mon;
if (!(-e("$traflog/$year"))) { mkdir("$traflog/$year"); }
if (!(-e("$traflog/$year/$mon"))) { mkdir("$traflog/$year/$mon"); }
$dbh = DBI->connect("DBI:mysql:$db", $user, $pass) || die "Can\'t connect to MySQL\n";
$sql="CREATE TABLE IF NOT EXISTS traffic_tmp (".
    "`date` DATE NOT NULL, ".
    "`time` TIME NOT NULL, ".
    "`from_IP` char(16) NOT NULL, ".
    "`from_host` char(40) DEFAULT '', ".
    "`port_from_IP` char(8) NOT NULL, ".
    "`to_IP` char(16) NOT NULL, ".
    "`to_host` char(40) DEFAULT '', ".
    "`port_to_IP` char(8) NOT NULL, ".
    "`protocol` enum('icmp','tcp','udp') NOT NULL, ".
    "`bytes` char(16) NOT NULL, ".
    "`allbytes` char(16) NOT NULL ".
    ") TYPE=MyISAM COMMENT='tmp_table';";
$sth = $dbh->prepare($sql);
$sth->execute();
foreach $iface (@ifaces) {
    $sql="DELETE FROM traffic_tmp;";
    $sth = $dbh->prepare($sql);
    $sth->execute();
    system ("/usr/local/bin/trafsave","$iface");
    open(OLDOUT, ">&STDOUT");
    open(STDOUT, "> /tmp/summary.$iface");
    system ("/usr/local/bin/traflog","-i","$iface","-a","-n","-s");
    close(STDOUT);
    open(STDOUT, ">&OLDOUT");
    close(OLDOUT);
    cat("/tmp/summary.$iface",">$traflog/$year/$mon/summary.$iface");
    unlink("/usr/local/var/trafd/trafd.$iface");
    open(f1,"/tmp/summary.$iface") || die "Can\'t open /tmp/summary.$iface";
    while(<f1>) {
	chomp $_;
	tr/ / /s;
	($fromip,$fromport,$toip,$toport,$proto,$bytes,$allbytes) = split(/ /,$_);
	if (($fromip != "") and ($toip != "")) {
	    $iaddr = inet_aton($fromip); 
	    $fromname = gethostbyaddr($iaddr, AF_INET);
	    $iaddr = inet_aton($toip);   
	    $toname = gethostbyaddr($iaddr, AF_INET);
	    $sql="insert into `traffic_tmp2` (date, time, from_ip, from_host, \n".
		"port_from_ip, to_ip, to_host, port_to_ip, protocol, bytes, allbytes) \n".
		"values ('$year-$mon-$mday', '$hour:$min:$sec', '$fromip','$fromname', \n".
		"'$fromport', '$toip', '$toname', '$toport', '$proto', '$bytes', '$allbytes');\n";
	    $sth = $dbh->prepare($sql);
	    $sth->execute();
	} # if
    } # while(<f1>)
    $sql="CREATE TABLE IF NOT EXISTS $iface"."_$year (".
	"`date` DATE NOT NULL, ".
        "`time` TIME NOT NULL, ".
        "`from_IP` char(16) NOT NULL, ".
        "`from_host` char(40) DEFAULT '', ".
        "`port_from_IP` char(8) NOT NULL, ".
        "`to_IP` char(16) NOT NULL, ".
        "`to_host` char(40) DEFAULT '', ".
        "`port_to_IP` char(8) NOT NULL, ".
        "`protocol` enum('icmp','tcp','udp') NOT NULL, ".
        "`bytes` char(16) NOT NULL, ".
        "`allbytes` char(16) NOT NULL ".
        ") TYPE=MyISAM;";
    $sth = $dbh->prepare($sql);
    $sth->execute();
    $sql="insert into `$iface\_$year` (date, time, from_ip, from_host, \n".
        "port_from_ip, to_ip, to_host, port_to_ip, protocol, bytes, allbytes) \n".
        "SELECT date, time, from_ip, from_host, port_from_ip, to_ip, to_host, \n".
        "port_to_ip, protocol, sum(bytes) as bytes, sum(allbytes) as allbytes \n".
        "FROM traffic_tmp GROUP BY date, time, from_ip, from_host, \n".
	"port_from_ip, to_ip, to_host, port_to_ip, protocol \n";
    $sth = $dbh->prepare($sql);
    $sth->execute();
} # foreach
unlink("/var/log/traffic.log");
$sth->finish();
$dbh->disconnect;
Обработка, расчет, отключение:

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

#!/usr/bin/perl
use DBI();
use Socket;
$rcfw = "/etc/rc.firewall";
$nwfw = ">/home/urgor/perl/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 = $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=koi8-r\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="delete from itemp;";
$sth = $dbh->prepare($sql);
$sth->execute();
# Считаем траффик что юзера натаскали за текущий месяц
$sql="insert into itemp (idgroup, hostname, traffic)\n".
     "select idgroup, to_host, sum(allbytes) from $iface\_$year, hostallow\n".
     "where `hostallow`.`hostname` = `$iface\_$year`.`to_host` and\n".
     "(`$iface\_$year`.`date` >= '$year-$mon-00' and \n".
     "`$iface\_$year`.`date` <  '$year-$mon2-00') and \n".
     "from_IP NOT LIKE '192.168.0.%' \n".
     "group by to_host;";
$sth = $dbh->prepare($sql);
$sth->execute();
# Выбираем хосты у которых не истек "срок годности"
$sql="select hostname, bps, bps2, NameGroup, `groups`.`idgroup`,\n".
     "User, quota, email, boss, step1, mailed\n".
     "from hostallow\n".
     "left join groups on `groups`.`idgroup` = `hostallow`.`idgroup`\n".
     "where ttl > now();\n";
$sth = $dbh->prepare($sql);
$sth->execute();
while (@tmp = $sth->fetchrow_array()) {
    ($hostname, $bps, $bps2, $NameGroup, $idGroup, $User,
     $quota, $email, $boss, $step1, $mailed) = @tmp;
    $hostip = inet_ntoa(inet_aton($hostname));
    $sql="select sum(traffic) from itemp\n".
         "where `itemp`.`idgroup` = $idGroup\n".
         "group by `itemp`.`idgroup`;";
#    print "$sql\n";
    $stt=$dbh->prepare($sql);
    $stt->execute();
    if (defined $stt) {
      ($traffic) = $stt->fetchrow_array();
      $stt->finish();
    } else {$traffic = 0};
    $users[$#users + 1] = [ ($hostip, $hostname, $bps, $bps2, $NameGroup, $idGroup,
                             $User, $quota, $traffic, $email, $boss, $step1, $mailed) ];
#    print "$hostname [ @{$users[ $#users ]} ],\n";
}; # while
$sth->finish();

open(f1,$rcfw) || die "Can\'t open file: $rcfw\n";
open(f2,$nwfw) || die "Can\'t create file: $nwfw\n";
while (<f1>) {
    print f2 $_;
    if (index($_, "--pipe") > 0) {
	open (squid, $hostsallow) or die "Can\'t create file: $hostsallow\n";
	$pipe = 1;
	for $i ( 0 .. $#users ) {
          ($hostip, $hostname, $bps, $bps2, $NameGroup, $idGroup,
           $User, $quota, $traffic, $email, $boss, $step1, $mailed) = @{$users[$i]};
	  if ($traffic < $step1) {
	    print f2 "\${FwCMD} add pipe $pipe ip from not \${NetIn} to $hostip\n";
	    print f2 "\${FwCMD} pipe $pipe config bw $bps"."bit/s\n";
	    print squid "$hostip \n";
	  } elsif ($traffic < $quota) {
	    print f2 "\${FwCMD} add pipe $pipe ip from not \${NetIn} to $hostip\n";
	    print f2 "\${FwCMD} pipe $pipe config bw $bps2"."bit/s\n";
	    print squid "$hostip \n";
	  }; #if .. elsif
	  ++$pipe;
	}; # for $i
    }; # if (index
    if (index($_, "--divert") > 0) {
	for $i ( 0 .. $#users ) {
          ($hostip, $hostname, $bps, $bps2, $NameGroup, $idGroup,
           $User, $quota, $traffic, $email, $boss, $step1, $mailed) = @{$users[$i]};
	  if ($traffic < $quota) {
	    print f2 "\${FwCMD} add divert natd ip from $hostip to any out via ${LanOut}\n";
	  }; #if
	}; # for $i
    }; # if (index
}; # while(<f1>)

$sql="select NameGroup, quota, email, boss, step1,\n".
     "mailed, `groups`.`idgroup`, sum(`itemp`.`traffic`)\n".
     "from itemp, groups\n".
     "where `itemp`.`idgroup` = `groups`.`idgroup` and\n".
     "`groups`.`mailed` < 2\n".
     "group by `groups`.`idgroup`;";
$sth = $dbh->prepare($sql);
$sth->execute();
#print "NameGroup, quota, email, boss, step1, mailed, idGroup, traffic\n";
while (($NameGroup, $quota, $email, $boss, $step1, $mailed,
        $idGroup, $traffic) = $sth->fetchrow_array()) {
#  print "$NameGroup, $quota, $email, $boss, $step1, $mailed, $idGroup, $traffic\n";
  if (($traffic > $step1) and ($mailed < 1)) {
    $body = "Здравствуйте, $boss!\n\n".
            "Настоящим сообщаю, что Ваш отдел $NameGroup \n".
            "приблизился к порогу отключения, который составляет $quota байт.\n".
            "На текущий момент у вас получено $traffic байт.\n\n".
            "Статистика:\n";
    $sql="select user, `hostallow`.`hostname`, traffic\n".
         "from hostallow\n".
         "left join itemp on `itemp`.`idgroup` = $idGroup\n".
         "where `hostallow`.`idgroup` = $idGroup\n".
         "order by user, hostname;";
    $stt = $dbh->prepare($sql);
    $stt->execute();
    $admbody = $admbody . "Отдел: $NameGroup\n Выбрано: $traffic из $quota\tПредупреждение\n";
    while (($user, $hostname, $traffic) = $stt->fetchrow_array()) {
      $body = $body . "\t$user\t$hostname\t$traffic байт\n";
      $admbody = $admbody . "\t$user\t$hostname\t$traffic байт\n";
    };
    $stt->finish();
    SendEMail("$boss <$email>", "Вы подошли к порогу отключения", "$body");
    $sql="update groups set mailed = '1'".
         "where NameGroup = '$NameGroup';\n";
    $stt = $dbh->prepare($sql);
    $stt->execute();
    $stt->finish();
  } elsif (($traffic > $quota) and ($mailed < 2)) {
    $body = "Здравствуйте, $boss!\n\n".
            "Настоящим сообщаю, что Ваш отдел $NameGroup \n".
            "превысил установленную квоту, которая составляет $quota байт.\n".
            "В текущем месяце интернет для Вашего отдела более не доступен.\n\n".
            "Статистика:";
    $stt = $dbh->prepare($sql);
    $stt->execute();
    $admbody = $admbody . "Отдел: $NameGroup\n Выбрано: $traffic из $quota\t Отключен\n";
    while (($user, $hostname, $traffic) = $stt->fetchrow_array()) {
      $body = $body . "\t$user\t$hostname\t$traffic байт\n";
      $admbody = $admbody . "\t$user\t$hostname\t$traffic байт\n";
    };
    $stt->finish();
    $body = $body . $users;
    $admbody = $admbody . $users . "\n\n";
    SendEMail("$boss <$email>", "Вы подошли к порогу отключения", "$body");
    $sql="update groups set mailed = '2'".
         "where NameGroup = '$NameGroup';\n";
    $stt = $dbh->prepare($sql);
    $stt->execute();
    $stt->finish();
  }
};

if (!($admbody eq "")) { # Еслу ругались на юзверей -- жалуемся админу
  SendEMail("Urgor <$admemail>", "Предупреждения, отключения", "Гигабитного тебе коннекта, Urgor!\n\n $admbody");
}
$dbh->disconnect;
Да. В rc.firewall где идут пайпы добавить # --pipe а где нат, там # --divert
Власть в руках у чужаков, и ты им платишь дань...

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

Непрочитанное сообщение Urgor » 2006-04-05 15:13:01

Возникло несколько вопросов:
1. Пайпы работают, но... ограничение действует и на получение почты с почтовика и на SSH, а хотелось бы что бы они работали на все 100м/бит, а резался только инет.
Вот пример пайпов:
${FwCMD} add pipe 1 ip from not ${NetIn} to 192.168.0.37
${FwCMD} pipe 1 config bw 64000bit/s
2. Где в настройках DHCP винды прописаль гейт по умолчанию, дабы он брался автоматом вместе с ip?
Власть в руках у чужаков, и ты им платишь дань...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35071
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2006-04-05 16:36:56

у меня принудительно добавлено

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

${FwCMD} add pipe 1 ip from ${IpOut} to ${NetIn}/${NetMask}
${FwCMD} pipe 1 config bw 100Mbit/s
${FwCMD} add pipe 2 ip from ${IpIn} to ${NetIn}/${NetMask}
${FwCMD} pipe 2 config bw 100Mbit/s
${FwCMD} add pipe 3 ip from ${NetIn}/${NetMask} to me
${FwCMD} pipe 3 config bw 100Mbit/s
насчёт ДХЦП
Вложения
463653124521.png
463653124521.png (3.77 КБ) 3722 просмотра
Убей их всех! Бог потом рассортирует...

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

Непрочитанное сообщение Urgor » 2006-04-06 9:01:49

Сенкс :) сам бы никада не догадался что default gateway называется router =))
Прописал пайпы в конфиг, динамические назначил с 10 :) Заработало!
Власть в руках у чужаков, и ты им платишь дань...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35071
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2006-04-06 9:10:26

никак руки до таблиц твоих недойдут... извини уж... хотя и самому интересно поковырять....
Убей их всех! Бог потом рассортирует...

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

Непрочитанное сообщение Urgor » 2006-04-06 11:39:09

Забей! Первый блин пошел комом :) perl за неделю -- это не реально, да и писалось без возможности потестить в реале, а в реале... В реале прикрутил еще portcentry (мдя. тока поставили инет и толпы идиотов со сканерами полезли), поэтому пришлось дорисовать hostdeny куда пихать этих идиотов, а потом вместе с инетчиками поднимать и чистить. Так что от опубликованного уже мало что осталось.... Посему, как закончу (появится окончательная версия всем меня устраивающая) сразу опубликую.
Да, с именами хостов так ничего и не вышло :( Исторически сложилось что домен у нас (нутряной, AD который) совпадает с зареганым (не нами) в инете :( Посуму х...ня какая-то получается. А 200 машин перезаводить.... ну нах. В DHCP занято менее половины адресов, посему просто продлил время арендв до 20 дней. (т.к. отпуск бывает по 14 дней).
Власть в руках у чужаков, и ты им платишь дань...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35071
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2006-04-06 13:58:02

у меня тоже по наследству такая херь досталась... 30 машин... :)))
Убей их всех! Бог потом рассортирует...

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

Непрочитанное сообщение Urgor » 2006-04-07 16:03:38

Лис, ты помнится хвалился крутой банерорезалкой :) А поделишся? Засунул кейворды от аутпоста в твой редиректор... не сильно помогло, да и глядеть на "The page cannot be..." вместо банеров не очень хорошо (хотя траффик экономит). И расскажи про зарезание чатов. Ты вылавливал руками или?
Хмм... нашел что-то похожее :) rejik.ru
Власть в руках у чужаков, и ты им платишь дань...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35071
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2006-04-07 17:14:09

в редиректор непложо бы картинку положить :) Вместо нот фоунд показывается :)))

а режик - да ,походее, но я не юзал ни разу, своим доволен...
тут - http://forum.lissyara.su/viewtopic.php?t=392 выкладывал свои сайты... а ловил - руками ловил :(
Убей их всех! Бог потом рассортирует...