UTM + pptp + динамические IP

Технические вопросы по UTM 5.0
wingman
Сообщения: 136
Зарегистрирован: Чт дек 07, 2006 15:36
Контактная информация:

Сообщение wingman »

В итоге с utm5_radius не срослось. Слишком подглючивающий и неповоротливый.

Выкладываю рецепт динамики с freeradius, суть его примерно как в предпоследнем посте от ув. Arti на этой странице: viewtopic.php?t=6980&postdays=0&postorder=asc&start=15


1. Пулы прописываются на NAS'ах. Выдаются IP-адреса из пулов - когда от радиуса не приходит аттрибут Framed-IP-Address.

2. У нас статические ипы выдаются из отдельного диапазона, поэтому если в билинге привязан 93.157.x.x - выдаётся Framed-IP-address, иначе - Framed-Pool.

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

authorize_reply_query = "SELECT '','%{SQL-User-Name}','Framed-IP-Address',inet_ntoa( ip_groups.ip & 0xffffffff ) AS ip,'=' \
    FROM UTM5.ip_groups WHERE uname ='%{SQL-User-Name}' AND is_deleted = '0' \
    AND inet_ntoa( ip_groups.ip & 0xffffffff ) LIKE '93.157.%' \
UNION SELECT '', '%{SQL-User-Name}', 'Framed-Pool', 'mainpool', '=' FROM ip_groups \
    WHERE uname ='%{SQL-User-Name}' AND inet_ntoa( ip_groups.ip & 0xffffffff ) NOT LIKE '93.157.%' \
UNION select '', '%{SQL-User-Name}', 'Mikrotik-Rate-Limit', radius_data.value, '=' \
    FROM radius_data \
    WHERE radius_data.owner_id=( select sl.service_id FROM ip_groups ig, iptraffic_service_links isl, service_links sl \
                                where ig.uname='%{SQL-User-Name}' and ig.is_deleted=0 and ig.ip_group_id=isl.ip_group_id \
                                 and isl.is_deleted=0 and isl.id=sl.id and sl.is_deleted=0) \
    AND radius_data.vendor=14988"

3. Чтобы при этом считался трафик по netflow, необходимо выданный IP привязывать к аккаунту пользователя. Для этого я подключил rlm_perl с использованием единственной функции - accounting.
Можно, в принципе, использовать и rlm_exec, но перл загружается при старте радиуса, а exec - каждый раз при вызове, что гораздо более ресурсоёмко.

/etc/raddb/radiusd.conf:

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

modules {
        perl {
                module = /etc/raddb/rad.pl
        }
..........
}

/etc/raddb/sites-enabled/default:

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

accounting {
   detail
   sql
   perl
}

/etc/raddb/rad.pl -- это прилагаемый к поставке фрирадиуса example.pl с переделанной ф-ией accounting.
rad.pl:

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

use strict;
use DBI;

my $DBH = DBI->connect("DBI:mysql:database=UTM5;host=localhost", "xxx", "xxx");
$DBH->{mysql_auto_reconnect}=1;
my $sth = "";
my $URFA_CALL = "/netup/utm5/bin/utm5_urfaclient ";


.....................
# Function to handle accounting
sub accounting {

        # Тут проверяется, не из диапазона ли реальных внешников выдан IP
        if($RAD_REQUEST{'Acct-Status-Type'} eq 'Start' && not($RAD_REQUEST{'Framed-IP-Address'} =~ m/93.157.(xxx|yyy|zzz|zxc|cxz).[0-9]+/i) )
        {
                my $fip = $RAD_REQUEST{'Framed-IP-Address'};
                my $uname = $RAD_REQUEST{'SQL-User-Name'};
                my $sessid = $RAD_REQUEST{'Acct-Session-Id'};

                # 1. Find ip-goup with this (dynamic) ip AND! empty login (just ensure it's dynamic) AND remove it
                $sth = $DBH->prepare("SELECT ip_group_id FROM `ip_groups` where `ip`=inet_aton('$fip') AND uname='' AND is_deleted=0");
                $sth->execute;
                if($sth->rows)
                {
                        while(my $ref = $sth->fetchrow_arrayref)
                        {
                                my $ipg_id = $$ref[0];
                                `$URFA_CALL -a iphome_delete_from_ipgroup -ip_group_id $ipg_id -ip_address "$fip"`;
                        }
                }

                # 2. Find connected user info AND add this ip to hem:
                $sth = $DBH->prepare("SELECT service_links.id as slink_id, service_links.service_id as service_id,
                users.id as uid, accounts.id as aid, periodic_service_links.discount_period_id AS did
                FROM ip_groups
                INNER JOIN iptraffic_service_links isl ON isl.ip_group_id=ip_groups.ip_group_id
                INNER JOIN service_links ON service_links.id=isl.id
                INNER JOIN periodic_service_links ON periodic_service_links.id=service_links.id
                INNER JOIN accounts ON accounts.id=service_links.account_id
                INNER JOIN users ON users.basic_account=accounts.id
                WHERE ip_groups.uname='$uname' AND ip_groups.is_deleted=0
                AND isl.is_deleted=0
                AND accounts.is_deleted=0
                AND users.is_deleted=0");
                $sth->execute;
                while(my $ref = $sth->fetchrow_arrayref)
                {
                        my $slink_id = $$ref[0];
                        my $service_id = $$ref[1];
                        my $uid = $$ref[2];
                        my $aid = $$ref[3];
                        my $did = $$ref[4];
                        `$URFA_CALL -a iphome_add_ip -user_id $uid -account_id $aid -slink_id $slink_id -service_id $service_id -ip_address "$fip" -discount_period_id $did`;
                }


        }

        return RLM_MODULE_OK;
}


/netup//utm5/xml/iphome_delete_from_ipgroup.xml

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

<?xml version="1.0"?>
<urfa>
        <parameter name="ip_group_id"/>
        <parameter name="ip_address"/>
<call function="rpcf_delete_from_ipgroup_by_ipgroup"/>
</urfa>
/netup//utm5/xml/iphome_add_ip.xml

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

<?xml version="1.0"?>
<urfa>
    <parameter name="user_id"/>
    <parameter name="account_id"/>
    <parameter name="slink_id"/>
    <parameter name="service_id"/>
    <parameter name="service_type" value="3"/>
    <parameter name="discount_period_id"/>
    <parameter name="ip_address"/>
    <parameter name="ip_not_vpn" value="0"/>
    <parameter name="mask" value="255.255.255.255"/>
    <parameter name="return_type" value="integer_return"/>
<call function="rpcf_add_service_to_user"/>
</urfa>
Вот, в принципе, и всё. Работает отлично уже несколько суток.
Если кому нужно - пользуйтесь, если у кого есть советы по шлифовке - буду весьма рад =)


P.S. При таком способе не нужно заморачиваться с коммутируемым доступом, сиречь переделывать все тарифы и (в моём случае больше 10к) всех юзеров.
Ещё один плюс - реально делать динамику не глобально, а, например, на отдельном VPN-сервере с отдельным радиусом, и обкатывать хоть до посинения без, опять же, изменения тарифов/услуг в билинге.
Последний раз редактировалось wingman Ср июн 02, 2010 19:56, всего редактировалось 3 раза.

mikkey finn
Сообщения: 1612
Зарегистрирован: Пт ноя 10, 2006 15:23

Сообщение mikkey finn »

Если Вам не сложно, повесьте на мониторинг количество авторизаций в секунду. Хотелось бы глянуть статистику. А то райп в последнее время ну оооочень жадный. Еле выбили 10к адресов, возможно придется переезжать на те же рельсы с динамикой. За решение спасибо.

wingman
Сообщения: 136
Зарегистрирован: Чт дек 07, 2006 15:36
Контактная информация:

Сообщение wingman »

mikkey finn писал(а):Если Вам не сложно, повесьте на мониторинг количество авторизаций в секунду. Хотелось бы глянуть статистику. А то райп в последнее время ну оооочень жадный. Еле выбили 10к адресов, возможно придется переезжать на те же рельсы с динамикой. За решение спасибо.
Попробую вечером, сейчас утренняя статистика не особо актуальна =)

wingman
Сообщения: 136
Зарегистрирован: Чт дек 07, 2006 15:36
Контактная информация:

Сообщение wingman »

Сейчас, в пол-пятого, нагрузка божеская:

всего 0,578 запросок/сек
Из них 0,175/с - Login OK, 0,402/с - Login fail & Multiple logins

Вообще сейчас выходные и подключения "размазаны" по всем суткам, интереснее статистика в будни, когда все с работы приходят

P.S. на порядки больше запросов interim-update, но как от них избавиться и не иметь проблем с Simultaneous-Use - хз ;(

Arti
Сообщения: 266
Зарегистрирован: Пн окт 01, 2007 02:44

Сообщение Arti »

wingman писал(а): P.S. на порядки больше запросов interim-update, но как от них избавиться и не иметь проблем с Simultaneous-Use - хз ;(
Можно попробывать отдавать 'Acct-Interim-Interval' по-больше. Я отдаю 120 секунд правда в "продакшен" у меня крутится статика.

Запрос simul_count_query выполняется один раз и может быть типа такого:

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

simul_count_query = "\
        SELECT COUNT&#40;User_Name&#41; FROM dhs_sessions_log\
        WHERE User_Name='%&#123;SQL-User-Name&#125;' AND\
        &#40;Acct_Status_Type = '3' OR Acct_Status_Type = '1'&#41; AND\
        last_update_date > &#40;UNIX_TIMESTAMP&#40;&#41; - 600&#41;;"
Можно добавить в таблицу нужные индексы.

Соотвественно нужно при открытии сессии в last_update_date поставить текучее время.

Остаётся конешно проблема гонок - может быть так что сессия не запишется до проверки на Simultaneous-Use. Решить можно блокировкой таблицы при открытии сессии или использовать один экземпляр процесса авторизации....

Я лично побоялся делать блокировку таблицы - оставил так.

wingman
Сообщения: 136
Зарегистрирован: Чт дек 07, 2006 15:36
Контактная информация:

Сообщение wingman »

А кто как с таким борется: http://forum.nag.ru/forum/index.php?s=& ... t&p=499669
Думаю теперь, а нужна ли динамика вообще? =)

mikkey finn
Сообщения: 1612
Зарегистрирован: Пт ноя 10, 2006 15:23

Сообщение mikkey finn »

Мы пока натим. Новые блоки будем распределять, начальство уже предупредил несколько раз, что придется канал расширять.

wingman
Сообщения: 136
Зарегистрирован: Чт дек 07, 2006 15:36
Контактная информация:

Сообщение wingman »

mikkey finn писал(а):Мы пока натим. Новые блоки будем распределять, начальство уже предупредил несколько раз, что придется канал расширять.
Если бы расширять нужно было для даунлоада - да ради бога, но как же блин обидно и нереально терперь абсолютно бессмысленный и никому не нужный на самом деле аплоад, в 3 раза превышающий даунлоад :D

mikkey finn
Сообщения: 1612
Зарегистрирован: Пт ноя 10, 2006 15:23

Сообщение mikkey finn »

А вот тут в полный рост встает проблемой то, что считали плюсом локалок. На ДСЛ чуть-ли не норма 4:1 соотношение даунлоада к аплоаду. А в эзернете 1:1. Вот ежели пересматривать тарифную политику, то не будет такой проблемы.

wingman
Сообщения: 136
Зарегистрирован: Чт дек 07, 2006 15:36
Контактная информация:

Сообщение wingman »

mikkey finn писал(а):А вот тут в полный рост встает проблемой то, что считали плюсом локалок. На ДСЛ чуть-ли не норма 4:1 соотношение даунлоада к аплоаду. А в эзернете 1:1. Вот ежели пересматривать тарифную политику, то не будет такой проблемы.
Видимо придется
В крупняках типа корбины не афишируется, пишется "безлимит 5 мбит", но аплоад режется как минимум в половину, и это притом, что львиная доля их торент-трафика в своей же сети и замыкается

Arti
Сообщения: 266
Зарегистрирован: Пн окт 01, 2007 02:44

Сообщение Arti »

ИМХО резать исходящий трафик в разы бессмысленно.

Достаточно срезать до такой степени, чтобы суммарный входящий и исходящий трафик в час пик был примерно равный. Т.е. возможно что 80% будет достаточно.

Очень неплохо подключить кокой-нибуть "пиринг" - точку обмена маршрутами между провайдерами - чем больше адресное пространство - тем лучше. На этот ix будет ити достаточно большая часть p2p трафика.

wingman
Сообщения: 136
Зарегистрирован: Чт дек 07, 2006 15:36
Контактная информация:

Сообщение wingman »

Arti писал(а):ИМХО резать исходящий трафик в разы бессмысленно.

Достаточно срезать до такой степени, чтобы суммарный входящий и исходящий трафик в час пик был примерно равный. Т.е. возможно что 80% будет достаточно.

Очень неплохо подключить кокой-нибуть "пиринг" - точку обмена маршрутами между провайдерами - чем больше адресное пространство - тем лучше. На этот ix будет ити достаточно большая часть p2p трафика.
Ххххе ;)
Сейчас порезали в 2 раза тарифы <=20mb/s, а >20 - обрезали до 10mb/s.
При этом процентов на 30 исходящий превышает входящий. Так что, наверно, от близости к мск/скорости тарифов/избалованности юзверей зависит

А пиринг в процессе, на м9 зашли, будем пирить... Только вот торрентский мусор летает в основном по корбинам всяким, которые не пирятся в принципе ;(

Arti
Сообщения: 266
Зарегистрирован: Пн окт 01, 2007 02:44

Сообщение Arti »

Видимо да.

Есть еще "жлобский" вариант: ограничение количества tcp соединений - ограничение можно сделать только на вход. Основная проблема - ресурсоемкость такого решения.

P.S.

Я имел неосторожность посмотреть это график:

Изображение

Изображение

Точно есть смысл морочиться ? :)

wingman
Сообщения: 136
Зарегистрирован: Чт дек 07, 2006 15:36
Контактная информация:

Сообщение wingman »

Вот и мы об этом раздумываем =)

Сейчас парк НАСов состоит из немаленькой кучи PC. Потихоньку раздумываем, что бы прикупить железное, заменяющее одно все сервачки. Но всё, что придумывается, натить либо не умеет, либо нат сжирает огромный кусок ресурсов.
Да даже и PC: без ната можно отрубить conntrack, что в 2-3 раза снизит нагрузку.

Кроме того, динамический внешник может рассматриваться как ещё одна "плюшка" сети. Сейчас за статические берется лишняя копейка, а юзеры всё чаще орут "а вот в (корбине|инфолайне|кададо|etc...) внешники бесплатно

xxxupg
Сообщения: 457
Зарегистрирован: Вс май 02, 2010 10:00

Сообщение xxxupg »

Сейчас парк НАСов состоит из немаленькой кучи PC
а мощность их какая? просто вот сейчас стоит задача заменить старую квадру на что-то более мощное..

Ответить