Справедливое разделение полосы ( дорабатываем dynashape )

Технические вопросы по UTM 5.0
Ответить
Oleg_121
Сообщения: 81
Зарегистрирован: Пн апр 14, 2008 21:09

Справедливое разделение полосы ( дорабатываем dynashape )

Сообщение Oleg_121 »

Что имеем - тонкий канал всего 12 Мбит , причем очень дорогой , и много пользователей - около 6000 которые хотят этим каналом пользоваться. Как разделить справедливо - понятно , нарезаем всем пользователям pipe и кто какую скорость выбрал тот и платит за скорость и за скаченный объем, причем поскольку пользователей перебор ( к счастью все одновременно не работают - такая вот специфика ), то скорость дадим в pipe не гарантированную , а максимальную , а дальше много народа в канале пусть скорость падает. Но как и везде находится определенный класс пользователей который хочет безлимитный тариф! Вот для этого и купили модуль dynashape. И в принципе все очень не плохо работает, одна вот проблема - появились умные пользователи , которые и на маленькой скорости используя торренты и всякие другие закачивающие программы , умудряются сильно сажать канал - ставят на закачку фильм дня на 2 - 3 на скорости 128 К он у них потихоньку и идет. НЕСПРАВЕДЛИВО!!! Платят они не много а вот качают достаточно. ( для примера - за месяц такой умник постоянно нагружая канал может скачать до 80 гигов а платит абонентку при этом всего 1000 руб)
Появилась идея( не новая) а как бы запретить закачку , а серфинг разрешить. всякие флаги и т.д. после изучения были отметены как слишком сложные в реализации.
Решили реализовать такой алгоритм - есть тариф - например 1000 мбит на скорости 1024 Кбит/cek как прошли порог - 128 Кбит/сек и безлимит на месяц. После порога смотрим как пользователь использует канал, если за 2 минуты он занял канал больше , чем на 20% скорость падает в 2 раза, через 2 минуты смотрим снова - больше 20 % скрость еще падает. и т.д.
Описание работы: Используем FreeBSD 6.2 шейпер сделан с использованием pipe и table. В таблицу 1 передаем значения IP и BW - с помощью rfw. А на основе таблицы генеряться динамические pipe.
Для тех тарифов которые работают в режиме динамического шейпирования добавляем правило: add RULE_ID count ip from any to UIP при включении и соответственно правило для удаления.
По крону раз в 2 минуты( можно и чаще) запускаем скрипт
  • #!/usr/bin/perl

    use IO::File;
    use strict;

    sub get
    {
    my $ip = shift;

    my $rule = `/sbin/ipfw table 1 list | grep $ip`;

    my (@field) = split(/\s+/, $rule);

    return $field[1] || '0';
    };

    sub set
    {
    my $ip = shift;
    my $bw = shift || '0';

    system sprintf '/sbin/ipfw -q table 1 delete %s', $ip;
    system sprintf '/sbin/ipfw -q table 1 add %s %d', ($ip, $bw);
    return 1;
    };

    my $fh = IO::File->new('/netup/utm5/log/dynashape.tmp') || die "Unable to open dynashape.tmp!\n\n";

    while ( <$fh> )
    {
    my (@var) = split(/\s+/, $_);

    next if ( $var[4] > 512 );

    my $rule = `/sbin/ipfw show | grep count | grep $var[1]`;

    next if (!$rule);

    my (@field) = split(/\s+/, $rule);

    next if ($field[2]==0);

    system "/sbin/ipfw -q zero $field[0]";

    my $bw = get($var[1]);

    if ( $bw > 0 )
    {
    my $max = int($bw*1000/8*0.92*120);
    if ( ($field[2] > ($max/5)) && ($bw/2 > 16) ) { set($var[1], $bw/2); printf STDERR "%s: %dkbps -> %dkbps\n", ($var[1], $bw, $bw/2); }
    # elsif ( ($field[2] < ($max/5)) && ($bw < $var[4]) ) { set($var[1], $var[4]); printf STDERR "%s: %dkbps -> %dkbps\n", ($var[1], $bw, $var[4]); };
    }
    }

    $fh->close();
Скрипт читает данные из файла dynashape.tmp берет оттуда значение ИП и скорости для него - если разрешенная скорость больше 512К ( самый дешевый безлимитный тариф ) то такого пользователя не трогаем - у него приоритет высокий, если скорость ниже то начинаем проверять его на скачку, по нашему алгоритму, занял больше 20 % полосы скорость урезаем , и т.д.
Все сделанно только для исходящего на пользователя трафика - входящий не шейпируем.

Аватара пользователя
stmw00d00
Сообщения: 51
Зарегистрирован: Пт ноя 02, 2007 16:18
Контактная информация:

Сообщение stmw00d00 »

А в чем собственно вопрос?

gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Сообщение gil »

в мануалы надо переместить, думаю =)

Ответить