forum.bitel.ru
http://forum.bitel.ru/

Перенаправление при отрицательном балансе
http://forum.bitel.ru/viewtopic.php?f=5&t=1581
Страница 1 из 1

Автор:  m2pod [ 07 ноя 2008, 16:17 ]
Заголовок сообщения:  Перенаправление при отрицательном балансе

Существует ли такая возможность когда у клиента "-" чтобы происходило соединение но при заходе на любой сайт его перенаправляло на определнную страничку на которой написано что у него не хватает денег на счету и надо счет пополнить?
Заранее благодарен

Автор:  Администратор [ 07 ноя 2008, 17:39 ]
Заголовок сообщения: 

http://wiki.bgbilling.ru/index.php/%D0% ... _DialUP.29
Детальное информирование абонентов о причинах ошибки 691

Автор:  m2pod [ 18 ноя 2008, 17:06 ]
Заголовок сообщения: 

в нем сложно разобраться.
там есть скрипт который передает accept вместо reject.
хотелось бы чтобы с "-" пускало, присваивало определенный ип из диапазона, а дальше сделать так чтобы все запросы с этих ип редиректились на определенную страницу, где и будут описаны возможные проблемы
там описан метод для cisco, как реализовать это в связке freebsd+mpd мозгов не хватает
хотим купить биллинг, осталось научиться реализовать пару штук и все будет готово :roll:

Автор:  snark [ 19 ноя 2008, 01:01 ]
Заголовок сообщения: 

m2pod писал(а):
в нем сложно разобраться.

не правда Ваша, там все достаточно банально и просто ...
m2pod писал(а):
там описан метод для cisco, как реализовать это в связке freebsd+mpd

помимо регистрации ошибок, там описаны RADIUS атрибуты, все что Вам надо - удалить все ненужное Вам (читай - регистрацию ошибок) прописать RADIUS атрибуты соответствующие Вашему NAS и все! ;)

Автор:  m2pod [ 20 ноя 2008, 14:14 ]
Заголовок сообщения: 

проблему вызвало вот это


// Cisco-AV-Pair, устанавливаем WCCP-редирект на интерфейс
rva = new RadiusVendorAttribute( 9, 1 );
rva.setStringValue( "lcp:interface-config=ip wccp web-cache redirect in" );

// Cisco-AV-Pair, Устанавливаем access-list 155 на интерфейс
rvaAcc = new RadiusVendorAttribute( 9, 1 );
rvaAcc.setStringValue( "ip:inacl=155" );

с mpd как?

Автор:  snark [ 20 ноя 2008, 17:34 ]
Заголовок сообщения: 

m2pod писал(а):
проблему вызвало вот это


// Cisco-AV-Pair, устанавливаем WCCP-редирект на интерфейс
rva = new RadiusVendorAttribute( 9, 1 );
rva.setStringValue( "lcp:interface-config=ip wccp web-cache redirect in" );

// Cisco-AV-Pair, Устанавливаем access-list 155 на интерфейс
rvaAcc = new RadiusVendorAttribute( 9, 1 );
rvaAcc.setStringValue( "ip:inacl=155" );

с mpd как?

т.е. у Вас проблемы с тем чтобы выдать юзеру отдельную IP подсеть которую потом спокойненько так заворачивать на Ваш сервер статистики?
например как то так:
Код:
ipfw add fwd 127.0.0.1,порт tcp from подсеть_неплательщиков to any 80

где
"порт" - порт на котором слушает Ваш НТТР сервер и где висит страничка с уведомлением о необходимости оплаты
"подсеть" - подсеть для неплательщиков

за точность синтаксиса не ручаюсь но суть Вы надеюсь поймете ...

Автор:  m2pod [ 20 ноя 2008, 19:31 ]
Заголовок сообщения: 

не пускает меня, пишет ошибка баланса
вот сам скрипт
import bitel.billing.server.call.bean.Login;
import bitel.billing.server.radius.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.event.*;
import java.util.*;

// event.getRequest|getResponse|getLogin|getContract|getErrorCode
login = event.getLogin();

// Ищем пользователя и IP, привязанный к нему в таблице
// "radius_pair_ip_x", где "x" код модуля Dialup.
ps = con.prepareStatement( "SELECT ip FROM radius_pair_ip_1 WHERE id=?" );

ps.setInt( 1, login.getId() );
rs = ps.executeQuery();

login_ip = 0;
while( rs.next() )
login_ip = rs.getInt( 1 );

errCode = event.getErrorCode();

// Если логину не присвоен IP-адрес, то даем AUTH_REJECT.
if( login_ip == 0 )
{
errCode = 2;
response = event.getResponse();
response.setPacketType( RadiusPacket.AUTHENTICATION_REJECT );
}

// 0 - нет ошибки, 2 - ошибка ввода пароля.
if( errCode != 0 && errCode != 2 )
{

response = event.getResponse();

response.setPacketType( RadiusPacket.AUTHENTICATION_ACCEPT );

// Готовим аттрибуты на отдачу

// Service-Type = 2
raSt = new RadiusAttribute( 6 );
raSt.setIntValue( 2 );

// Framed-Protocol = 1
raFp = new RadiusAttribute( 7 );
raFp.setIntValue( 1 );

// Framed-IP-Address
raIp = new RadiusAttribute( 8 );
raIp.setIntValue( login_ip );

// Session-Timeout = 900
raStm = new RadiusAttribute( 27 );
raStm.setIntValue( 900 );

rva = new RadiusVendorAttribute( 12341, 1 );
rva.setStringValue( "lcp:interface-config=ipfw add fwd 127.0.0.1 ip from 10.0.7.0/24 to any 80" );

rvaAcc = new RadiusVendorAttribute( 12341, 1 );
rvaAcc.setStringValue( "ip:inacl=155" );

response.addAttribute( raStm );
response.addAttribute( raSt );
response.addAttribute( raFp );
response.addAttribute( raIp );
response.addVendorAttribute( rva );
response.addVendorAttribute( rvaAcc );
}

не пускает наверно по причине что не присваивается ип, в скрипте написано что там берется из какойто таблицы. Надо чтобы присваивался ип из подсети 10.0.7.0. где это вписать? :oops:

Автор:  snark [ 20 ноя 2008, 20:10 ]
Заголовок сообщения: 

m2pod писал(а):
не пускает наверно по причине что не присваивается ип, в скрипте написано что там берется из какойто таблицы. Надо чтобы присваивался ип из подсети 10.0.7.0. где это вписать? :oops:

так ведь Вам надо IP присвоить, а то что в скрипте есть - это то что используется человеком в его конкретной ситуации! т.е. если Вы это не используете - то и не пишите это в скрипт! как в MPD адреса назначаются? там есть понятие "указать из радиуса пул адресов"?

Автор:  m2pod [ 21 ноя 2008, 14:20 ]
Заголовок сообщения: 

1)а можно как-нибудь прописать отдельный пул в диал-ап модуле и его как то тут указать?
2)где идет проверка что у клиента отрицательный баланс?

Автор:  Администратор [ 21 ноя 2008, 15:57 ]
Заголовок сообщения: 

Пулами радиуса воспользоваться не получится, т.к. скрипт отрабатывает после всех обработок радиус-сервера. Можно держать пул в памяти, либо в базе. Где-то в форуме уже проскакивало сообщение по этой теме..

Автор:  snark [ 21 ноя 2008, 17:14 ]
Заголовок сообщения: 

говоря про пулы адресов я имел в виду прежде всего нечто в духе:
Код:
import bitel.billing.server.radius.*;
import bitel.billing.server.script.event.*;

errCode = event.getErrorCode();

if (errCode == 4 || errCode == 33) {
    print("Contract balance zero or contract not open!");

    resp = event.getResponse();
    resp.setPacketType(RadiusPacket.AUTHENTICATION_ACCEPT);

    // Service-Type = 2
    ra1 = new RadiusAttribute(6);
    ra1.setIntValue(2);

    // Framed-Protocol = 1
    ra2 = new RadiusAttribute(7);
    ra2.setIntValue(1);

    // Session-Timeout = 300
    ra3 = new RadiusAttribute(27);
    ra3.setIntValue(300);

    // Cisco-AVPair's
    rva1 = new RadiusVendorAttribute(9, 1);
    rva1.setStringValue("lcp:interface-config=ip unnumbered loopback 1");

    rva2 = new RadiusVendorAttribute(9, 1);
    rva2.setStringValue("ip:addr-pool=stat");

    response.addAttribute(ra1);
    response.addAttribute(ra2);
    response.addAttribute(ra3);
    response.addVendorAttribute(rva1);
    response.addVendorAttribute(rva2);
}

т.е. указание NAS-у на то что адрес надо брать из спец. пула адресов который никуда дальше NAS-а и статистики не пойдет ... разве в MPD нет такого функционала? или он может только выдать конкретный адрес через Framed-IP-Address и все?

Автор:  m2pod [ 25 ноя 2008, 20:48 ]
Заголовок сообщения: 

просветите уже по этому вопросу, а то остался последний штрих и все никак

Автор:  snark [ 25 ноя 2008, 21:14 ]
Заголовок сообщения: 

MPD понимает атрибут Framed-Pool (код "88")?

Автор:  m2pod [ 26 ноя 2008, 13:53 ]
Заголовок сообщения: 

Mpd implements dynamic IP addresses pool management. When user is authenticated and auth backend have not provided IP address, it can be taken from pool. To make it work you should create one or more address pools with 'set ippool add ...' command and define which pool should be used with 'set ipcp ranges ... ippool ...' command, radius-auth Framed-Pool attribute or ext-auth FRAMED_POOL attribute.

set ippool add pool first last

This command creates new IP address pool if it not exists and adds specified address range to it.

насколько я понял надо в конфиге мпд прописать этот самый пул адресов, далее где то прописать FRAMED_POOL, тоесть будет браться оттуда и все. главное чтобы можно было присвоить ип из определенной подсети, а потом когда клиент его получит фаер на шлюзе сам завернет его на определенную страничку.
Осталось узнать куда писать этот FRAMED_POOL. подскажите

Автор:  snark [ 26 ноя 2008, 18:41 ]
Заголовок сообщения: 

допустим у Вас есть 2 пула:
inet - для обычных юзеров
stat - для неплательщиков
создаете эти 2 пула, прописываете там адреса, а затем, подредактировав скрипт постом выше, получим что то в духе:
Код:
import bitel.billing.server.radius.*;
import bitel.billing.server.script.event.*;

errCode = event.getErrorCode();

if (errCode == 4 || errCode == 33) {
    print("Contract balance zero or contract not open!");

    resp = event.getResponse();
    resp.setPacketType(RadiusPacket.AUTHENTICATION_ACCEPT);

    // Service-Type = 2
    ra1 = new RadiusAttribute(6);
    ra1.setIntValue(2);

    // Framed-Protocol = 1
    ra2 = new RadiusAttribute(7);
    ra2.setIntValue(1);

    // Session-Timeout = 300
    ra3 = new RadiusAttribute(27);
    ra3.setIntValue(300);

    // Framed-Pool = stat
    ra4 = new RadiusAttribute(88);
    ra4.setStringValue("stat");

    response.addAttribute(ra1);
    response.addAttribute(ra2);
    response.addAttribute(ra3);
    response.addAttribute(ra4);
}

скрипт не проверен, но общую идею Вы думаю поняли ;)
"обычным юзерам" Вы можете выдавать хоть RADIUS-ом хоть самим MPD правильный пул, а "неплательщикам" - отдавать специальный пул

Автор:  Easy [ 27 ноя 2008, 13:15 ]
Заголовок сообщения: 

snark писал(а):
допустим у Вас есть 2 пула:
inet - для обычных юзеров
stat - для неплательщиков
создаете эти 2 пула, прописываете там адреса, а затем, подредактировав скрипт постом выше, получим что то в духе:
Код:
import bitel.billing.server.radius.*;
import bitel.billing.server.script.event.*;

errCode = event.getErrorCode();

if (errCode == 4 || errCode == 33) {
    print("Contract balance zero or contract not open!");

    resp = event.getResponse();
    resp.setPacketType(RadiusPacket.AUTHENTICATION_ACCEPT);

    // Service-Type = 2
    ra1 = new RadiusAttribute(6);
    ra1.setIntValue(2);

    // Framed-Protocol = 1
    ra2 = new RadiusAttribute(7);
    ra2.setIntValue(1);

    // Session-Timeout = 300
    ra3 = new RadiusAttribute(27);
    ra3.setIntValue(300);

    // Framed-Pool = stat
    ra4 = new RadiusAttribute(88);
    ra4.setStringValue("stat");

    response.addAttribute(ra1);
    response.addAttribute(ra2);
    response.addAttribute(ra3);
    response.addAttribute(ra4);
}

скрипт не проверен, но общую идею Вы думаю поняли ;)
"обычным юзерам" Вы можете выдавать хоть RADIUS-ом хоть самим MPD правильный пул, а "неплательщикам" - отдавать специальный пул


А если ситуация, что серверов доступа несколько? :\ Для каждого свой стат пул делать, отличный от всех других? Т.к. на статистику то они через маршрутизатор бегают, поэтому адреса везде должны быть уникальными...

Автор:  snark [ 27 ноя 2008, 13:37 ]
Заголовок сообщения: 

Easy писал(а):
А если ситуация, что серверов доступа несколько? :\ Для каждого свой стат пул делать, отличный от всех других? Т.к. на статистику то они через маршрутизатор бегают, поэтому адреса везде должны быть уникальными...

да хоть стопицот серверов! что мешает использовать на каждом из них один и тот же пул, с одним и тем же именем, с одними и теми же адресами которые будут просто NAT-ится для доступа к статистике? ;)

Автор:  Victor [ 27 ноя 2008, 14:09 ]
Заголовок сообщения: 

snark писал(а):
Easy писал(а):
А если ситуация, что серверов доступа несколько? :\ Для каждого свой стат пул делать, отличный от всех других? Т.к. на статистику то они через маршрутизатор бегают, поэтому адреса везде должны быть уникальными...

да хоть стопицот серверов! что мешает использовать на каждом из них один и тот же пул, с одним и тем же именем, с одними и теми же адресами которые будут просто NAT-ится для доступа к статистике? ;)

Ну натить не совсем правильно, иначе откуда страничка, на которую перенаправит пользователя, узнает кто на нее пришел, чтобы высветить баланс, код ошибки и т.п.
Есть мысль: определять статичную IP-шку для опред. реалма, на который обычным коннектом нельзя выйти, зато она будет подставляться при предобработки радиус-запроса... Этим мы обеспечим уникальность и идентификацию...

Автор:  m2pod [ 27 ноя 2008, 19:03 ]
Заголовок сообщения: 

проблему решил, все ок, спасибо всем кто помогал :)

Автор:  m2pod [ 01 дек 2008, 18:59 ]
Заголовок сообщения: 

в логах отработки появляется это

GENERATE_TIME: 01.12.08 15:18:20
EXECUTION_STOP_TIME: 01.12.08 15:18:21
PROCESS_TIME: 54

OUT:
Contract balance zero or contract not open!


ERROR:


EXCEPTIONS:
Sourced file: inline evaluation of: ``import bitel.billing.server.radius.*; import bitel.billing.server.script.event . . . '' : Attempt to resolve method: addAttribute() on undefined variable or class name: responseSourced file: inline evaluation of: ``import bitel.billing.server.radius.*; import bitel.billing.server.script.event . . . '' : Attempt to resolve method: addAttribute() on undefined variable or class name: response : at Line: 28 : in file: inline evaluation of: ``import bitel.billing.server.radius.*; import bitel.billing.server.script.event . . . '' : response .addAttribute ( ra1 )

at bsh.UtilEvalError.toEvalError(Unknown Source)
at bsh.UtilEvalError.toEvalError(Unknown Source)
at bsh.BSHMethodInvocation.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHBlock.evalBlock(Unknown Source)
at bsh.BSHBlock.eval(Unknown Source)
at bsh.BSHBlock.eval(Unknown Source)
at bsh.BSHIfStatement.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at bitel.billing.server.script.bean.ScriptMachine.runScript(ScriptMachine.java:158)
at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:247)
at bitel.billing.server.processor.DefaultProcessor.standartAuth(DefaultProcessor.java:187)
at bitel.billing.server.processor.dialup.DialUpProcessor.authenticationProcess(DialUpProcessor.java:106)
at bitel.billing.server.radius.RadiusRequestThread.processRequest(RadiusRequestThread.java:120)
at bitel.billing.server.radius.RadiusRequestThread.run(RadiusRequestThread.java:48)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)


WARNINGS:

Автор:  Amir [ 01 дек 2008, 20:21 ]
Заголовок сообщения: 

в скрипте переменная называется resp, однако чуть далее используется имя response
Цитата:
response.addAttribute(ra4);

Автор:  m2pod [ 01 дек 2008, 20:41 ]
Заголовок сообщения: 

import bitel.billing.server.radius.*;
import bitel.billing.server.script.event.*;

errCode = event.getErrorCode();

if (errCode == 4 || errCode == 33) {
print("Contract balance zero or contract not open!");

resp = event.getResponse();
resp.setPacketType(RadiusPacket.AUTHENTICATION_ACCEPT);

// Service-Type = 2
ra1 = new RadiusAttribute(6);
ra1.setIntValue(2);

// Framed-Protocol = 1
ra2 = new RadiusAttribute(7);
ra2.setIntValue(1);

// Session-Timeout = 300
ra3 = new RadiusAttribute(27);
ra3.setIntValue(300);

// Framed-Pool = nomoney
ra4 = new RadiusAttribute(88);
ra4.setStringValue("nomoney");

resp.addAttribute(resp);
resp.addAttribute(ra1);
resp.addAttribute(ra2);
resp.addAttribute(ra3);
resp.addAttribute(ra4);
}

Автор:  m2pod [ 02 дек 2008, 12:31 ]
Заголовок сообщения: 

GENERATE_TIME: 02.12.08 09:04:25
EXECUTION_STOP_TIME: 02.12.08 09:04:25
PROCESS_TIME: 23

OUT:
Contract balance zero or contract not open!


ERROR:


EXCEPTIONS:


WARNINGS:

скрипт отрабатывает без ошибок, не не дает accept вместо reject.
попросту не пускает

Автор:  m2pod [ 02 дек 2008, 17:43 ]
Заголовок сообщения: 

как оказалось коннект есть, но билинг пишит "Ошибка баланса" и не отображает сессии. Тоесть надо было саму зайти под минусовой учеткой

Автор:  Администратор [ 03 дек 2008, 17:24 ]
Заголовок сообщения: 

Биллинг и не будет их учитывать. А зачем их учет?

Автор:  stark [ 03 дек 2008, 18:22 ]
Заголовок сообщения: 

m2pod писал(а):
как оказалось коннект есть, но билинг пишит "Ошибка баланса" и не отображает сессии.


отказы не попадают в сессии . они попадают в ошибки (если смотреть в мониторе)

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/