Дата: 29 марта 2026 г. | Сервер: testbill.smit34.ru | Версия: СмИТ Биллинг v1.0.0 (build 37)
| 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 |
| Модели Django | 135 (100% совместимость с Carbon 4 + 37 новых) |
| Миграция | 0047 (NAS fields) + 0048 (NAS FK fix) + 0049 (23 Carbon 4 models, fake-applied) |
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.
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
| Файл | Назначение |
|---|---|
mods-enabled/python3 | Единый rlm_python3 → dispatcher.py |
sites-enabled/default | Internet: порты 1812/1813, PAP/CHAP/MSCHAP + python3 |
sites-enabled/python_voip | VoIP: порты 2812/2813, Digest + python3 |
sites-enabled/python_iptv | IPTV: порты 6812/6813, CHAP/Digest + python3 |
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 для тестирования.
Файл: radius_python/internet.py
User-Name из RADIUS-пакетаUsers по логину (с учётом ведущих нулей)enabled статус, reject_block на NASCleartext-Password из поля pswFramed-IP-Address из поля ipNasRadiusParams и TarifRadiusParamsAcct-Status-Type: Start, Interim-Update, StopUSERS_RADIUSAUTH: logged, session_id, octets, radius_updateUsers.logged = False| Модель | Таблица | Назначение |
|---|---|---|
| UsersRadiusauth | USERS_RADIUSAUTH | Активные RADIUS-сессии (logged, session_id, octets) |
| NasRadiusParams | NAS_RADIUS_PARAMS | Пользовательские RADIUS-атрибуты по NAS |
| TarifRadiusParams | TARIF_RADIUS_PARAMS | RADIUS-атрибуты по тарифу |
| VoipLog | VOIP_LOG | CDR записи VoIP-звонков |
| VoipNas | VOIP_NAS | VoIP-специфичные NAS |
| AbonentsSpeed | ABONENTS_SPEED | QoS скорости клиентов |
Добавлено 23 модели (миграция 0049) — 22 из оригинального Carbon 4 + SystemSettings:
| Модель | Таблица | Описание |
|---|---|---|
| AbonentsSpeed | ABONENTS_SPEED | QoS скорости |
| AccountStack | ACCOUNT_STACK | Стек операций ЛС |
| AccountStackType | ACCOUNT_STACK_TYPE | Типы операций стека |
| AdminUsersProfile | ADMIN_USERS_PROFILE | Профиль администратора |
| AuditEvents | AUDIT_EVENTS | Типы событий аудита |
| CategoryDirections | CATEGORY_DIRECTIONS | VoIP категория→направление |
| ContractNumberPrefixes | CONTRACT_NUMBER_PREFIXES | Префиксы договоров |
| CrmTaskType | CRM_TASK_TYPE | Типы CRM задач |
| Discounts | DISCOUNTS | Скидки/наценки |
| EventsStackCompact | EVENTS_STACK_COMPACT | Компактные RADIUS события |
| IptvType | IPTV_TYPE | Типы IPTV |
| News | NEWS | Новости |
| SensorsCounters | SENSORS_COUNTERS | Счётчики датчиков |
| SensorsLog | SENSORS_LOG | Журнал датчиков |
| TarifPlanset | TARIF_PLANSET | Тарифные планы |
| TarifUsersUslugaAllow | TARIF_USERS_USLUGA_ALLOW | Разрешённые услуги |
| TrafficBill | TRAFFIC | Биллинг трафика |
| UserSubnets | USER_SUBNETS | Подсети пользователей |
| UsersRadiusauth | USERS_RADIUSAUTH | RADIUS-сессии |
| UslugaParent | USLUGA_PARENT | Иерархия услуг |
| UslugaRangeUsluga | USLUGA_RANGE_USLUGA | Связь линейка→услуга |
| VoipType | VOIP_TYPE | Типы VoIP |
| SystemSettings | system_settings | Системные настройки (key/value) |
Итого: 135 моделей (98 из Carbon 4 + 37 новых). 22 добавленные модели Carbon 4 имеют managed=False — таблицы создаются по необходимости. SystemSettings — новая модель (managed=True).
| ID | Имя | IP | Тип | RADIUS Secret |
|---|---|---|---|---|
| 5 | Червленое | 10.233.1.101 | mikrotik6 | smitsecretkey |
| 11 | NAS GAP | 10.100.100.69 | mikrotik6 | smitsecretkey |
| 19 | TOY | 10.233.1.90 | mikrotik6 | smitsecretkey |
| 35 | NAS RAM | 10.233.1.94 | mikrotik6 | smitsecretkey |
| 38 | NAS NEO | 10.100.100.21 | mikrotik6 | smitsecretkey |
| 49 | Malder | 37.29.7.151 | mikrotik6 | smitsecretkey |
| 50 | CCR | 10.100.100.46 | mikrotik6 | smitsecretkey |
| 51 | PLOD | 178.35.228.67 | mikrotik6 | smitsecretkey |
| 52 | bill | 127.0.0.1 | common_ssh | smitsecretkey |
| 53 | Test | 83.234.21.201 | mikrotik6 | smitsecretkey |
| 54 | FAG | 10.100.100.30 | mikrotik6 | smitsecretkey |
| 55 | JOY | 10.100.100.25 | mikrotik6 | smitsecretkey |
| 56 | NAS_SUN | 10.100.100.94 | mikrotik6 | smitsecretkey |
Для всех MikroTik NAS установлены следующие RADIUS-настройки:
| Поле | Значение | Описание |
|---|---|---|
| auth_login | True | Авторизация по логину (PPPoE/VPN) |
| acc_start_login | True | Accounting Start по логину |
| acc_start_sid | True | Accounting Start по Session-ID |
| acc_update_sid | True | Accounting Update по Session-ID |
| acc_stop_sid | True | Accounting Stop по Session-ID |
| reject_block | True | Отклонять заблокированных |
| coa_port | 3799 | Порт Change of Authorization |
| radius_secret | smitsecretkey | Общий секрет RADIUS |
Вертикальные под-вкладки (как в оригинальном Carbon 4):
| Тест | Команда | Результат |
|---|---|---|
| Валидный пользователь | radtest 2105 2243179 127.0.0.1 0 testing123 | Access-Accept + Framed-IP-Address=10.99.56.101 |
| Другой пользователь | radtest 77778 98482018 127.0.0.1 0 testing123 | Access-Accept + Framed-IP-Address=10.99.8.119 |
| С ведущим нулём | radtest 099999 1136850024 127.0.0.1 0 testing123 | Access-Accept + Framed-IP-Address=10.99.40.46 |
| Неверный пароль | radtest 2105 wrongpassword 127.0.0.1 0 testing123 | Access-Reject |
| Несуществующий | radtest 999999 password 127.0.0.1 0 testing123 | Access-Reject |
| Django check | manage.py check --deploy | 0 ошибок |
| Миграции | manage.py makemigrations --check | No changes |
| Модели | apps.get_app_config('billing').get_models() | 135 моделей |
| Файл | Изменение |
|---|---|
| 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/Dockerfile | Entrypoint, 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 |
| Проблема | Статус | Описание |
|---|---|---|
| Сохранение карточки Users (IP, NAS) | В работе | При редактировании Users на /admin/Users/<id>/ изменения полей IP и NAS не сохраняются через форму. Прямое обновление через .save() работает. Причина: валидация формы (process_post() в form.py) — добавлено отладочное логирование для диагностики. |
| FrameworkFormGroupFields дубли | Мониторинг | Таблица содержит 341 запись, многие дублируются. Может влиять на генерацию полей формы. Рекомендация: очистить дубликаты через SQL. |
Перейдите в Оборудование → NAS (/admin/equipment/Nas/?object_type=1).
Для редактирования NAS кликните на его имя. Откроется карточка с вкладками:
clients.conf:
docker compose -f docker-compose.prod.yml restart freeradius
Чтобы назначить IP-адрес и привязать клиента к NAS:
10.77.0.100)Framed-IP-Address. Убедитесь, что IP уникален в рамках NAS.
В правой колонке карточки пользователя можно указать:
Для проверки авторизации клиента подключитесь к контейнеру 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
Вкладка Развёртывание в карточке NAS позволяет управлять конфигурацией MikroTik:
rtsh cfg init → создаёт каталог, rtsh cfg fill → заполняет INI данными из биллингаrtsh cfg download → скачивает конфигурацию с оборудованияrtsh cfg make → генерирует конфигурацию для загрузкиrtsh cfg upload → загружает конфигурацию в оборудованиеrtsh cfg download + rtsh cfg diff cur → сравнивает результатПод-вкладки Настройка, Шаблоны, Upload cfg, Download cfg позволяют просматривать и редактировать конфигурационные файлы прямо в браузере: