Теоретические основы и архитектура

Управление миллионами абонентов в BNG осуществляется через протокол RADIUS (Remote Authentication Dial-In User Service, RFC 2865 / RFC 2866). Процесс AAA включает: 1. Authentication (Аутентификация): BNG отправляет серверу Access-Request. Для PPPoE в нём User-Name и пароль (PAP скрывается XOR с MD5, CHAP передаётся как CHAP-Password и CHAP-Challenge), для IPoE - MAC или Circuit-ID/Remote-ID, полученные из DHCP Option 82 (они передаются атрибутами вроде Calling-Station-Id, Agent-Circuit-Id или NAS-Port-Id, сама Option 82 в пакет не вкладывается). Сервер отвечает Access-Accept, Access-Reject или Access-Challenge. 2. Authorization (Авторизация): в Access-Accept приходят стандартные атрибуты (Framed-IP-Address - один адрес, Framed-Pool - имя пула, Session-Timeout, Acct-Interim-Interval, Filter-Id) и Vendor-Specific Attributes (VSA): имя VRF (например, Cisco-AVPair ip:vrf-id=), профиль скорости (Huawei-Input/Output-Average-Rate, Mikrotik-Rate-Limit), ACL. Session-Timeout ограничивает длительность сессии, а не аренду адреса. 3. Accounting (Учёт): BNG отправляет Accounting-Request на UDP 1813: Start при входе, Interim-Update (типично каждые 5-15 минут) со счётчиками байт и пакетов, Stop при отключении; на них строится тарификация. Через RADIUS CoA и Disconnect (RFC 5176, UDP 3799) биллинг может изменить скорость или разорвать сессию (Disconnect-Request) без перезагрузки модема, если BNG находит сессию по присланным атрибутам.

Роли и транспорт RADIUS

BNG - клиент RADIUS (NAS, Network Access Server), биллинг/AAA-сервер - RADIUS-сервер. Аутентификация и авторизация идут по UDP 1812 (устаревший порт 1645), учёт - по UDP 1813 (1646), смена авторизации и отключение (CoA/Disconnect, RFC 5176) - по UDP 3799 от сервера к NAS (у Cisco по умолчанию 1700, его меняют вручную). Сервер определяет клиента по source IP пакета и shared secret, поэтому на BNG фиксируют source-interface (обычно Loopback), иначе при смене исходящего интерфейса сервер молча отбросит запросы. Формат пакета: Code (1 байт), Identifier (1), Length (2), Authenticator (16), затем TLV-атрибуты (Type, Length, Value). Коды: 1 Access-Request, 2 Access-Accept, 3 Access-Reject, 11 Access-Challenge, 4/5 Accounting-Request/Response, 40/41/42 Disconnect-Request/ACK/NAK, 43/44/45 CoA-Request/ACK/NAK.

Authentication и защита пакета

Request Authenticator - 16 случайных байт. Пароль PAP (User-Password, атрибут 2) скрывается XOR с MD5(secret + Request Authenticator) блоками по 16 байт; Response Authenticator в Access-Accept = MD5(Code + ID + Length + Request Authenticator + атрибуты + secret), так клиент убеждается, что ответ пришёл от владельца secret. Для CHAP BNG передаёт CHAP-Password (3) и CHAP-Challenge (60), сервер сам вычисляет MD5 и сравнивает, поэтому пароль на сервере должен храниться обратимо. MD5-основа считается слабой: атака BlastRADIUS (CVE-2024-3596) позволяет подделать ответ, если в запросе нет Message-Authenticator (атрибут 80, HMAC-MD5). Защита: Message-Authenticator во всех Access-Request, ограничение доступа по IP, длинные секреты и по возможности RADIUS поверх TLS (RadSec, RFC 6614, TCP 2083). Для MAC-аутентификации IPoE в User-Name и User-Password часто кладут MAC, а в Calling-Station-Id (31) - MAC клиента.

Authorization: атрибуты Access-Accept

В Access-Accept приходит профиль сессии. Стандартные атрибуты: Framed-IP-Address (8), Framed-IP-Netmask (9), Framed-Pool (88), Framed-MTU (12), Session-Timeout (27), Idle-Timeout (28), Acct-Interim-Interval (85, RFC 2869), Filter-Id (11), Class (25), Framed-IPv6-Prefix (97), Delegated-IPv6-Prefix (123), Framed-IPv6-Pool (100). Всё остальное - Vendor-Specific (26): Cisco-AVPair (vendor 9, type 1) со строками вида ip:vrf-id=..., ip:addr-pool=...; Huawei (vendor 2011) - Huawei-Input/Output-Average-Rate и Peak-Rate (бит/с), Huawei-Domain-Name; Juniper/ERX (vendor 4874) - Virtual-Router (имя VR/routing instance), Ingress/Egress-Policy-Name; MikroTik (vendor 14988) - Mikrotik-Rate-Limit (rx/tx, например 50M/100M), Mikrotik-Address-List. Атрибут VRF определяет, в какую VRF MPLS-ядра BNG поместит /32 абонента; если имя неверно, сессия поднимется в глобальной таблице или будет отклонена BNG. Один и тот же профиль можно хранить в RADIUS и разносить по вендорам (сервер подбирает VSA по NAS-Identifier или словарю).

Accounting: Start, Interim, Stop

Accounting-Request несёт Acct-Status-Type (40): 1 Start (после выдачи адреса), 3 Interim-Update (периодически, интервал задаёт Acct-Interim-Interval или локальная настройка, типично 5-15 мин), 2 Stop, 7/8 Accounting-On/Off (перезагрузка NAS). Идентификаторы: Acct-Session-Id (44) уникален в сессии, Acct-Multi-Session-Id (50) связывает сессии dual-stack. Счётчики: Acct-Input/Output-Octets (42/43) с Gigawords (52/53) для объёмов >4 ГБ, Acct-Input/Output-Packets (47/48), Acct-Session-Time (46), Acct-Terminate-Cause (49: 1 User-Request, 2 Lost-Carrier, 4 Idle-Timeout, 5 Session-Timeout, 6 Admin-Reset). Если сервер учёта недоступен, NAS буферизует Stop-пакеты (настраивается), иначе биллинг получает "повисшие" сессии, которые закрываются только вручную или по Interim-таймауту. Перезагрузка BNG без Accounting-On/Off - тоже источник призрачных сессий.

CoA и Disconnect

CoA-Request (код 43) меняет атрибуты живой сессии: новая скорость, перевод в walled garden, смена ACL, редирект; CoA-ACK/NAK (44/45) отвечает NAS, причина отказа - Error-Cause (101), например 503 "Session Context Not Found". Disconnect-Request (40) закрывает сессию (при нулевом балансе или сбросе по запросу абонента). Сессия на NAS находится по Acct-Session-Id, User-Name, Framed-IP-Address или Calling-Station-Id; атрибуты должны совпасть, иначе NAK. NAS должен разрешать пакеты только от доверенного сервера (client ... server-key) и порт 3799 должен быть открыт на пути (в том числе в VRF управления).