Зачем RADIUS
Когда у вас сотни сетевых устройств (switch'и, AP, VPN-концентраторы) и тысячи пользователей, нельзя дублировать пароли в каждом девайсе. Нужна централизованная AAA:
- Authentication, кто этот пользователь
- Authorization, что ему разрешено
- Accounting, учёт сессий (start/stop, byte-counters)
RADIUS (RFC 2865, 1997), старый стандарт для этого. Несмотря на возраст и всех его наследников (Diameter, RadSec), в 2026 это всё ещё доминирующий протокол для:
- WPA2/WPA3-Enterprise Wi-Fi (вместо PSK)
- 802.1X wired-аутентификация на switch-портах
- VPN-сервера (StrongSwan, OpenVPN, [[wireguard|WireGuard]] через wrapper)
- TACACS+ alternative для CLI-доступа на сетевом железе
- Captive portal в hotel/airport Wi-Fi
Транспорт
- UDP/1812, Authentication
- UDP/1813, Accounting
- (Старые порты 1645/1646, legacy, иногда встречаются)
Есть RadSec (RADIUS over TCP/TLS, RFC 6614) для безопасного inter-org RADIUS, например, eduroam использует.
Действующие лица
┌─────────┐ ┌──────────────┐ ┌──────────────┐
│ Клиент │ ◄───► │ NAS (Network │ ◄───► │ RADIUS-сервер│
│ (laptop,│ EAP │ Access Server│ RADIUS │ (FreeRADIUS, │
│ phone) │ │ = AP/switch)│ │ Cisco ISE) │
└─────────┘ └──────────────┘ └──────────────┘
│
▼
backend store
(LDAP/SQL/файл)
- Supplicant (клиент): laptop/phone с 802.1X-supplicant'ом (wpa_supplicant в Linux, встроен в Windows/macOS/iOS).
- NAS (Network Access Server): WiFi-AP или switch-порт. Сам он клиента не аутентифицирует, пробрасывает auth в RADIUS.
- RADIUS-сервер: проверяет credentials, отдаёт Accept/Reject.
Базовый message-flow (PAP)
Client ────[username/password в EAPOL]───► NAS
NAS ────[Access-Request UDP/1812]────► RADIUS
│
├─ проверка в LDAP/SQL
▼
NAS ◄───[Access-Accept или Reject]──── RADIUS
Client ◄────[granted/denied + VLAN/IP]──── NAS
В Access-Request, shared secret между NAS и RADIUS (общий password) шифрует password-attribute.
EAP, гибкий слой над RADIUS
Сам RADIUS поддерживает только базовые auth-методы (PAP/CHAP). Для современных протоколов (TLS, 802.1X), EAP (Extensible Authentication Protocol, RFC 3748).
EAP, message-format, может туннелировать любой auth-метод:
| EAP-метод | Что использует | Где применяется |
|---|---|---|
| EAP-TLS | mutual [[tls-certificates | TLS-cert]]'ы |
| PEAP | server-cert + inner-method (MSCHAPv2) | typical Windows/AD-окружение |
| EAP-TTLS | server-cert + inner (PAP/CHAP/MSCHAPv2) | universal, легко с LDAP backend'ом |
| EAP-MSCHAPv2 | password-only, vulnerable | legacy, не для нового deployment |
| EAP-PWD | password (PAKE) | устройства без cert-store (IoT) |
| EAP-AKA | SIM-card | мобильные операторы |
EAP внутри RADIUS-attributes (EAP-Message). NAS просто
туннелирует, не понимает содержимого. Всё дешифрование на
RADIUS-сервере.
FreeRADIUS, стандарт open-source
Tier-0 в open-source, на нём строится большинство corporate-RADIUS. Конфиг, modular: каждая сущность (метод auth, backend, policy) отдельный модуль.
Файлы:
/etc/raddb/
├── radiusd.conf # main config
├── clients.conf # NAS-устройства с shared-secret
├── users # local user database (старый стиль)
├── mods-available/ # все доступные модули (LDAP, SQL, EAP, ...)
├── mods-enabled/ # символьные ссылки на enabled
├── sites-available/ # virtual servers
└── sites-enabled/
Базовый workflow:
- В
clients.confзарегистрировать NAS:client wifi-ap-1 {ipaddr = 192.168.1.10
secret = supersecret123
shortname = ap-floor-1
}
- В
mods-enabled/ldapнастроить bind к [[ldap-basics|LDAP/AD]]:ldap {server = ldaps://ad.example.com
identity = cn=radius,ou=Service,dc=example,dc=com
password = ...
basedn = dc=example,dc=com
}
- В
sites-enabled/defaultpolicy:authorize { ldap; eap }authenticate { eap; ldap }
Запуск с debug, обязательно для первого раза:
freeradius -X # все логи в stdout, видно каждый attribute
Wi-Fi WPA2-Enterprise (full picture)
Реальный сценарий:
- Laptop подключается к SSID
corp-wifi(security WPA2-Enterprise) - Wi-Fi AP инициирует 802.1X auth, отсылает EAP-запрос
- Laptop предлагает PEAP с TLS внутри
- AP туннелирует EAP в RADIUS Access-Request на сервер
- RADIUS-сервер устанавливает TLS с laptop'ом (через AP), внутри inner-MSCHAPv2 проверяет username/password в LDAP
- RADIUS отвечает Access-Accept + атрибуты:
Tunnel-Type = VLAN
Tunnel-Medium-Type = IEEE-802
Tunnel-Private-Group-Id = 100 ← VLAN ID
- AP помещает laptop в VLAN 100, начинает forward'ить трафик
WPA-PSK (общий пароль на всех), это домашняя версия. WPA-Enterprise каждый пользователь со своими credentials, индивидуальный VLAN/access.
Switch port-security 802.1X
Кабельная сеть может требовать аутентификацию на каждом порту (запретить «воткнул кабель, работает»):
Cisco IOS пример:
interface GigabitEthernet0/1
switchport mode access
authentication port-control auto
dot1x pae authenticator
dot1x timeout tx-period 5
!
aaa group server radius RADIUS
server-private 10.0.0.5 key supersecret123
!
aaa authentication dot1x default group RADIUS
Linux supplicant:
apt install wpasupplicant
wpa_supplicant -D wired -i eth0 -c /etc/wpa_supplicant/eth0.conf
Network device admin (вместо TACACS+)
Часто на switch/router используют RADIUS для CLI-логина админа:
aaa authentication login default group RADIUS local
aaa authorization exec default group RADIUS
Минус против TACACS+ (Cisco proprietary, открытый с 2020): TACACS+ умеет per-command authorization (можно запретить отдельные команды), RADIUS, нет (только enable / no enable).
Accounting
Параллельно auth идёт accounting на UDP/1813:
Acct-Status-Type = Start (сессия началась)
Acct-Session-Id = ...
User-Name = alice
Framed-IP-Address = 10.0.0.42
...
Acct-Status-Type = Interim-Update (every N min)
Acct-Input-Octets = 1234567
Acct-Output-Octets = 7654321
Acct-Status-Type = Stop
Acct-Session-Time = 3600
Используется для billing (ISP, hotel WiFi), forensics (кто был залогинен в момент инцидента), capacity-planning.
RADIUS vs LDAP vs Kerberos
Часто путают, разные слои:
| | RADIUS | [[ldap-basics|LDAP]] | kerberos | |---|--------|------|----------| | Назначение | network-AAA | directory + auth | SSO для services | | Где живёт | сетевое железо ↔ AAA | приложения ↔ directory | приложения ↔ KDC | | Транспорт | UDP/1812 | TCP/389,636 | TCP+UDP/88 | | Backend | да, обычно LDAP/SQL | сам себе backend | own KDC |
Часто стек: RADIUS проверяет на 802.1X, через LDAP в Active Directory, потом приложения отдельно через Kerberos.
Безопасность RADIUS (грабли)
- Shared secret, общий пароль NAS↔RADIUS. Если short, brute'ится. Использовать 16+ random chars.
- Replay-attacks: RADIUS-id 8-bit, легко угадать. RadSec (TLS) или IPsec между NAS↔RADIUS для prod.
- MSCHAPv2 уязвим (DES → 56-bit effective). PEAP-MSCHAPv2 защищён внешним TLS, но если злоумышленник имитирует AP с fake-cert и клиент не проверяет, пароль украден. Поэтому обязательно verify server-cert на клиенте.
- MAC-bypass auth, в небезопасных случаях RADIUS может разрешать на основе MAC. MAC легко spoof'ится, это не auth, это identifier.
- CVE-2024-3596 BlastRADIUS, атака на MD5-based authentication
в RADIUS. Mitigation:
Message-Authenticatorвсегда + RadSec.
Когда что-то пошло не так
Reject from serverбез деталей,freeradius -Xпокажет каждый attribute и причину (часто ldap bind failed).- NAS не получает Access-Accept, UDP теряется, или wrong
shared-secret.
tcpdump -i any port 1812 -Xпосмотри пакеты. - EAP fails on
Server certificate validation failed, клиент не доверяет cert RADIUS-сервера. Раздать root CA на устройства, или в EAP-supplicant настроить. - VLAN не назначается после Accept, RADIUS не отдаёт
Tunnel-*атрибуты, или switch их не парсит.dot1x debugна свитче. - Accounting не пишется,
accounting-portна NAS не указан, или firewall блокирует UDP/1813. - High latency на auth, backend (LDAP) тормозит.
freeradius -Xпокажет где. Cache, replicas. Login OK but no enable mode, RADIUS вернул Accept, но безService-Type = Administrative-Userатрибута → switch даёт только user-mode.