Freeradius Xlat: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 28: Строка 28:
 
</PRE>
 
</PRE>
 
Обратить внимание, что для cisco передается Cisco-AVPair, для VPN на базе Linux я использую атрибуты PPPD-Upstream-Speed-Limit / PPPD-Downstream-Speed-Limit со значением скорости в килобитах (а не в битах как для Cisco) в секунду. Т.к. радиус не знает этих атрибутов, то их следует вписать в словарь.
 
Обратить внимание, что для cisco передается Cisco-AVPair, для VPN на базе Linux я использую атрибуты PPPD-Upstream-Speed-Limit / PPPD-Downstream-Speed-Limit со значением скорости в килобитах (а не в битах как для Cisco) в секунду. Т.к. радиус не знает этих атрибутов, то их следует вписать в словарь.
  +
  +
  +
Но, как можно заметить, авторизация пользователя все равно требует наличия записей в таблице radcheck - хоть и одинаковых для всех. <BR>
  +
Хотелось бы избежать ненужного дублирования информации, однако мне не удалось заставить работать конструкции вида '%{sql: SELECT ... }' для check атрибутов если проверка идет из файла users.
  +
<BR> конструкция вида
  +
<PRE>
  +
DEFAULT Framed-Protocol == PPP, Password := "%{sql:SELECT pwd FROM mtraf WHERE domain='%{User-Name}'}"
  +
...
  +
</PRE>
  +
у меня не получилось настроить.
  +
  +
<BR>Обходным решением является использование групп. Я создал "группу по-умолчанию", для которой один раз в таблице radgroupcheck указал атрибуты для проверки. (группа называется PPTP)
  +
<PRE>
  +
select * from radgroupcheck;
  +
+----+-----------+-----------+----+--------------------------------------------------------------------------------------------------------------+
  +
| id | groupname | attribute | op | value |
  +
+----+-----------+-----------+----+--------------------------------------------------------------------------------------------------------------+
  +
| 1 | PPTP | Auth-Type | := | `%{sql:SELECT IF (0n_a<0 OR (debt=0 AND 0n_a=0),'REJECT','MS-CHAP') FROM mtraf WHERE domain='%{User-Name}'}` |
  +
| 2 | PPTP | Password | := | `%{sql:SELECT pwd FROM mtraf WHERE domain='%{User-Name}'}` |
  +
| 3 | PPTP | Pool-Name | := | Test-Pool |
  +
+----+-----------+-----------+----+--------------------------------------------------------------------------------------------------------------+
  +
</PRE>

Версия 10:02, 15 января 2010

FreeRadius Xlat

FreeRadius предоставляет интересные возможности для опереривания с данными. В моем случае мне не хотелось для каждого абонента делать дублирование данных из биллинга ( в моем случае таблица mtraf) в radcheck и radreply. Проверка Auth-Type - на основании данных из биллинга.

select * from radcheck;
+----+----------+------------------+----+---------------------------------------------------------------------------------------------------------------+
| id | username | attribute        | op | value                                                                                                         |
+----+----------+------------------+----+---------------------------------------------------------------------------------------------------------------+
|  4 | tan      | Simultaneous-Use | := | 1                                                                                                             |
|  7 | tan      | Password         | := | `%{sql:SELECT pwd FROM mtraf WHERE domain='%{User-Name}'}`                                                    |
| 11 | tan      | Auth-Type        | := | `%{sql:SELECT IF (0n_a<0 OR (debt=0 AND 0n_a=0),'REJECT','MS-CHAP') from mtraf  where domain='%{User-Name}'}` |
+----+----------+------------------+----+---------------------------------------------------------------------------------------------------------------+

(обратить внимание на обратные кавычки, в которые взят запрос)
Аналогично, для передачи лимитов по скорости (но вместо того что бы указать для каждого %{User-Name} можно указать значения по умолчани.

#
DEFAULT Framed-Protocol == PPP
        Framed-Protocol = PPP,
        Service-Type = Framed-User,
        Cisco-AVPair += "%{sql:SELECT CONCAT('lcp:interface-config=rate-limit input ',ul_in*1024, ' ', ROUND(ul_in*1000/8), ' ', ROUND(ul_in*1000/8), ' conform-action transmit exceed-action drop') from mtraf where domain='%{User-Name}'}",
        Cisco-AVPair += "%{sql:SELECT CONCAT('lcp:interface-config=rate-limit output ',ul_in*1024, ' ', ROUND(ul_out*1000/8), ' ', ROUND(ul_out*1000/8), ' conform-action transmit exceed-action drop') from mtraf where domain='%{User-Name}'}",
        PPPD-Upstream-Speed-Limit  :=  "%{sql:SELECT ul_in  from mtraf where domain='%{User-Name}'} ",
        PPPD-Downstream-Speed-Limit := "%{sql:SELECT ul_out from mtraf where domain='%{User-Name}'} "

Обратить внимание, что для cisco передается Cisco-AVPair, для VPN на базе Linux я использую атрибуты PPPD-Upstream-Speed-Limit / PPPD-Downstream-Speed-Limit со значением скорости в килобитах (а не в битах как для Cisco) в секунду. Т.к. радиус не знает этих атрибутов, то их следует вписать в словарь.


Но, как можно заметить, авторизация пользователя все равно требует наличия записей в таблице radcheck - хоть и одинаковых для всех.
Хотелось бы избежать ненужного дублирования информации, однако мне не удалось заставить работать конструкции вида '%{sql: SELECT ... }' для check атрибутов если проверка идет из файла users.
конструкция вида

DEFAULT Framed-Protocol == PPP, Password := "%{sql:SELECT pwd FROM mtraf WHERE domain='%{User-Name}'}"
...

у меня не получилось настроить.


Обходным решением является использование групп. Я создал "группу по-умолчанию", для которой один раз в таблице radgroupcheck указал атрибуты для проверки. (группа называется PPTP)

select * from radgroupcheck;
+----+-----------+-----------+----+--------------------------------------------------------------------------------------------------------------+
| id | groupname | attribute | op | value                                                                                                        |
+----+-----------+-----------+----+--------------------------------------------------------------------------------------------------------------+
|  1 | PPTP      | Auth-Type | := | `%{sql:SELECT IF (0n_a<0 OR (debt=0 AND 0n_a=0),'REJECT','MS-CHAP') FROM mtraf WHERE domain='%{User-Name}'}` |
|  2 | PPTP      | Password  | := | `%{sql:SELECT pwd FROM mtraf WHERE domain='%{User-Name}'}`                                                   |
|  3 | PPTP      | Pool-Name | := | Test-Pool                                                                                                    |
+----+-----------+-----------+----+--------------------------------------------------------------------------------------------------------------+