# RADIUS - аутентификация для сети, VPN, Wi-Fi _Протоколы · LinuxLab Knowledge Base_ **TL;DR:** RADIUS - старый AAA-протокол UDP/1812+1813 (auth+accounting). Использование - аутентификация на сетевом железе: Wi-Fi WPA2-Ent через EAP, VPN-клиенты, доступ к роутерам и switch'ам. FreeRADIUS - реализация по умолчанию. ## Зачем 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]]'ы | enterprise high-security, нет паролей | | **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: 1. В `clients.conf` зарегистрировать NAS: ``` client wifi-ap-1 { ipaddr = 192.168.1.10 secret = supersecret123 shortname = ap-floor-1 } ``` 2. В `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 } ``` 3. В `sites-enabled/default` policy: ``` authorize { ldap; eap } authenticate { eap; ldap } ``` Запуск с debug, обязательно для первого раза: ```bash freeradius -X # все логи в stdout, видно каждый attribute ``` ## Wi-Fi WPA2-Enterprise (full picture) Реальный сценарий: 1. Laptop подключается к SSID `corp-wifi` (security WPA2-Enterprise) 2. Wi-Fi AP инициирует **802.1X** auth, отсылает EAP-запрос 3. Laptop предлагает PEAP с TLS внутри 4. AP туннелирует EAP в RADIUS Access-Request на сервер 5. RADIUS-сервер устанавливает TLS с laptop'ом (через AP), внутри inner-MSCHAPv2 проверяет username/password в LDAP 6. RADIUS отвечает Access-Accept + атрибуты: ``` Tunnel-Type = VLAN Tunnel-Medium-Type = IEEE-802 Tunnel-Private-Group-Id = 100 ← VLAN ID ``` 7. 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: ```bash 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](/kb/kerberos.md) | |---|--------|------|----------| | Назначение | 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. ## Команды ```bash freeradius -X ``` Запустить FreeRADIUS в debug-режиме - все запросы и решения с детализацией ```bash radtest alice secret123 192.168.1.10 0 sharedsecret ``` Тест auth от имени NAS-имитатора - быстрая проверка, что сервер отвечает Accept/Reject ```bash radclient -x localhost auth sharedsecret <<< 'User-Name=alice,User-Password=s3cret' ``` Прямой запрос к RADIUS-серверу с произвольными атрибутами для отладки ```bash tcpdump -i any -nn 'udp port 1812 or udp port 1813' -X ``` Захватить RADIUS-трафик с hex-dump - viewing packets в живую ```bash wpa_supplicant -D wired -i eth0 -c /etc/wpa_supplicant/eth0.conf ``` Linux supplicant для 802.1X на проводном порту - аутентификация на switch'е ```bash ldapsearch -H ldaps://ad.example.com -D radius@example.com -w secret -b dc=example,dc=com 'sAMAccountName=alice' ``` Проверить, что RADIUS bind в AD работает, до настройки модуля LDAP ```bash echo 'User-Name=test,Cleartext-Password:=test' >> /etc/raddb/users ``` Простейший local-user для теста - без LDAP/SQL backend'а ## См. также - [PAM - Pluggable Authentication Modules](/kb/pam.md) - [OpenVPN - TLS-based VPN](/kb/openvpn.md) - [LDAP - directory services основы](/kb/ldap-basics.md) - [Kerberos - сетевой single sign-on](/kb/kerberos.md) - [TLS-сертификаты - X.509, цепочка доверия, Let's Encrypt](/kb/tls-certificates.md)