У меня есть базовая конфигурация FreeRadius в сочетании с Postgresql и Mikrotik. Модуль SQL настроен правильно и авторизация PPPoE через базу данных работает. Мне нужно подключить и настроить модуль sqlippool. На данный момент у меня проблемы, потому что в Интернете нет подробных инструкций по настройке этого модуля. Вот список того, что я пытался сделать:
INSERT INTO radippool (pool_name, framedipaddress) VALUES ('main_pool', '10.1.0.5');
INSERT INTO radippool (pool_name, framedipaddress) VALUES ('main_pool', '10.1.0.6');
INSERT INTO radcheck (username, attribute, op, value) VALUES ('tester', 'Cleartext-Password', ':=', 'test');
INSERT INTO radcheck (username, attribute, op, value) VALUES ('tester', 'Pool-Name', ':=', 'main_pool');
Перезагрузка. В итоге - ничего. FreeRadius не выдает ip-адреса из пула, и я не вижу ошибок в логах. Вы можете сказать мне, что я сделал не так? Нужно ли еще что-то подключать, или я где-то ошибся? Расскажите, пожалуйста, подробную последовательность действий для корректной настройки этого модуля. Думаю, это руководство поможет многим новичкам, так как подробной информации просто нет.
ОБНОВИТЬ. Журналы:
Готовы обрабатывать запросы
(0) Полученный идентификатор запроса доступа 19 от 10.1.0.1:53161 до 10.1.0.4:1812 длина 198
(0) Service-Type = Framed-User
(0) Framed-Protocol = PPP
(0) NAS-порт = 15728646
(0) NAS-Port-Type = Ethernet
(0) User-Name = "тестировщик"
(0) Calling-Station-Id = "C4: 12: F5: D4: 85: 70"
(0) Called-Station-Id = "myclients"
(0) NAS-Port-Id = "ether3"
(0) Acct-Session-Id = "81a00006"
(0) MS-CHAP-Challenge = 0x97e9a21dabacee5e9c0384f778dc7915
(0) MS-CHAP2-Response = 0x010029335f35cdd38e0fa6eab66e12022f47000000000000000078126d15554660d74add815846c50ab6353c7e0847952eac
(0) NAS-идентификатор = "MikroTik"
(0) IP-адрес NAS = 10.1.0.1
(0) # Выполнение авторизации раздела из файла /etc/freeradius/3.0/sites-enabled/default
(0) авторизовать {
(0) policy filter_username {
(0) if (& Имя пользователя) {
(0) если (& Имя пользователя) -> ИСТИНА
(0) if (& Имя пользователя) {
(0) if (& User-Name = ~ / /) {
(0) если (& User-Name = ~ / /) -> FALSE
(0) if (& User-Name = ~ / @ [^ @] * @ /) {
(0) если (& User-Name = ~ / @ [^ @] * @ /) -> FALSE
(0) if (& User-Name = ~ /../) {
(0) если (& User-Name = ~ /../) -> FALSE
(0) if ((& User-Name = ~ / @ /) && (& User-Name! ~ /@(.+).(.+)$/)) {
(0) if ((& User-Name = ~ / @ /) && (& User-Name! ~ /@(.+).(.+)$/)) -> FALSE
(0) if (& User-Name = ~ /.$/) {
(0) если (& User-Name = ~ /.$/) -> FALSE
(0) if (& User-Name = ~ /@./) {
(0) если (& User-Name = ~ /@./) -> ЛОЖЬ
(0)} # if (& User-Name) = notfound
(0)} # policy filter_username = notfound.
(0) [препроцесс] = нормально
(0) [chap] = нет
(0) mschap: Обнаружены атрибуты MS-CHAP. Установка Auth-Type = mschap
(0) [mschap] = нормально
(0) [дайджест] = нет
(0) суффикс: проверка суффикса после "@"
(0) суффикс: Нет '@' в User-Name = "tester", поиск области NULL
(0) суффикс: Нет такой области "NULL"
(0) [суффикс] = нет
(0) eap: Нет EAP-сообщения, EAP не выполняется
(0) [eap] = нет
(0) files: users: Соответствующая запись DEFAULT в строке 181
(0) [файлы] = хорошо
(0) sql: EXPAND% {Имя пользователя}
(0) sql: -> тестер
(0) sql: SQL-User-Name установлен на 'tester' rlm_sql (sql): Зарезервированное соединение (1)
(0) sql: EXPAND SELECT id, UserName, Attribute, Value, Op FROM radcheck WHERE Username = '% {SQL-User-Name}' ORDER BY id
(0) sql: -> SELECT id, UserName, Attribute, Value, Op FROM radcheck WHERE Username = 'tester' ORDER BY id
(0) sql: Выполнение запроса выбора: SELECT id, UserName, Attribute, Value, Op FROM radcheck WHERE Username = 'tester' ORDER BY id rlm_sql_postgresql: Status: PGRES_TUPLES_OK rlm_sql_postgresql: затронутые запросом строки = 2, поля = 5
(0) sql: пользователь найден в таблице radcheck
(0) sql: элементы условной проверки сопоставлены, объединение элементов проверки присвоения
(0) sql: Открытый текст-Пароль: = "тест"
(0) sql: Pool-Name: = "main_pool"
(0) sql: EXPAND SELECT id, UserName, Attribute, Value, Op FROM radreply WHERE Username = '% {SQL-User-Name}' ORDER BY id
(0) sql: -> SELECT id, UserName, Attribute, Value, Op FROM radreply WHERE Username = 'tester' ORDER BY id
(0) sql: Выполнение запроса выбора: SELECT id, UserName, Attribute, Value, Op FROM radreply WHERE Username = 'tester' ORDER BY id rlm_sql_postgresql: Status: PGRES_TUPLES_OK rlm_sql_postgresql: затронутые запросы строки = 0, fields = 5
(0) sql: EXPAND SELECT GroupName FROM radusergroup WHERE UserName = '% {SQL-User-Name}' ORDER BY priority
(0) sql: -> SELECT GroupName FROM radusergroup WHERE UserName = 'tester' ORDER BY priority
(0) sql: Выполнение запроса выбора: SELECT GroupName FROM radusergroup WHERE UserName = 'tester' ORDER BY priority rlm_sql_postgresql: Status: PGRES_TUPLES_OK rlm_sql_postgresql: затронутые запросы строки = 0, поля = 1
(0) sql: Пользователь не найден ни в одной группе rlm_sql (sql): Разорванное соединение (1) Требуется еще 4 соединения для достижения 10 запасных частей rlm_sql (sql): Открытие дополнительного соединения (6), используется 1 из 26 ожидающих слотов rlm_sql_postgresql: Подключение с использованием параметров: dbname = 'radius' host = 'localhost' port = 5432 user = 'radius' password = 'radpass' Подключен к базе данных 'radius' на сервере 'localhost' версии 110007, версии протокола 3, бэкэнда PID 28624
(0) [sql] = нормально
(0) [истечение срока] = нет
(0) [время входа] = нет
(0) pap: ВНИМАНИЕ: Auth-Type уже установлен. Не устанавливается на PAP
(0) [pap] = нет
(0)} # authorize = ok
(0) Найдено Auth-Type = mschap
(0) # Запуск группы из файла /etc/freeradius/3.0/sites-enabled/default
(0) Authenticate {
(0) mschap: Найден открытый текст-пароль, хеширование для создания NT-пароля
(0) mschap: Найден открытый текст-пароль, хеширование для создания LM-пароля
(0) mschap: Создание хэша задачи с именем пользователя: tester
(0) mschap: клиент использует MS-CHAPv2
(0) mschap: Добавление ключей MPPE MS-CHAPv2
(0) [mschap] = нормально
(0)} # Authenticate = ok
(0) # Выполнение пост-авторизации раздела из файла /etc/freeradius/3.0/sites-enabled/default
(0) post-auth {
(0) update {
(0) Атрибуты не обновлены
(0)} # update = noop
(0) sql: EXPAND .query
(0) sql: -> .query
(0) sql: Использование шаблона запроса 'query' rlm_sql (sql): Зарезервированное соединение (2)
(0) sql: EXPAND% {Имя пользователя}
(0) sql: -> тестер
(0) sql: SQL-User-Name установлен на 'tester'
(0) sql: EXPAND INSERT INTO radpostauth (username, pass, reply, authdate) VALUES ('% {User-Name}', '% {% {User-Password}: - Chap-Password}', '% {reply) : Packet-Type} ', СЕЙЧАС ())
(0) sql: -> INSERT INTO radpostauth (username, pass, reply, authdate) VALUES ('tester', 'Chap-Password', 'Access-Accept', NOW ())
(0) sql: Выполнение запроса: INSERT INTO radpostauth (username, pass, reply, authdate) VALUES ('tester', 'Chap-Password', 'Access-Accept', NOW ()) rlm_sql_postgresql: Статус: PGRES_COMMAND_OK rlm_sql: затронутые строки = 1
(0) sql: SQL-запрос возвращен: успех
(0) sql: 1 запись (и) обновлены rlm_sql (sql): освобожденное соединение (2)
(0) [sql] = нормально
(0) [exec] = нет
(0) policy remove_reply_message_if_eap {
(0) if (& reply: EAP-сообщение && & reply: Reply-сообщение) {
(0) если (& ответ: EAP-сообщение && & ответ: Ответное сообщение) -> ЛОЖЬ
(0) else {
(0) [noop] = noop
(0)} # else = noop
(0)} # policy remove_reply_message_if_eap = noop
(0)} # post-auth = ok
(0) Отправлен идентификатор доступа 19 с 10.1.0.4:1812 на 10.1.0.1:53161 длина 0
(0) Framed-Protocol = PPP
(0) Framed-Compression = Van-Jacobson-TCP-IP
(0) MS-CHAP2-Success = 0x01533d42443236373932353546324538304641374430424235463938333445314331454330323244463233
(0) MS-MPPE-Recv-Key = 0xf03b52e2c28c093649b396d6e2b16945
(0) MS-MPPE-Send-Key = 0xb4d2427c437eca3f444403b060bc59f7
(0) MS-MPPE-Encryption-Policy = Шифрование-Разрешено
(0) MS-MPPE-Encryption-Types = RC4-40or128-bit-Allowed
(0) Завершенный запрос Пробуждение через 4,9 секунды.
(1) Получен идентификатор запроса учета 20 от 10.1.0.1:48965 до 10.1.0.4:1813 длиной 146
(1) Service-Type = Framed-User
(1) Framed-Protocol = PPP
(1) NAS-порт = 15728646
(1) NAS-Port-Type = Ethernet
(1) User-Name = "тестировщик"
(1) Calling-Station-Id = "C4: 12: F5: D4: 85: 70"
(1) Called-Station-Id = "мои клиенты"
(1) NAS-Port-Id = "ether3"
(1) Acct-Session-Id = "81a00006"
(1) Framed-IP-Address = 10.1.0.252
(1) Acct-Authentic = RADIUS
(1) Event-Timestamp = "13 июля 2020 14:57:41 +08"
(1) Acct-Status-Type = Пуск
(1) NAS-идентификатор = "MikroTik"
(1) Acct-Delay-Time = 0
(1) IP-адрес NAS = 10.1.0.1
(1) # Выполнение preacct раздела из файла /etc/freeradius/3.0/sites-enabled/default
(1) preacct {
(1) [препроцесс] = хорошо
(1) policy acct_unique {
(1) запрос на обновление {
(1) & Tmp-String-9: = "ai:"
(1)} # update request = noop
(1) if (("% {hex: & Class}" = ~ / ^% {hex: & Tmp-String-9} /) && ("% {string: & Class}" = ~ / ^ ai: ([0- 9a-f] {32}) / i)) {
(1) EXPAND% {hex: & Class}
(1) ->
(1) EXPAND ^% {шестнадцатеричный: & Tmp-String-9}
(1) -> ^ 61693a
(1) if (("% {hex: & Class}" = ~ / ^% {hex: & Tmp-String-9} /) && ("% {string: & Class}" = ~ / ^ ai: ([0- 9a-f] {32}) / i)) -> ЛОЖЬ
(1) else {
(1) запрос на обновление {
(1) EXPAND% {md5:% {User-Name},% {Acct-Session-ID},% {% {NAS-IPv6-Address}: -% {NAS-IP-Address}},% {NAS- Идентификатор},% {NAS-Port-ID},% {NAS-Port}}
(1) -> 9b06bc7d71ce816cb361a7625387ab61
(1) & Acct-Unique-Session-Id: = 9b06bc7d71ce816cb361a7625387ab61
(1)} # update request = noop
(1)} # else = noop
(1)} # policy acct_unique = noop
(1) суффикс: проверка суффикса после "@"
(1) суффикс: Нет '@' в User-Name = "tester", поиск области NULL
(1) суффикс: Нет такой области "NULL"
(1) [суффикс] = нет
(1) [файлы] = нет
(1)} # preacct = ok
(1) # Выполнение учета раздела из файла /etc/freeradius/3.0/sites-enabled/default
(1) бухгалтерский учет {
(1) деталь: EXPAND / var / log / freeradius / radacct /% {% {Packet-Src-IP-Address}: -% {Packet-Src-IPv6-Address}} / detail-% Y% m% d
(1) деталь: -> /var/log/freeradius/radacct/10.1.0.1/detail-20200713
(1) деталь: / var / log / freeradius / radacct /% {% {Packet-Src-IP-Address}: -% {Packet-Src-IPv6-Address}} / detail-% Y% m% d расширяется до /var/log/freeradius/radacct/10.1.0.1/detail-20200713
(1) деталь: EXPAND% t
(1) деталь: -> пн 13 июл 14:57:45 2020
(1) [деталь] = хорошо
(1) [unix] = нормально
(1) sql: EXPAND% {tolower: type.% {% {Acct-Status-Type}: - none} .query}
(1) sql: -> type.start.query
(1) sql: использование шаблона запроса 'query' rlm_sql (sql): зарезервированное соединение (3)
(1) sql: EXPAND% {Имя пользователя}
(1) sql: -> тестер
(1) sql: SQL-User-Name установлен на 'tester'
(1) SQL: Увеличить вставить в radacct (AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPortId, NASPortType, AcctStartTime, AcctUpdateTime, AcctStopTime, AcctSessionTime, AcctAuthentic, ConnectInfo_start, ConnectInfo_Stop, AcctInputOctets, AcctOutputOctets, CalledStationId, CallingStationId, AcctTerminateCause, ServiceType, FramedProtocol, FramedIpAddress) VALUES ('% {Acct-Session-Id}', '% {Acct-Unique-Session-Id}', '% {SQL-User-Name}', NULLIF ('% {Realm}', ''), '% {% {NAS-IPv6-Address}: -% {NAS-IP-Address}}', NULLIF ('% {% {NAS-Port-ID}: -% {NAS-Port}} ',' '),'% {NAS-Port-Type} ', TO_TIMESTAMP (% {integer: Event-Timestamp}), TO_TIMESTAMP (% {integer: Event-Timestamp}), NULL, 0,'% {Acct- Authentic} ','% {Connect-Info} ', NULL, 0, 0,'% {Called-Station-Id} ','% {Calling-Station-Id} ', NULL,'% {Service-Type} ','% {Framed-Protocol} ', NULLIF ('% {Framed-IP-Address} ',' ') :: inet)
(1) SQL: -> INSERT INTO radacct (AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPortId, NASPortType, AcctStartTime, AcctUpdateTime, AcctStopTime, AcctSessionTime, AcctAuthentic, ConnectInfo_start, ConnectInfo_Stop, AcctInputOctets, AcctOutputOctets, CalledStationId, CallingStationId, AcctTerminateCause, ServiceType, FramedProtocol, FramedIpAddress) VALUES ('81a00006', '9b06bc7d71ce816cb361a7625387ab61', 'tester', NULLIF ('', ''), '10 .1.0.1 ', NULLIF (' ether3 ',' '),' Ethernet ' (1594623461), TO_TIMESTAMP (1594623461), NULL, 0, 'RADIUS', '', NULL, 0, 0, 'myclients', 'C4: 12: F5: D4: 85: 70', NULL, 'Framed-User ',' PPP ', NULLIF ('10 .1.0.252', '') :: inet)
(1) SQL: Выполнение запроса: INSERT INTO radacct (AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPortId, NASPortType, AcctStartTime, AcctUpdateTime, AcctStopTime, AcctSessionTime, AcctAuthentic, ConnectInfo_start, ConnectInfo_Stop, AcctInputOctets, AcctOutputOctets, CalledStationId, CallingStationId, AcctTerminateCause, ServiceType, FramedProtocol, FramedIpAddress) VALUES ('81a00006', '9b06bc7d71ce816cb361a7625387ab61', 'tester', NULLIF ('', ''), '10 .1.0.1 ', NULLIF (' ether3 ',' '),' Ethernet ' (1594623461), TO_TIMESTAMP (1594623461), NULL, 0, 'RADIUS', '', NULL, 0, 0, 'myclients', 'C4: 12: F5: D4: 85: 70', NULL, 'Framed-User ',' PPP ', NULLIF ('10 .1.0.252', '') :: inet) rlm_sql_postgresql: Статус: PGRES_COMMAND_OK rlm_sql_postgresql: строки, затронутые запросом = 1
(1) sql: запрос SQL возвращен: успех
(1) sql: 1 запись (и) обновлены rlm_sql (sql): освобожденное соединение (3)
(1) [sql] = хорошо
(1) [exec] = нет
(1) attr_filter.accounting_response: EXPAND% {User-Name}
(1) attr_filter.accounting_response: -> тестер
(1) attr_filter.accounting_response: Соответствующая запись DEFAULT в строке 12
(1) [attr_filter.accounting_response] = обновлено
(1)} # Accounting = обновлено
(1) Отправлен учетный идентификатор ответа 20 с 10.1.0.4:1813 на 10.1.0.1:48965, длина 0
(1) Завершенный запрос
(1) Очистка пакета запроса ID 20 с отметкой времени +5 Пробуждение через 4,9 секунды.
(0) Очистка пакета запроса с идентификатором 19 с отметкой времени +5 Готовность к обработке запросов