RADIUS и NAS — Отчёт по настройке

Дата: 29 марта 2026 г. | Сервер: testbill.smit34.ru | Версия: СмИТ Биллинг v1.0.0 (build 37)

Оглавление

  1. Краткая сводка
  2. Архитектура RADIUS
  3. Конфигурация FreeRADIUS
    1. Docker-контейнер
    2. Модули и виртуальные серверы
    3. Клиенты (NAS)
    4. Процесс авторизации
  4. Модели данных
    1. RADIUS-модели
    2. Полнота моделей (Carbon 4)
  5. Настройки NAS
    1. Список NAS
    2. Поля авторизации и аккаунтинга
    3. Вкладка «Развёртывание»
  6. Результаты тестирования
  7. Список изменений
  8. Известные проблемы
  9. Инструкция администратора
    1. Управление NAS-устройствами
    2. Назначение IP клиенту
    3. Проверка RADIUS
    4. Развёртывание конфигурации

1. Краткая сводка

FreeRADIUSРаботает v3.2.3 + rlm_python3
Порты1812/1813 (Internet), 2812/2813 (VoIP), 6812/6813 (IPTV)
АвторизацияРаботает PAP через Python3 модуль → PostgreSQL
АккаунтингРаботает Start/Update/Stop → USERS_RADIUSAUTH
NAS-устройства13 шт., все с radius_secret = smitsecretkey
Пользователи5563 записей в USERS_RADIUSAUTH
Модели Django135 (100% совместимость с Carbon 4 + 37 новых)
Миграция0047 (NAS fields) + 0048 (NAS FK fix) + 0049 (23 Carbon 4 models, fake-applied)

2. Архитектура RADIUS

NAS-устройства (MikroTik/Cisco/Asterisk) │ │ RADIUS Auth/Acct (UDP) ▼ ┌─────────────────────────────────────────────┐ │ FreeRADIUS 3.2.3 Container │ │ │ │ ┌─────────────────────────────────────┐ │ │ │ Virtual Server "default" (1812/13) │ │ │ │ authorize: python3 → internet.py │ │ │ │ authenticate: PAP/CHAP/MSCHAP │ │ │ │ post-auth: python3 │ │ │ │ accounting: python3 │ │ │ └─────────────────────────────────────┘ │ │ │ │ ┌───────────────────┐ ┌─────────────────┐ │ │ │ python_voip │ │ python_iptv │ │ │ │ (2812/13) │ │ (6812/13) │ │ │ └───────────────────┘ └─────────────────┘ │ │ │ │ Unified rlm_python3 Module │ │ dispatcher.py → internet/voip/iptv.py │ └──────────────────┬──────────────────────────┘ │ Django ORM ▼ ┌─────────────────────────────────────────────┐ │ PostgreSQL 16 │ │ │ │ users (login, psw, ip, nas_id, enabled) │ │ nas (ip, radius_secret, auth_*, acc_*) │ │ USERS_RADIUSAUTH (session, logged, octets) │ │ NAS_RADIUS_PARAMS (custom reply attrs) │ │ TARIF_RADIUS_PARAMS (tariff reply attrs) │ └─────────────────────────────────────────────┘

3. Конфигурация FreeRADIUS

3.1. Docker-контейнер

docker-compose.prod.yml — сервис freeradius

freeradius:
  build:
    context: .
    dockerfile: docker/freeradius/Dockerfile
  ports:
    - "1812:1812/udp"   # Internet Auth
    - "1813:1813/udp"   # Internet Acct
    - "2812:2812/udp"   # VoIP Auth
    - "2813:2813/udp"   # VoIP Acct
    - "6812:6812/udp"   # IPTV Auth
    - "6813:6813/udp"   # IPTV Acct
  env_file: .env
  depends_on:
    - db
  restart: unless-stopped

# Примечание: контейнер также указан в docker-compose.prod.yml
# на testbill.smit34.ru с аналогичной конфигурацией

Базовый образ: freeradius/freeradius-server:3.2.3 с Python 3, Django 4.2, psycopg2.

Важно: FreeRADIUS 3.x поддерживает только один экземпляр rlm_python3. Дублирование модулей (python3_voip, python3_iptv) вызывает crash: drop_gil: GIL is not locked. Все запросы маршрутизируются через единый dispatcher.py.

Thread pool пропатчен для однопоточного режима (Python GIL):

start_servers = 1
max_servers = 1
min_spare_servers = 0
max_spare_servers = 0

3.2. Модули и виртуальные серверы

ФайлНазначение
mods-enabled/python3Единый rlm_python3 → dispatcher.py
sites-enabled/defaultInternet: порты 1812/1813, PAP/CHAP/MSCHAP + python3
sites-enabled/python_voipVoIP: порты 2812/2813, Digest + python3
sites-enabled/python_iptvIPTV: порты 6812/6813, CHAP/Digest + python3

3.3. Клиенты (NAS)

clients.conf генерируется автоматически при старте контейнера скриптом entrypoint.sh:

#!/bin/bash
# entrypoint.sh — generates clients.conf from billing DB
python3 -c "
import django; django.setup()
from billing.models import Nas
for nas in Nas.objects.all():
    # write client block for each NAS
"
exec freeradius -f "$@"

Кириллические имена NAS фильтруются (только ASCII). Добавляется wildcard-клиент 0.0.0.0/0 с секретом smitsecretkey для тестирования.

3.4. Процесс авторизации

Файл: radius_python/internet.py

authorize(p) — Авторизация

  1. Извлекает User-Name из RADIUS-пакета
  2. Ищет пользователя в Users по логину (с учётом ведущих нулей)
  3. Проверяет enabled статус, reject_block на NAS
  4. Возвращает Cleartext-Password из поля psw
  5. Добавляет Framed-IP-Address из поля ip
  6. Добавляет атрибуты из NasRadiusParams и TarifRadiusParams

accounting(p) — Аккаунтинг

  1. Обрабатывает Acct-Status-Type: Start, Interim-Update, Stop
  2. Обновляет USERS_RADIUSAUTH: logged, session_id, octets, radius_update
  3. При Stop: сбрасывает Users.logged = False

4. Модели данных

4.1. RADIUS-модели

МодельТаблицаНазначение
UsersRadiusauthUSERS_RADIUSAUTHАктивные RADIUS-сессии (logged, session_id, octets)
NasRadiusParamsNAS_RADIUS_PARAMSПользовательские RADIUS-атрибуты по NAS
TarifRadiusParamsTARIF_RADIUS_PARAMSRADIUS-атрибуты по тарифу
VoipLogVOIP_LOGCDR записи VoIP-звонков
VoipNasVOIP_NASVoIP-специфичные NAS
AbonentsSpeedABONENTS_SPEEDQoS скорости клиентов

4.2. Полнота моделей (Carbon 4)

Добавлено 23 модели (миграция 0049) — 22 из оригинального Carbon 4 + SystemSettings:

МодельТаблицаОписание
AbonentsSpeedABONENTS_SPEEDQoS скорости
AccountStackACCOUNT_STACKСтек операций ЛС
AccountStackTypeACCOUNT_STACK_TYPEТипы операций стека
AdminUsersProfileADMIN_USERS_PROFILEПрофиль администратора
AuditEventsAUDIT_EVENTSТипы событий аудита
CategoryDirectionsCATEGORY_DIRECTIONSVoIP категория→направление
ContractNumberPrefixesCONTRACT_NUMBER_PREFIXESПрефиксы договоров
CrmTaskTypeCRM_TASK_TYPEТипы CRM задач
DiscountsDISCOUNTSСкидки/наценки
EventsStackCompactEVENTS_STACK_COMPACTКомпактные RADIUS события
IptvTypeIPTV_TYPEТипы IPTV
NewsNEWSНовости
SensorsCountersSENSORS_COUNTERSСчётчики датчиков
SensorsLogSENSORS_LOGЖурнал датчиков
TarifPlansetTARIF_PLANSETТарифные планы
TarifUsersUslugaAllowTARIF_USERS_USLUGA_ALLOWРазрешённые услуги
TrafficBillTRAFFICБиллинг трафика
UserSubnetsUSER_SUBNETSПодсети пользователей
UsersRadiusauthUSERS_RADIUSAUTHRADIUS-сессии
UslugaParentUSLUGA_PARENTИерархия услуг
UslugaRangeUslugaUSLUGA_RANGE_USLUGAСвязь линейка→услуга
VoipTypeVOIP_TYPEТипы VoIP
SystemSettingssystem_settingsСистемные настройки (key/value)

Итого: 135 моделей (98 из Carbon 4 + 37 новых). 22 добавленные модели Carbon 4 имеют managed=False — таблицы создаются по необходимости. SystemSettings — новая модель (managed=True).

5. Настройки NAS

5.1. Список NAS

Список NAS-устройств
IDИмяIPТипRADIUS Secret
5Червленое10.233.1.101mikrotik6smitsecretkey
11NAS GAP10.100.100.69mikrotik6smitsecretkey
19TOY10.233.1.90mikrotik6smitsecretkey
35NAS RAM10.233.1.94mikrotik6smitsecretkey
38NAS NEO10.100.100.21mikrotik6smitsecretkey
49Malder37.29.7.151mikrotik6smitsecretkey
50CCR10.100.100.46mikrotik6smitsecretkey
51PLOD178.35.228.67mikrotik6smitsecretkey
52bill127.0.0.1common_sshsmitsecretkey
53Test83.234.21.201mikrotik6smitsecretkey
54FAG10.100.100.30mikrotik6smitsecretkey
55JOY10.100.100.25mikrotik6smitsecretkey
56NAS_SUN10.100.100.94mikrotik6smitsecretkey

5.2. Поля авторизации и аккаунтинга

Для всех MikroTik NAS установлены следующие RADIUS-настройки:

ПолеЗначениеОписание
auth_loginTrueАвторизация по логину (PPPoE/VPN)
acc_start_loginTrueAccounting Start по логину
acc_start_sidTrueAccounting Start по Session-ID
acc_update_sidTrueAccounting Update по Session-ID
acc_stop_sidTrueAccounting Stop по Session-ID
reject_blockTrueОтклонять заблокированных
coa_port3799Порт Change of Authorization
radius_secretsmitsecretkeyОбщий секрет RADIUS

5.3. Вкладка «Развёртывание»

Вкладка Развёртывание

Вертикальные под-вкладки (как в оригинальном Carbon 4):

Вкладка Настройка

6. Результаты тестирования

ТестКомандаРезультат
Валидный пользовательradtest 2105 2243179 127.0.0.1 0 testing123Access-Accept + Framed-IP-Address=10.99.56.101
Другой пользовательradtest 77778 98482018 127.0.0.1 0 testing123Access-Accept + Framed-IP-Address=10.99.8.119
С ведущим нулёмradtest 099999 1136850024 127.0.0.1 0 testing123Access-Accept + Framed-IP-Address=10.99.40.46
Неверный парольradtest 2105 wrongpassword 127.0.0.1 0 testing123Access-Reject
Несуществующийradtest 999999 password 127.0.0.1 0 testing123Access-Reject
Django checkmanage.py check --deploy0 ошибок
Миграцииmanage.py makemigrations --checkNo changes
Моделиapps.get_app_config('billing').get_models()135 моделей

7. Список изменений

ФайлИзменение
radius_python/internet.pyНовый Полная реализация authorize + post_auth + accounting
radius_python/dispatcher.pyСоздание /var/log/django в _ensure_django()
docker/freeradius/entrypoint.shНовый Генерация clients.conf из БД
docker/freeradius/DockerfileEntrypoint, chmod 666 error.log, COPY paths fix
docker/freeradius/sites-enabled/defaultДобавлен python3 в authorize и accounting
docker/freeradius/mods-enabled/python3_voipУдалён (GIL crash fix)
docker/freeradius/mods-enabled/python3_iptvУдалён (GIL crash fix)
billing/models/stubs.py+22 модели Carbon 4 (544 строк)
billing/models/__init__.pyИмпорт 22 новых моделей
billing/migrations/0047_*.pyНовый NAS: 12 недостающих полей (OSS, telnet, billing_ip_pull и др.)
billing/migrations/0048_*.pyНовый NAS: исправление FK-полей (IpPull → billing/cabinet)
billing/migrations/0049_*.pyНовый 23 модели (22 Carbon 4 + SystemSettings, fake-applied)
billing/templates/buttons_nas.htmlВертикальные под-вкладки (was horizontal)
billing/static/js/script.jsКнопка «Обновить» — btn-primary, show save

8. Известные проблемы

ПроблемаСтатусОписание
Сохранение карточки Users (IP, NAS) В работе При редактировании Users на /admin/Users/<id>/ изменения полей IP и NAS не сохраняются через форму. Прямое обновление через .save() работает. Причина: валидация формы (process_post() в form.py) — добавлено отладочное логирование для диагностики.
FrameworkFormGroupFields дубли Мониторинг Таблица содержит 341 запись, многие дублируются. Может влиять на генерацию полей формы. Рекомендация: очистить дубликаты через SQL.

9. Инструкция администратора

9.1. Управление NAS-устройствами

Перейдите в Оборудование → NAS (/admin/equipment/Nas/?object_type=1).

Список NAS

Для редактирования NAS кликните на его имя. Откроется карточка с вкладками:

Карточка NAS

Ключевые поля NAS для RADIUS:

Настройки авторизации (вкладка «Расширенные»):

Настройки аккаунтинга:

Примечание: При добавлении нового NAS необходимо перезапустить контейнер FreeRADIUS, чтобы обновить clients.conf:
docker compose -f docker-compose.prod.yml restart freeradius

9.2. Назначение IP клиенту

Чтобы назначить IP-адрес и привязать клиента к NAS:

  1. Перейдите в Клиенты, найдите нужного клиента
  2. На вкладке Учётные записи откройте карточку пользователя (Users)
Карточка пользователя
  1. Заполните поля:
  2. Нажмите зелёную кнопку «Сохранить» в верхней панели
Важно: IP-адрес будет автоматически возвращён в RADIUS-ответе как атрибут Framed-IP-Address. Убедитесь, что IP уникален в рамках NAS.

Пул IP адресов

В правой колонке карточки пользователя можно указать:

9.3. Проверка RADIUS

Для проверки авторизации клиента подключитесь к контейнеру FreeRADIUS и выполните:

# Войти в контейнер
docker compose -f docker-compose.prod.yml exec freeradius bash

# Тест авторизации (логин, пароль, сервер, порт, секрет)
radtest <логин> <пароль> 127.0.0.1 0 testing123

# Пример:
radtest 2105 2243179 127.0.0.1 0 testing123

Ожидаемый результат для валидного клиента:

Received Access-Accept Id 17 from 127.0.0.1:714
    Framed-IP-Address = 10.99.56.101

Для заблокированного или несуществующего:

Received Access-Reject Id 110 from 127.0.0.1:714

9.4. Развёртывание конфигурации на NAS

Вкладка Развёртывание в карточке NAS позволяет управлять конфигурацией MikroTik:

Развёртывание

Шаги развёртывания:

  1. Шаг 1 — Инициализация: rtsh cfg init → создаёт каталог, rtsh cfg fill → заполняет INI данными из биллинга
  2. Шаг 2 — Сохранение текущей: rtsh cfg download → скачивает конфигурацию с оборудования
  3. Шаг 3 — Подготовка: rtsh cfg make → генерирует конфигурацию для загрузки
  4. Шаг 4 — Загрузка: rtsh cfg upload → загружает конфигурацию в оборудование
  5. Шаг 5 — Проверка: rtsh cfg download + rtsh cfg diff cur → сравнивает результат

Редактирование файлов:

Под-вкладки Настройка, Шаблоны, Upload cfg, Download cfg позволяют просматривать и редактировать конфигурационные файлы прямо в браузере: