freeradius авторизация из файла

сразу опишу задачу.
Есть биллинг UTM5 который дружит с freeradius и авторизация идет из базы UTM5 и ip-адрес каждому клиенту привязан свой в билллинге жестко из подсети 176.16.0.0/16.
У заблокированных клиентов авторизация не проходит.
Задача состоит в том, чтоб заблокированные клиенты авторизовывались, но им выдавались ip-адреса из другого пула, в нашем случае я выбрал 172.16.0.0/22
Реализовать решил через файл со связками логин/пароль. Если клиент заблокирован в базе UTM5 радиус лезет в файл users, авторизовывает клиента и выдает ему адрес из нового пула.
теперь конфиги:

Указываем пул из которого будут выдаваться адреса и нужную маску

# cat /etc/freeradius/modules/ippool  | sed '/^$/d;/^#/d;/^.*#.*/d'
ippool main_pool {
        range-start = 172.16.1.1
        range-stop = 172.16.3.254
        netmask = 255.255.255.255
        cache-size = 800
        session-db = ${db_dir}/db.ippool
        ip-index = ${db_dir}/db.ipindex
        override = no
        maximum-timeout = 0
}

создаем нужные файлы и даем на них права фрирадиусу

touch /etc/freeradius/db.ipindex
touch /etc/freeradius/db.ippool
chgrp freerad /etc/freeradius/db.ipindex
chgrp freerad /etc/freeradius/db.ippool
chmod g+w /etc/freeradius/db.ipindex
chmod g+w /etc/freeradius/db.ippool

добвляем пул и инклудим файлик user_list где будут наши связки логин/пароль

# cat /etc/freeradius/users  | sed '/^$/d;/^#/d;/^.*#.*/d'
DEFAULT Pool-Name := main_pool
        Fall-Through = Yes
$INCLUDE user_list
DEFAULT Framed-Protocol == PPP
        Framed-Protocol = PPP,
        Framed-Compression = Van-Jacobson-TCP-IP
DEFAULT Hint == "CSLIP"
        Framed-Protocol = SLIP,
        Framed-Compression = Van-Jacobson-TCP-IP
DEFAULT Hint == "SLIP"
        Framed-Protocol = SLIP

таким образом выглядят связки пользователей

# cat /etc/freeradius/user_list  | sed '/^$/d;/^#/d;/^.*#.*/d'
draga   Cleartext-Password := "draga"

Здесь раскомментируем строчку files в секции authorize
также в секцию post-auth добавляем наш пул main_pool

# cat /etc/freeradius/sites-enabled/default  | sed '/^$/d;/^#/d;/^.*#.*/d'
authorize {
        preprocess
        chap
        suffix
        unix
        files
        sql
        expiration
        logintime
}
authenticate {
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        unix
        eap
}
preacct {
        preprocess
        acct_unique
        suffix
        files
}
accounting {
        detail
        unix
        radutmp
        sql
        attr_filter.accounting_response
}
session {
        sql
}
post-auth {
        main_pool
        exec
        Post-Auth-Type REJECT {
                attr_filter.access_reject
        }
}
pre-proxy {
}
post-proxy {
        eap
}

На этом конфигурация закончена.

----------------------------------------------------------
Позже через несколько месяцев, всплыл баг.
Клиентам начали выдаваться адреса из подсети 10.67.15.0/24
Запустил freeradius в режиме отладки

freeradius -X

и увидел такую картину:
[main_pool]     expand: %{NAS-IP-Address} %{NAS-Port} -> 192.168.201.10 83
[main_pool] MD5 on 'key' directive maps to: e36120a52bf902a3ccef283189762b21
[main_pool] Searching for an entry for key: 'e36120a52bf902a3ccef283189762b21'
[main_pool] No available ip addresses in pool.
++[main_pool] returns notfound
++[exec] returns noop
Sending Access-Accept of id 181 to 192.168.201.10 port 55788
Finished request 1.
Going to the next request
Waking up in 4.9 seconds.
 
rad_recv: Accounting-Request packet from host 192.168.201.10 port 44688, id=182, length=118
        Acct-Session-Id = "4F2ABFD7765E00"
        User-Name = "jarkovi"
        Acct-Status-Type = Start
        Service-Type = Framed-User
        Framed-Protocol = PPP
        Calling-Station-Id = "84:C9:B2:86:BA:C5"
        Acct-Authentic = RADIUS
        NAS-Port-Type = Async
        Framed-IP-Address = 10.67.17.56
        NAS-IP-Address = 192.168.201.10
        NAS-Port = 83
        Acct-Delay-Time = 0

ключевая строка
[main_pool] No available ip addresses in pool.

которая говорит, что нет доступных адресов в пуле, но так как авторизация прошла удачно, то pppoe-server выдаёт из своего рабочего пула.
долго не думая, грохнул файлики db.ipindex и db.ippool
и создал новые, как описано выше.
Всё чудесно заработало
[main_pool]     expand: %{NAS-IP-Address} %{NAS-Port} -> 192.168.201.12 6
[main_pool] MD5 on 'key' directive maps to: fdeef1e2fa1a0a7038d96b809347222f
[main_pool] Searching for an entry for key: 'fdeef1e2fa1a0a7038d96b809347222f'
rlm_ippool: Allocating ip to key: 'fdeef1e2fa1a0a7038d96b809347222f'
[main_pool] num: 1
[main_pool] Allocated ip 172.16.1.78 to client key: fdeef1e2fa1a0a7038d96b809347222f
++[main_pool] returns ok
++[exec] returns noop
Sending Access-Accept of id 95 to 192.168.201.12 port 36630
        Framed-IP-Address = 172.16.1.78
        Framed-IP-Netmask = 255.255.255.255
Finished request 1.

В следующий раз попробую увеличить количество адресов в пуле.

Комментарии

Добрый день. Не получается

Добрый день. Не получается реализовать следующую схему. Имеется самописный простой биллинг, каждому абоненту назначена пара IP+MAC. В качестве NAS используется MikroTik ROS 6. Между ними FreeRADIUS 2.2.6. Организация доступа к сети по IPoE (DHCP-сервер MikroTik получает IP по МАС-адресу).
Необходимо выдавать неизвестным абонентам IP из отдельного пула, который микротиком заворачивается на заглушку.
Сейчас схема без отдельного пула реализована через измененный example.pl:

sub authorize {
    return RLM_MODULE_OK;
}
sub authenticate {
    ....
    my $query = $dbh->prepare("SELECT IPADD FROM USERMACIP WHERE MAC LIKE ?");
    ....
    $RAD_REPLY{'Framed-IP-Address'} = $ipaddr;
    return RLM_MODULE_OK;
}

Все работает замечательно, но нужно каким-то образом, желательно не меняя схемы работы через PERL, выдавать IP из динамического пула, если МАС-абонента отсутствует в биллинге.
Прошу Вашей помощи.

вот эту статью