LINUX-BG   Адрес : http://www.linux-bg.org
Как да ограничим Dial-up по трафик като използваме ICRadius
От: Todor Lazarov
Публикувана на: 20-02-2002
Адрес на статията: http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=advices&key=338073781
Ето ви едно решение как да огражичим Dial-up по трафик като използваме ICRadius

IC-RADIUS 0.18.1 не разполага със средства за да можем да ограничаваме Dial-up по трафик.
По не аз не можаш да открия.

За това ето едно решение за това.

Хубавото е че Linux е отворена система (т.е. всеки може да променя кода)

Ето и какво сам добавил:

----------------------------------------------------------------------------------
1. files.c

след ред 429: case PW_WEEKLY_TIME_LIMIT:
се добавя: case PW_MAX_MEGABYTES:

Променлива която се проверява в файла auth.c
----------------------------------------------------------------------------------

2. radius.h
след ред 156: #define PW_WEEKLY_TIME_LIMIT 2006
се добавя: #define PW_MAX_MEGABYTES 2010

Деклариране на тази променлива

----------------------------------------------------------------------------------
3. auth.c

Поставете го например след проверката за WEEKLY_TIME_LIMIT за Realm

/* New attribute in Mb format */
if (result >=0 && (check_item = pairfind(authreq->check_pairs, PW_MAX_MEGABYTES)) != NULL) {

  SQL_ROW row;
  char querystr[256];
  unsigned long allowed;
  unsigned long used = 0;

  allowed = check_item->lvalue * 1048576;

  /* Проверка дали Realm е надхвърлил трафика
       тука можем и да проверяваме и за месец, ден и т.н */
  sprintf(querystr, "SELECT SUM(AcctInputOctets+AcctOutputOctets) FROM radacct WHERE Realm ='%s'", authreq->realm);

  sql_select_query(socket, querystr);
  row = sql_fetch_row(socket);

  if (row[0] == NULL)
     used = 0;
  else
      used = atol(row[0]);
  sql_finish_select_query(socket);

  if (used >= allowed) {
     sprintf(umsg, "\r\nYour realm has reached it's limit of %d Mb\r\n\n",(int)check_item->lvalue);
     user_msg = umsg;
     result = -1;

     /* Връща се резултат за грешка при индификацията
        с което напрактика се води до прекъсване на сесията*/
     rad_send_reply(PW_AUTHENTICATION_REJECT, authreq, authreq->reply_pairs, user_msg, activefd);
     log(L_ERR, "ERR - Realm usage limit of %d Mb reached: [%s] (%s)", (int)check_item->lvalue, authreq->realm, auth_name(authreq, 1));
  }
}



Поставете го например след проверката за MAX_HOURS за Username


/* New attribute in Mb format */
 if (result >=0 && (check_item = pairfind(authreq->check_pairs, PW_MAX_MEGABYTES)) != NULL) {

    SQL_ROW row;
    char querystr[256];
    unsigned long allowed;
    unsigned long used = 0;

    allowed = check_item->lvalue * 1048576;

    /* Проверка дали потребителя е надхвърлил трафика
       тука можем и да проверяваме и за месец, ден и т.н */

    sprintf(querystr, "SELECT SUM(AcctInputOctets+AcctOutputOctets) FROM radacct WHERE UserName ='%s'", authreq->realm);

    sql_select_query(socket, querystr);
    row = sql_fetch_row(socket);

    if (row[0] == NULL)
       used = 0;
    else
        used = atol(row[0]);
    sql_finish_select_query(socket);

    if (used >= allowed) {
       sprintf(umsg, "\r\nYour account has reached its limit of %d Mb\r\n\n", (int)check_item->lvalue);
       user_msg = umsg;
       result = -1;

       /* Връща се резултат за грешка при индификацията
        с което напрактика се води до прекъсване на сесията*/

       rad_send_reply(PW_AUTHENTICATION_REJECT, authreq, authreq->reply_pairs, user_msg, activefd);
       log(L_ERR, "ERR - Usage limit of %d Mb reached: [%s] (%s)", (int)check_item->lvalue, namepair->strvalue, auth_name(authreq, 1));
   }
}


4. Добавете ред в таблица dictionnary:

INSERT INTO dictionnary (Type, Attribute, Value, Format) VALUES ('ATTRIBUTE', 'MAX_MEGABYTES', '2010', 'integer');


след което си прекомпилирайте ICRadius-a и го стартирайте отново


Самото задаване го извършвам от модула radius.cgi
Това е показано в прикрепения файл:


Една забележка:

Има само едно слабо место !!!
Както виждате от source данните се четат от таблицата radacct
А там се записват данните след като сесията свърши.

т.е. Dial-up ноже да превиши дадения му трафик ако го надхвърли в дадена сесия.
Но при следващо логване машината ще го изхвърли.

Което разбира се е някъкъв резултат. !!!

<< КАК ДА СЕ БЪЛГАРИЗИРАМЕ - нов тертип | Девет препоръки за писане на сигурен php код >>

Авторите на сайта, както и техните сътрудници запазват авторските права върху собствените си материали публикувани тук, но те са copyleft т.е. могат свободно да бъдат копирани и разпространявани с изискването изрично да се упоменава името на автора, както и да се публикува на видно място, че те са взети от оригиналния им URL-адрес на този сървър (http://www.linux-bg.org). Авторските права на преводните материали принадлежат на техните автори. Ако с публикуването тук на някакъв материал неволно са нарушени нечии права - след констатирането на този факт материалът ще бъде свален.

All trademarks, logos and copyrights mentioned on this site are the property of their respective owners.
Linux is copyright by Linus Torvalds.
© Линукс за българи ЕООД 2007
© Slavei Karadjov 1999 - 2006

All rights reserved.

Изпълнението отне: 0 wallclock secs ( 0.17 usr + 0.02 sys = 0.19 CPU)