BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 05 июл 2025, 13:48

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: Разделение доступа
СообщениеДобавлено: 07 апр 2008, 13:52 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
На данный момент имется 1 NAS и 2 VLAN-а (VLAN100 и VLAN200), как сделать так чтобы пользователи VLAN100 не могли пользоваться тарифными планами (ТП) предназначенными для VLAN200 и наоборот?

Сейчас это реализовано следующим образом:

Start пакет VLAN100:
Код:
Tue Feb 19 15:59:10 2008
    Acct-Session-Id = "00001BC5"
    Framed-Protocol = PPP
    Framed-IP-Address = 192.168.100.111
    User-Name = "vpn0528"
    Acct-Authentic = RADIUS
    Acct-Status-Type = Start
    NAS-Port-Type = Virtual
    NAS-Port = 0
    NAS-Port-Id = "0/0/0/100"
    Service-Type = Framed-User
    NAS-IP-Address = 192.168.0.1
    Acct-Delay-Time = 0
    Client-IP-Address = 192.168.0.1
    Acct-Unique-Session-Id = "e95f43edb10ca47b"
    Timestamp = 1203425950

Start пакет VLAN200:
Код:
Tue Feb 19 15:59:24 2008
    Acct-Session-Id = "0001941C"
    Framed-Protocol = PPP
    Framed-IP-Address = 192.168.200.152
    User-Name = "vpn0493"
    Acct-Authentic = RADIUS
    Acct-Status-Type = Start
    NAS-Port-Type = Virtual
    NAS-Port = 0
    NAS-Port-Id = "0/0/0/200"
    Service-Type = Framed-User
    NAS-IP-Address = 192.168.0.1
    Acct-Delay-Time = 0
    Client-IP-Address = 192.168.0.1
    Acct-Unique-Session-Id = "05c514d0fe37efb6"
    Timestamp = 1203425964

Как Вы можете видеть NAS-Port-Id для разных VLAN различаются, в данном случае 100 и 200 - это VID тех VLAN из которых происходит подключение.

В конфигурации RADIUS-а (FreeRADIUS) написано:
Код:
# cat huntgroups | grep VLAN
VLAN100   NAS-Port-Id == "0/0/0/100"

После чего в ТП для VLAN100 (ТП в данном случае - групповая хар-ка пользователей) было указано что пользователи данного ТП могут коннектится только в рамках данной huntgroup.

Возникает вопрос - как реализовать в модуле DialUP некий аналог huntgroup средствами BGB? Реализовать на основе NAS-Port-Id или иного какого параметра который можно получить в start пакете, возможно пользователей даже не будет необходимости переводить в другой VLAN, т.е. сделать так чтобы пользователи имеющие набор RADIUS атрибутов пришедших в их start пакете не могли пользоваться ТП если некий параметр либо параметры их набора атрибутов не совпадают с атрибутами указанными в качестве обязательных для работы в ТП отличном от того ТП в котором они находятся.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 08 апр 2008, 16:28 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
Неужели нет никаких идей? :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 08 апр 2008, 16:44 
Не в сети

Зарегистрирован: 30 мар 2007, 15:56
Сообщения: 60
Карма: 0
Здесь наверное никто не смотрит. Надо попробовать задать вопрос сюда:http://www.bgbilling.ru/forum/viewforum.php?f=5

_________________
Чтобы понять рекурсию, нужно сначала понять рекурсию.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 10 апр 2008, 15:38 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
А можно подробнее, зачем, не с технической точки зрения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 10 апр 2008, 21:09 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
Amir писал(а):
А можно подробнее, зачем, не с технической точки зрения.
Конечно! Дело в том что BGB будет обслуживать 2 различных сети на одном NAS, в каждой сети свои договора, логины/алиасы, тарифы с различными ценами на различные услуги и т.д. и т.п. Очень хочется чтобы пользователь сети X не мог в своей сети воспользоваться логином/алиасом/паролем и соответственно тарифом пользователя из сети Y и наоборот. В силу человеческого фактора переток логинов/алиасов/паролей вполне возможен. Например - Вася, находящийся в сети X, дал Пете из сети Y свои логин и пароль для того чтобы Петя мог воспользоваться улугами/тарифами/ценами для него не предназначенными. Подобных моментов очень и очень хочется избежать. Скажите пожалуйста, это возможно? Если возможно, приведите, пожалуйста решение. Спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 11 апр 2008, 10:36 
Не в сети
Клиент

Зарегистрирован: 12 фев 2007, 18:49
Сообщения: 335
Карма: 15
На NAS ставим скрипт предобработки радиус-запросов:
Код:
import bitel.billing.server.radius.*;

portID = request.getStringAttribute( 87 ).split("/");
request.setStringAttribute( 30, portID[3] );

Этим скриптом вы скопируете номер VLAN-а в аттрибут Called-Station-ID.
Далее в нужных договорах в Ограничениях логина ставите 2 ограничения:
1.
Тип: По телефонам доступа
Ограничение: запретить
Телефон: *
Период: с текущей даты, конец периода оставляем пустым.
Услуги: Галочку на Время.

2.
Тип: По телефонам доступа
Ограничение: разрешить
Телефон: нужный VLAN
Период: с текущей даты, конец периода оставляем пустым.
Услуги: Галочку на Время.

Все, теперь абонент сможет выйти только из корректного VLAN-а, на других ему будет выдаваться 691.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 11 апр 2008, 10:40 
Не в сети
Клиент

Зарегистрирован: 12 фев 2007, 18:49
Сообщения: 335
Карма: 15
Совсем забыл, NAS-Port-Id обязательно должен идти в AUTHENTICATION_REQUEST, а не только в ACCOUNTING_START/UPDATE/STOP.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 11 апр 2008, 16:35 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
СПАСИБО ОГРОМНОЕ Вам, мил человек! Вот только вопрос есть - можно ли ограничение на группу повесить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 14 апр 2008, 09:09 
Не в сети
Клиент

Зарегистрирован: 12 фев 2007, 18:49
Сообщения: 335
Карма: 15
Нельзя, но можно создать два шаблона договора, где эти привязки изначально будут стоять.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 14 апр 2008, 12:52 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
Victor писал(а):
Нельзя, но можно создать два шаблона договора, где эти привязки изначально будут стоять.
Я так и думал делать, т.е. через шаблоны, просто вдруг чего-то большего захочется, например привязки VLAN-ов/МАС-ов и т.д. и т.п. к тарифам и т.п. ...

СПАСИБО еще раз!

/me счастливый побежал тестить и допиливать :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 15 апр 2008, 15:52 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
Если получиться - в wiki.bgbilling.ru киньте решение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 15 апр 2008, 16:17 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
Администратор писал(а):
Если получиться - в wiki.bgbilling.ru киньте решение.
обязательно! у меня уже пара-тройка идей на статьи есть, так что писать буду непременно :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 20 янв 2009, 18:35 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
Продолжим тему :)

Дано:
Одна сеть, в которой, с использованием РРРоЕ, предоставляют услуги оператор А и оператор В, обоих операторов обслуживает один БГБ (почему так и откуда взялся оператор В - лучше даже не спрашивайте).
Пользователи оператора А создаются по шаблону foo${N4} и выходят в инет из VLAN 100-110.
Пользователи оператора В создаются по шаблону bar${N4} и выходят в инет из VLAN 200-205.
Все пользователи имеют алиасы == номеру договора (алиас создается при создании договора).

Задача:
Т.к. пользователи каждого из операторов имеют свои тарифы, условия приема денег и т.д. и т.п. необходимо сделать так чтобы пользователи оператора А не могли выходить в инет из VLAN-ов оператора В и наоборот.

Решение:
Решение предложенное выше ув. Victor (за что ему огромное человеческое СПАСИБО!) хотя и имеет право на жизнь, меня не устроило прежде всего тем что необходимо править массу договоров, а мне хотелось, для упрощения администрирования, вносить изменения ровно в одном месте и я сделал это так:
Код:
import bitel.billing.server.radius.*;
import bitel.billing.server.script.event.*;
import java.util.*;

// события RADIUS-аутентификации (после аутентификации, перед отправкой ответа):
// event.getRequest|getResponse|getLogin|getContract|getErrorCode
errorCode = event.getErrorCode();
request   = event.getRequest();
response  = event.getResponse();

// логин пользователя из User-Name (attribute 1, string)
login = request.getStringAttribute(RadiusStandartAttributes.User_Name);

// VLAN из NAS-Port-Id (attribute 87, string)
// выглядит как: NAS-Port-Id=1/0/0/VLAN_ID
portId = request.getStringAttribute(87).split("/");

try {
    vlan = Integer.parseInt(portId[3]);
} catch (NumberFormatException e) {
    print(e.toString());
}

// массив регекспов алиасов
String[] loginArr = {
                        "^foo[0-9]{4}$",
                        "^bar[0-9]{4}$"
                    };
// массив разрешенных для этих алиасов VLAN-ов
int[][] vlanArr   = {
                        {100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110},
                        {200, 201, 202, 203, 204, 205}
                    };

// проверка пользователя регекспом
loginArrIdx = -1;

for (i = 0; i < loginArr.length; i++) {
    if (login.matches(loginArr[i])) {
        loginArrIdx = i;
        break;
    }
}

if (loginArrIdx == -1) {
    response.setPacketType(RadiusPacket.AUTHENTICATION_REJECT);
    print("\nЛогин '" + login + "' не разрешен для входа!");
    return;
}

// проверка VLAN из которого пришел пользователь
vlanArrIdx = -1;

for (i = 0; i < vlanArr[loginArrIdx].length; i++) {
    if (vlan == vlanArr[loginArrIdx][i]) {
        vlanArrIdx = i;
        break;
    }
}

if (vlanArrIdx == -1) {
    response.setPacketType(RadiusPacket.AUTHENTICATION_REJECT);
    print("\nVLAN '" + vlan + "' не разрешен для логина '" + login + "'\nРазрешенные VLAN: " + Arrays.toString(vlanArr[loginArrIdx]));
    return;
}


// статистика при нулевом балансе
if (errorCode == 4) {
    // код для обработки 691-й ошибки
}

Т.е. есть 2 взаимосвязанных массива: один - с регекспами алиасов, второй - с VLAN-ами для каждого регекспа.
Если алиас попадает под регексп - проверяем есть ли VLAN из которого он пришел в списке разрешенных, если есть - пускаем, если нет - даем отлуп. Если алиас не попадает под регексп - даем отлуп.
Все это работает, но меня терзают смутные сомнения что все можно реализовать как то ... э-э-э ... попроще ... изящнее, что ли ... подскажите, пожалуйста, можно ли упростить алгоритм?

P.S. Правильно ли я понимаю, что конструкцию:
Код:
try {
    vlan = Integer.parseInt(portId[3]);
} catch (NumberFormatException e) {
    print(e.toString());
}
в биншелле можно привести к виду:
Код:
try {
    vlan = Integer.parseInt(portId[3]);
} catch (e) {
    print(e.toString());
}
или не правильно?

P.P.S. Есть ли какой нибудь метод которым можно было бы сообщить в монитор сессий о том что пользователя отбило именно скриптом?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 21 янв 2009, 07:15 
Не в сети
Клиент

Зарегистрирован: 12 фев 2007, 18:49
Сообщения: 335
Карма: 15
Ну если проблема только в массе договоров и дальнейшем контроле параметров, то можно работать напрямую с таблицей user_login_limit_x. Собственно мы так и делаем, все привязки к вланам и макам контролируются из самописного скрипта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 02 фев 2009, 16:07 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
разработчики хоть бы ответили можно это в вики или еще напильника надо :roll:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 03 фев 2009, 01:29 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
Я может не до конца все понял..
Но решил бы задачу так:
http://bgbilling.ru/v4.5/doc/ch07s08s01.html
В скрипте предобработки запроса устанавливайте на запрос разный код услуги "Время". Например, сделать услуги "Время VLAN1", "Время VLAN2". Соответсвенно эта услуга должна быть только в нужном тарифе с нулевой стоимостью..
Ну и тариф определяет на каком VLAN может работать договор..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 03 фев 2009, 15:11 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
интересное решение! я что-то даже и не подумал о подобном :roll:


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.058s | 52 Queries | GZIP : On ]