Доступ при блокировке

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

При стандартном поведении системы на запрос аутентификации/авторизации абонента, заблокированного по балансу, выдается access-reject. Наша же задача заключается в том, чтобы авторизовать заблокированного абонента и на сессию выдавать необходимые для ограничения доступа атрибуты.

Для решения этой задачи необходимо использовать «Гостевую сеть».

lanbilling

Рисунок 1

Одна из сетей на Рис. 1 назначена как гостевая.

Для агента RADIUS, которому принадлежат сети представленные на Рис. 1, в списке RADIUS-атрибутов определены два атрибута Filter-ID (Рис. 2)

lanbilling

Рисунок 2

1-й атрибут выдается, если клиент не заблокирован (Рис. 3).

lanbilling

Рисунок 3

2-й атрибут выдается при условии наличия блокировки учетной записи (Рис. 4).

lanbilling

Рисунок 4

Для примера, заведены две учетные записи (одной выдается IP из динамического пула, второй выдается статический IP):

# echo "select login, pass, inet_ntoa(segment) ip from vgroups left join staff using(vg_id) where login is not NULL" | mysql billing
+----------------+-------------+----------+
| login          | pass        | ip       |
+----------------+-------------+----------+
| client-dynamic | client-pass | NULL     |
+----------------+-------------+----------+
| client-static  | client-pass | 10.0.0.1 |
+----------------+-------------+----------+

При авторизации, включенные пользователи получают Access-Accept, им выдается Filter-Id = "SUCCESS-ATTR-EXAMPLE":

[root@node1 ~]# radtest client-dynamic client-pass 127.0.0.1 1812 secret
...
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=33, length=88
Session-Timeout = 86400
Service-Type = Framed-UserF
ramed-Protocol = PPP
Framed-IP-Address = 10.0.1.253
Framed-IP-Netmask = 255.255.255.255
Class = 0x3030303030303032
Acct-Interim-Interval = 60
Filter-Id = "SUCCESS-ATTR-EXAMPLE"
[root@node1 ~]# radtest client-static client-pass 127.0.0.1 1812 secret
...
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=37, length=88
Session-Timeout = 86400
Service-Type = Framed-User
Framed-Protocol = PPP
Framed-IP-Address = 10.0.0.1
Framed-IP-Netmask = 255.255.255.255
Class = 0x3030303030303033
Acct-Interim-Interval = 60
Filter-Id = "SUCCESS-ATTR-EXAMPLE"

При авторизации, блокированные пользователи получают Access-Accept, им выдаются ip из гостевой сети и Filter-Id = "FAILED-ATTR-EXAMPLE":

[root@node1 ~]# radtest client-dynamic client-pass 127.0.0.1 1812 secret
...
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=57, length=87
Session-Timeout = 86400
Service-Type = Framed-User
Framed-Protocol = PPP
Framed-IP-Address = 10.0.2.253
Framed-IP-Netmask = 255.255.255.255
Class = 0x3030303030303032
Acct-Interim-Interval = 60
Filter-Id = "FAILED-ATTR-EXAMPLE"
[root@node1 ~]# radtest client-static client-pass 127.0.0.1 1812 secret
...
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=61, length=87
Session-Timeout = 86400
Service-Type = Framed-User
Framed-Protocol = PPP
Framed-IP-Address = 10.0.2.252
Framed-IP-Netmask = 255.255.255.255
Class = 0x3030303030303033
Acct-Interim-Interval = 60
Filter-Id = "FAILED-ATTR-EXAMPLE"

Отключенные пользователи получают Access-Reject:

[root@node1 ~]# radtest client-dynamic client-pass 127.0.0.1 1812 secret
...
rad_recv: Access-Reject packet from host 127.0.0.1:1812, id=201, length=20 
[root@node1 ~]# radtest client-static client-pass 127.0.0.1 1812 secret 
... 
rad_recv: Access-Reject packet from host 127.0.0.1:1812, id=205, length=20