forum.bitel.ru http://forum.bitel.ru/ |
|
Разделение доступа http://forum.bitel.ru/viewtopic.php?f=5&t=979 |
Страница 1 из 1 |
Автор: | snark [ 07 апр 2008, 13:52 ] |
Заголовок сообщения: | Разделение доступа |
На данный момент имется 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 пакете не могли пользоваться ТП если некий параметр либо параметры их набора атрибутов не совпадают с атрибутами указанными в качестве обязательных для работы в ТП отличном от того ТП в котором они находятся. |
Автор: | snark [ 08 апр 2008, 16:28 ] |
Заголовок сообщения: | |
Неужели нет никаких идей? ![]() |
Автор: | Igor [ 08 апр 2008, 16:44 ] |
Заголовок сообщения: | |
Здесь наверное никто не смотрит. Надо попробовать задать вопрос сюда:http://www.bgbilling.ru/forum/viewforum.php?f=5 |
Автор: | Amir [ 10 апр 2008, 15:38 ] |
Заголовок сообщения: | |
А можно подробнее, зачем, не с технической точки зрения. |
Автор: | snark [ 10 апр 2008, 21:09 ] |
Заголовок сообщения: | |
Amir писал(а): А можно подробнее, зачем, не с технической точки зрения. Конечно! Дело в том что BGB будет обслуживать 2 различных сети на одном NAS, в каждой сети свои договора, логины/алиасы, тарифы с различными ценами на различные услуги и т.д. и т.п. Очень хочется чтобы пользователь сети X не мог в своей сети воспользоваться логином/алиасом/паролем и соответственно тарифом пользователя из сети Y и наоборот. В силу человеческого фактора переток логинов/алиасов/паролей вполне возможен. Например - Вася, находящийся в сети X, дал Пете из сети Y свои логин и пароль для того чтобы Петя мог воспользоваться улугами/тарифами/ценами для него не предназначенными. Подобных моментов очень и очень хочется избежать. Скажите пожалуйста, это возможно? Если возможно, приведите, пожалуйста решение. Спасибо!
|
Автор: | Victor [ 11 апр 2008, 10:36 ] |
Заголовок сообщения: | |
На 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. |
Автор: | Victor [ 11 апр 2008, 10:40 ] |
Заголовок сообщения: | |
Совсем забыл, NAS-Port-Id обязательно должен идти в AUTHENTICATION_REQUEST, а не только в ACCOUNTING_START/UPDATE/STOP. |
Автор: | snark [ 11 апр 2008, 16:35 ] |
Заголовок сообщения: | |
СПАСИБО ОГРОМНОЕ Вам, мил человек! Вот только вопрос есть - можно ли ограничение на группу повесить? |
Автор: | Victor [ 14 апр 2008, 09:09 ] |
Заголовок сообщения: | |
Нельзя, но можно создать два шаблона договора, где эти привязки изначально будут стоять. |
Автор: | snark [ 14 апр 2008, 12:52 ] |
Заголовок сообщения: | |
Victor писал(а): Нельзя, но можно создать два шаблона договора, где эти привязки изначально будут стоять. Я так и думал делать, т.е. через шаблоны, просто вдруг чего-то большего захочется, например привязки VLAN-ов/МАС-ов и т.д. и т.п. к тарифам и т.п. ...
СПАСИБО еще раз! /me счастливый побежал тестить и допиливать ![]() |
Автор: | Администратор [ 15 апр 2008, 15:52 ] |
Заголовок сообщения: | |
Если получиться - в wiki.bgbilling.ru киньте решение. |
Автор: | snark [ 15 апр 2008, 16:17 ] |
Заголовок сообщения: | |
Администратор писал(а): Если получиться - в wiki.bgbilling.ru киньте решение. обязательно! у меня уже пара-тройка идей на статьи есть, так что писать буду непременно ![]() |
Автор: | snark [ 20 янв 2009, 18:35 ] |
Заголовок сообщения: | |
Продолжим тему ![]() Дано: Одна сеть, в которой, с использованием РРРоЕ, предоставляют услуги оператор А и оператор В, обоих операторов обслуживает один БГБ (почему так и откуда взялся оператор В - лучше даже не спрашивайте). Пользователи оператора А создаются по шаблону 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. Есть ли какой нибудь метод которым можно было бы сообщить в монитор сессий о том что пользователя отбило именно скриптом? |
Автор: | Victor [ 21 янв 2009, 07:15 ] |
Заголовок сообщения: | |
Ну если проблема только в массе договоров и дальнейшем контроле параметров, то можно работать напрямую с таблицей user_login_limit_x. Собственно мы так и делаем, все привязки к вланам и макам контролируются из самописного скрипта. |
Автор: | snark [ 02 фев 2009, 16:07 ] |
Заголовок сообщения: | |
разработчики хоть бы ответили можно это в вики или еще напильника надо ![]() |
Автор: | Администратор [ 03 фев 2009, 01:29 ] |
Заголовок сообщения: | |
Я может не до конца все понял.. Но решил бы задачу так: http://bgbilling.ru/v4.5/doc/ch07s08s01.html В скрипте предобработки запроса устанавливайте на запрос разный код услуги "Время". Например, сделать услуги "Время VLAN1", "Время VLAN2". Соответсвенно эта услуга должна быть только в нужном тарифе с нулевой стоимостью.. Ну и тариф определяет на каком VLAN может работать договор.. |
Автор: | snark [ 03 фев 2009, 15:11 ] |
Заголовок сообщения: | |
интересное решение! я что-то даже и не подумал о подобном ![]() |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |