Информация
На главную Главная

Мой t-cards.ru
Войти Войти
Зарегистрироваться Регистрация

Разное
Форум Форум
Вернуться Форумы на t-cards.ru> Hard"n"Soft
Логин
Пароль
Регистрация Участники Поиск >> FAQ


Сообщения в теме: "Биллинговая система NETUP UTM5, шейпируем трафик с..."
06.09.2006 13:39
Admin

Регистрация: 19.04.2006
Проживание: Калуга
Сообщения: 57
По умолчаниюБиллинговая система NETUP UTM5, шейпируем трафик средствами CISCO.

В этой статье пойдёт рассказ о том, как можно используя агреггированные данные о трафике использовать для исполнения удалённых команд на маршрутизаторе CISCO.
Что мы имеем:
Несколько филиалов по стране, в которых доступом в интернет упарвляют киски.
В некоторой точке на технической площадке расположен сервер с биллинговой системой UTM5.
Со всех филиалов по виртуальным каналам стекается информация об израсходованном пользователе трафике, протокол Netflow v5.
Адресация в филиалах 192.168.филиал.пользователь. При этом адрес циски в каждом филиале один, 192.168.филиал.61.

Что надо сделать в циске.
1 Включить rcmd
2 Добавить пользователя для исполнения удалённых комманд
3 Добавить валидные хосты, с которых разрешены эти команды
4 Дать пользователю право на исполнение нужных комманд.

Прежде чем продемонстрировать кусок конфига оговорюсь общим подходом к реализации:
На интерфейсе с которого пользователи забирают трафик создаётся правило шейпирования rate limit [] output [] в котором мы указываем динамический лист доступа, созданные ранее.
В этот лист мы и будем добавлять адреса злостных нарушителей лимитов трафика.
конфиг:
!
no ip rcmd domain-lookup
ip rcmd rsh-enable
ip rcmd remote-host netup 192.168.x.x root enable
!
указываем от какого удалённого/локального юзера можно rsh соединение и валидный исходящий адрес.

!
username netup privilege 8 password 0 pass
!
Объявляем локального юзера с уровнем привилегий 8

!
access-list 180 dynamic shaper permit ip any any
!
Динамический лист доступа для шейпирования.

!
privilege exec level 8 access-template
privilege exec level 8 clear access-template
privilege exec level 8 clear
!
Разрешенные комманды

!
interface FastEthernet0/0
rate-limit output access-group 180 40000 5000 6000 conform-action transmit exceed-action drop
!
Указываем лимиты пропускной способности и правила, которые будут выполняться при совпадении и превышениях нагрузки доступного канала.
40000 - биты пропускной способности, 5000 - килобайты максимум, 6000 - допустимые пики нагрузки, кб.

Если при исполнении комманд будет появляться ошибка о нехватки VTY также добавьте в конфиг такие строки:
!
line vty 16 19
privilege level 8
login local
transport input all
!

Теперь самое время поговорить о необходимых операциях на стороне сервера.
Основной подход:
Из базы UTM5 нам необходимо получить данные о трафике по необходимому классу и пользователю. Нужно отметить, что понять структуру БД биллинга было не просто, так как документации по связям таблиц не было.
Запрос, позволяющий получить необходимые данные:

SELECT
us.login login,
inet_ntoa(case when ig.ip > 0 then ig.ip else 4294967296+ig.ip end) ip,
SUM(dtia.bytes) bytes
FROM ip_groups ig
INNER JOIN service_links sl
ON sl.id = ig.ip_group_id
INNER JOIN users us
ON us.id = sl.user_id
INNER JOIN discount_transactions_iptraffic_all dtia
ON dtia.account_id = sl.account_id
WHERE
ig.is_deleted=0
AND dtia.discount_date>="DAY_START"
AND dtia.discount_date <="DAY_END"
AND dtia.t_class="T_CLASS"
AND inet_ntoa(case when ig.ip > 0 then ig.ip else 4294967296+ig.ip end) = "USER_IP"
GROUP BY
dtia.t_class,
dtia.base_cost,
dtia.account_id,
dtia.slink_id


В запросе использованы 4 переменные - начало дня и конец дня в unix timestamp, адрес пользователя и класс трафика.
Данные о квотах пользователей будем хранить в отдельной таблице, создать её можно в той же базе:
CREATE TABLE sm_users(
          id int not null auto_increment,
          ip int unsigned not null,
          t_class int not null,
          quota int not null default 50000000,
          comment varchar(128) default "",
          PRIMARY KEY(id));

Думаю комменты излишни.
06.09.2006 13:39
Admin

Регистрация: 19.04.2006
Проживание: Калуга
Сообщения: 57
По умолчаниюБиллинговая система NETUP UTM5, шейпируем трафик средствами CISCO.

Собственно сам скрипт (perl):

#!/usr/bin/perl

use DBI;
use DBD::mysql;
use Net::Rsh;
use Time::Local;
use strict;

my ($db,$user,$pw) = ("UTM","billing","xxxxx");
my $logfile = "/var/log/shapeme.log";

my $dbh = DBI->connect("DBI:mysqlatabase=$db;host=localhost",$user,$pw);
if (!$dbh)
{
exit(1);
}

my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime (time);

my $day_start = timelocal (0, 0, 0, $mday, $mon, $year);
my $day_end = timelocal (59, 59, 23, $mday, $mon, $year);

my $query_user = "SELECT inet_ntoa(ip) ip,quota,t_class FROM sm_users order by ip";
my $sth_user = $dbh->prepare($query_user);
$sth_user->execute();

while (my $str_user = $sth_user->fetchrow_hashref())
{


my $query_utm =
"
SELECT
us.login login,
inet_ntoa(case when ig.ip > 0 then ig.ip else 4294967296+ig.ip end) ip,
SUM(dtia.bytes) bytes
FROM ip_groups ig
INNER JOIN service_links sl
ON sl.id = ig.ip_group_id
INNER JOIN users us
ON us.id = sl.user_id
INNER JOIN discount_transactions_iptraffic_all dtia
ON dtia.account_id = sl.account_id
WHERE
ig.is_deleted=0
AND dtia.discount_date>="$day_start"
AND dtia.discount_date <="$day_end"
AND dtia.t_class="$str_user->{"t_class"}"
AND inet_ntoa(case when ig.ip > 0 then ig.ip else 4294967296+ig.ip end) = "$str_user->{"ip"}"
GROUP BY
dtia.t_class,
dtia.base_cost,
dtia.account_id,
dtia.slink_id
";

my $sth_utm = $dbh->prepare($query_utm);
$sth_utm->execute();

my $str_utm = $sth_utm->fetchrow_hashref();

if ($str_utm->{"bytes"} > $str_user->{"quota"})
{
#send rsh
debug ("user ".$str_utm->{"login"}." exceeded limit: available ".$str_user->{"quota"}.", downloaded ".$str_utm->{"bytes"});

my $cisco_ip = $str_user->{"ip"};
$cisco_ip =~ s/(^\d{1,3}\.\d{1,3}\.\d{1,3}\.).*/$1."61"/ge;

my $rsh=Net::Rsh->new();
if (!$rsh)
{
debug ("can\"t send command using Net::Rsh");
}
else
{
my $local_user="root";
my $remote_user="netup";
my $cmd="access-template 180 shaper any host $str_user->{"ip"}";

my @c=$rsh->rsh($cisco_ip,$local_user,$remote_user,$cmd);
foreach(@c)
{
if (length ($_) > 3)
{
debug("cisco@".$cisco_ip.": ".$_);
}
}
}
}

}

sub debug()
{
open (LOG,">>$logfile");
print LOG scalar localtime(time()),": ",$_[0],"\n";
close LOG;
}

06.09.2006 13:48
Admin

Регистрация: 19.04.2006
Проживание: Калуга
Сообщения: 57
По умолчаниюБиллинговая система NETUP UTM5, шейпируем трафик средствами CISCO.

Модуль Net::Rsh очень простой и местами хочется дополнительных опций, как например таймаут попытки подключения к циске. Чтобы указать его можно дописать функцию вызова соединения в модуле, либо там же в модуле указать его константой (perldoc IO::Socket::INET).

Данный скрипт необходимо вставить в cron и выполнять с нужным интервалом. Помните, что динамичесие правила не записываются в конфиг маршрутизатора и после ребута киски они удалятся. А ребуты бывают по разным причинам

Ещё так и не понял (особо правда и не пытался) в каком формате биллинг хранит адреса в базе, поэтому пришлось написать условие на отрицательные варианты, обычный inet_ntoa не понимал данных.
06.09.2006 13:50
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 272
По умолчаниюБиллинговая система NETUP UTM5, шейпируем трафик средствами CISCO.

Клево!! зачот
Этот перловый скрипт надо в крон пихнуть раз в 10 минут например?
Надо еще какой-нить алгоритм, чтоб юзера сделать "хорошим" обратно
06.09.2006 13:59
Admin

Регистрация: 19.04.2006
Проживание: Калуга
Сообщения: 57
По умолчаниюБиллинговая система NETUP UTM5, шейпируем трафик средствами CISCO.

Юзеров хорошими можно делать в начале каждого дня ночью. отдельно скрипт в 5 строк и в крон.
10-20 мин для плохих юзеров нормальный вариант )
06.09.2006 14:35
Admin

Регистрация: 19.04.2006
Проживание: Калуга
Сообщения: 57
По умолчаниюБиллинговая система NETUP UTM5, шейпируем трафик средствами CISCO.

Более грамотный запрос получился бы с вложенным запросом, но у меня на сервере 4.0.x субд ((

PS субд ставил не я
06.09.2006 15:57
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 272
По умолчаниюБиллинговая система NETUP UTM5, шейпируем трафик средствами CISCO.

Да можно легко перейти на 4.1, тока что-то у меня exim какой-то болт выкатил однажды при переходе.
06.09.2006 20:01
Admin

Регистрация: 19.04.2006
Проживание: Калуга
Сообщения: 57
По умолчаниюБиллинговая система NETUP UTM5, шейпируем трафик средствами CISCO.

Там exim не стоит, и, в общем, не я отвечаю за субд
08.09.2006 13:23
Admin

Регистрация: 19.04.2006
Проживание: Калуга
Сообщения: 57
По умолчаниюБиллинговая система NETUP UTM5, шейпируем трафик средствами CISCO.

Пришла мысль как сделать это всё ещё проще -- у каждого аккаунта есть много дополнительных свойств и полей ввода для информации. Есть поле комментария. Туда через родной админский интерфейс можно писать допустимый для пользователя лимит и класс трафика. например в форме 100:10 (лимит:класс). Запрос примет примерно такой вид (>=4.1.x):


SELECT * FROM

(SELECT
CAST(MID(us.comments,1,locate(":",us.comments)) AS UNSIGNED) lim,
us.login login,
inet_ntoa(case when ig.ip > 0 then ig.ip else 4294967296+ig.ip end) ip,
SUM(dtia.bytes) bytes

FROM ip_groups ig

INNER JOIN service_links sl ON
          sl.id = ig.ip_group_id
INNER JOIN users us ON
          us.id = sl.user_id
INNER JOIN discount_transactions_iptraffic_all dtia ON
          dtia.account_id = sl.account_id

WHERE

ig.is_deleted=0
AND dtia.discount_date>=DAY_START
AND dtia.discount_date <=DAY_END
AND dtia.t_class=cast(mid(us.comments,locate(":",us.comments)+1,length(us.comments)-locate(":",us.comments)+1) AS UNSIGNED)
AND length(us.comments)>0
AND us.comments LIKE "%:%"

GROUP BY

dtia.t_class,
dtia.base_cost,
dtia.account_id,
dtia.slink_id) tmpb


WHERE

tmpb.bytes > tmpb.lim

ORDER BY

tmpb.ip;


и никакого веб интерфейса и дополнительно таблицы для шейпера писать не надо =)

www.netup.ru:
UTM 5.0: Модуль динамического шейпирования           250 у.е.
немного поработать и родной модуль можно в утиль.
08.09.2006 14:45
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 272
По умолчаниюБиллинговая система NETUP UTM5, шейпируем трафик средствами CISCO.

> UTM 5.0: Модуль динамического шейпирования 250 у.е.
немного поработать и родной модуль можно в утиль.

Лень и жадность - воистину двигатель прогресса!
Запрос кстати не тупит? По комменту индекса нет, при оч большой бд может тупить
08.09.2006 14:51
Admin

Регистрация: 19.04.2006
Проживание: Калуга
Сообщения: 57
По умолчаниюБиллинговая система NETUP UTM5, шейпируем трафик средствами CISCO.

В моих масштабах тупить не будет, тысяч на 20 пользователей, думаю, будет.

ps про лень ты загнул...
28.02.2013 21:37
Admin

Регистрация: 19.04.2006
Проживание: Калуга
Сообщения: 57
По умолчаниюБиллинговая система NETUP UTM5, шейпируем трафик средствами CISCO.

а статейка то пригодилась спустя столько времени... правда несколько по другой теме