FreeRADIUS es el servidor RADIUS open source más utilizado. Autentica a los usuarios que se conectan a una WiFi WPA2/WPA3-Enterprise, a un puerto de switch con 802.1X o a una VPN, y puede devolver atributos como la VLAN en la que debe quedar cada usuario. En este tutorial instalarás FreeRADIUS 3.2 en Ubuntu 24.04, crearás usuarios y clientes, lo probarás con radtest, lo prepararás para PEAP-MSCHAPv2 con un certificado propio y asignarás VLAN por usuario.
Requisitos previos
- Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, y un usuario no root con privilegios
sudo. FreeRADIUS consume muy pocos recursos: 1 GB de RAM es suficiente. - Conectividad por UDP 1812 (autenticación) y 1813 (accounting) entre el servidor y los equipos que le enviarán peticiones (puntos de acceso, switches, concentradores VPN). Lo habitual es hacerlo por una red privada o una VPN, no por Internet.
- Para WiFi empresarial: un certificado de servidor emitido por tu CA interna, o la intención de crear una (paso 5).
En la terminología RADIUS, los equipos que envían peticiones al servidor se llaman clientes o NAS (Network Access Server). Los usuarios que se conectan a la red no hablan con FreeRADIUS directamente: lo hace el NAS en su nombre.
Paso 1: Instalar FreeRADIUS
Instala el servidor y las utilidades de prueba desde los repositorios de Ubuntu:
sudo apt update
sudo apt install freeradius freeradius-utils
El paquete arranca y habilita el servicio freeradius automáticamente. Comprueba la versión y el estado:
freeradius -v | head -1
systemctl status freeradius --no-pager
radiusd: FreeRADIUS Version 3.2.5, for host x86_64-pc-linux-gnu
● freeradius.service - FreeRADIUS multi-protocol policy server
Loaded: loaded (/usr/lib/systemd/system/freeradius.service; enabled; preset: enabled)
Active: active (running)
Toda la configuración está en /etc/freeradius/3.0/ (el nombre del directorio se mantiene aunque la versión sea 3.2). Los archivos que tocarás en esta guía son:
| Archivo | Función |
|---|---|
clients.conf | Equipos NAS autorizados y su secreto compartido |
mods-config/files/authorize | Usuarios locales y sus atributos (también accesible como users) |
mods-available/eap | Métodos EAP y certificados para WiFi y 802.1X |
sites-available/default y inner-tunnel | Lógica de autorización y autenticación |
Paso 2: Crear un usuario y probarlo con radtest
Empieza con un usuario local para verificar que el servidor responde. Abre el archivo de usuarios:
sudo nano /etc/freeradius/3.0/mods-config/files/authorize
Añade esta línea al principio del archivo, antes de las entradas DEFAULT que trae de ejemplo. Sustituye your_user y your_strong_password:
your_user Cleartext-Password := "your_strong_password"
Cleartext-Password indica la contraseña de referencia con la que FreeRADIUS comprobará lo que envíe el usuario. Se guarda en claro porque MSCHAPv2, el método que usan casi todos los clientes WiFi, la necesita para calcular la respuesta. Por eso el archivo solo lo puede leer el usuario freerad.
Reinicia el servicio para cargar el cambio:
sudo systemctl restart freeradius
radtest envía una petición de acceso como si fuera un NAS. El clients.conf por defecto ya autoriza a localhost con el secreto testing123, así que puedes usarlo para esta prueba:
radtest your_user 'your_strong_password' 127.0.0.1 0 testing123
Sent Access-Request Id 117 from 0.0.0.0:48213 to 127.0.0.1:1812 length 79
User-Name = "your_user"
User-Password = "your_strong_password"
NAS-IP-Address = 127.0.1.1
NAS-Port = 0
Message-Authenticator = 0x00
Cleartext-Password = "your_strong_password"
Received Access-Accept Id 117 from 127.0.0.1:1812 to 127.0.0.1:48213 length 20
Access-Accept significa que la autenticación fue correcta; con una contraseña errónea verás Access-Reject. Repite la prueba con MSCHAPv2, que es lo que usará después la WiFi dentro del túnel PEAP:
radtest -t mschap your_user 'your_strong_password' 127.0.0.1 0 testing123
Received Access-Accept Id 42 from 127.0.0.1:1812 to 127.0.0.1:52900 length 84
MS-CHAP-MPPE-Keys = 0x...
MS-MPPE-Encryption-Policy = Encryption-Allowed
MS-MPPE-Encryption-Types = RC4-40or128-bit-Allowed
Paso 3: Usar el modo depuración
Cuando algo no funciona, el registro normal de FreeRADIUS dice muy poco. El modo depuración muestra, para cada petición, qué módulo la procesó y por qué se aceptó o rechazó. Es la herramienta principal para diagnosticar cualquier problema.
Detén el servicio y arranca FreeRADIUS en primer plano:
sudo systemctl stop freeradius
sudo freeradius -X
...
Listening on auth address * port 1812 bound to server default
Listening on acct address * port 1813 bound to server default
...
Ready to process requests
Desde otra terminal, repite el radtest del paso anterior y observa la traza. Cuando termines, pulsa Ctrl+C y vuelve a arrancar el servicio:
sudo systemctl start freeradius
Para validar la configuración tras un cambio sin arrancar el servidor, usa:
sudo freeradius -XC | tail -1
Configuration appears to be OK
Paso 4: Dar de alta los clientes NAS
Cada punto de acceso, switch o concentrador VPN debe estar declarado en clients.conf con su IP y un secreto compartido. El secreto firma los paquetes entre el NAS y el servidor, así que genera uno largo y aleatorio para cada cliente o grupo de clientes:
openssl rand -base64 24
q3Vx8mZ1pN6tR0wY4bK7cH2fJ9sL5dA1
Abre el archivo de clientes:
sudo nano /etc/freeradius/3.0/clients.conf
Añade al final un bloque por equipo o por subred. En este ejemplo, todos los puntos de acceso de la red de gestión 192.168.10.0/24 comparten secreto:
client aps-oficina {
ipaddr = 192.168.10.0/24
secret = your_shared_secret
shortname = aps-oficina
}
Valida la configuración y reinicia:
sudo freeradius -XC | tail -1
sudo systemctl restart freeradius
Abre en UFW los puertos RADIUS solo para esa subred:
sudo ufw allow from 192.168.10.0/24 to any port 1812:1813 proto udp
sudo ufw status
To Action From
-- ------ ----
1812:1813/udp ALLOW 192.168.10.0/24
En cada punto de acceso, configura el servidor RADIUS con la IP del servidor FreeRADIUS, el puerto 1812 y el mismo secreto. Si un equipo envía peticiones desde una IP no declarada, FreeRADIUS las descarta y registra Ignoring request ... from unknown client.
Paso 5: Preparar EAP para WiFi WPA2-Enterprise
Las redes WPA2/WPA3-Enterprise usan EAP. El método más compatible es PEAP-MSCHAPv2: el dispositivo abre un túnel TLS con FreeRADIUS, valida su certificado y, dentro del túnel, envía usuario y contraseña con MSCHAPv2. El módulo eap ya viene habilitado; solo hay que ajustar el método por defecto y el certificado.
Abre la configuración del módulo:
sudo nano /etc/freeradius/3.0/mods-available/eap
Dentro del bloque eap { ... }, cambia el método por defecto a PEAP:
default_eap_type = peap
En el bloque tls-config tls-common { ... } del mismo archivo, apunta a tu certificado. El paquete de Ubuntu trae un certificado autofirmado de prueba, que sirve para verificar que EAP funciona pero que los dispositivos no pueden validar. Sustituye estas tres líneas por las rutas de tus archivos:
private_key_file = /etc/freeradius/3.0/certs/radius.key
certificate_file = /etc/freeradius/3.0/certs/radius.crt
ca_file = /etc/freeradius/3.0/certs/ca.crt
Si no tienes una CA interna, puedes crear una pequeña con OpenSSL. Primero la CA, con una validez de 10 años:
cd /etc/freeradius/3.0/certs
sudo openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
-keyout ca.key -out ca.crt -subj "/CN=Your Company RADIUS CA"
Después el certificado del servidor, firmado por esa CA. El nombre radius.your_domain es el que configurarás en los dispositivos para validar el servidor:
sudo openssl req -newkey rsa:2048 -nodes -keyout radius.key -out radius.csr \
-subj "/CN=radius.your_domain"
printf "subjectAltName=DNS:radius.your_domain\nextendedKeyUsage=serverAuth\n" | sudo tee radius.ext > /dev/null
sudo openssl x509 -req -in radius.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-days 825 -sha256 -out radius.crt -extfile radius.ext
Comprueba que el certificado está firmado por tu CA:
sudo openssl verify -CAfile ca.crt radius.crt
radius.crt: OK
Ajusta los permisos: FreeRADIUS necesita leer el certificado y la clave del servidor, pero la clave de la CA solo debe poder leerla root. Guarda además una copia de ca.key fuera del servidor:
sudo chown freerad:freerad radius.key radius.crt ca.crt
sudo chmod 640 radius.key
sudo chown root:root ca.key
sudo chmod 600 ca.key
Valida y reinicia:
sudo freeradius -XC | tail -1
sudo systemctl restart freeradius
Por último, configura los clientes:
- En el punto de acceso: seguridad WPA2-Enterprise (o WPA3-Enterprise), servidor RADIUS con la IP de FreeRADIUS, puerto 1812 y el secreto del paso 4.
- En los dispositivos: método PEAP, autenticación interna MSCHAPv2, certificado de CA
ca.crty dominioradius.your_domain. Distribuyeca.crt(nuncaca.key) por MDM o GPO para que los usuarios no tengan que aceptar el certificado a mano.
Advertenciasi los dispositivos se conectan sin validar el certificado del servidor, un punto de acceso falso puede capturar sus credenciales MSCHAPv2. Configura siempre la CA y el nombre del servidor en el perfil WiFi.
Mientras conectas el primer dispositivo, mantén sudo freeradius -X en marcha (con el servicio detenido) para ver el intercambio EAP completo y el Access-Accept final.
Paso 6: Asignar una VLAN a cada usuario
Los switches y puntos de acceso que soportan VLAN dinámica colocan al usuario en la VLAN que indique RADIUS mediante tres atributos estándar. Edita de nuevo el archivo de usuarios:
sudo nano /etc/freeradius/3.0/mods-config/files/authorize
Añade los atributos de respuesta a la entrada del usuario. Las líneas de atributos van indentadas y separadas por comas:
your_user Cleartext-Password := "your_strong_password"
Tunnel-Type = VLAN,
Tunnel-Medium-Type = IEEE-802,
Tunnel-Private-Group-Id = "20"
Con PEAP, el usuario se autentica dentro del túnel (servidor virtual inner-tunnel) y esos atributos tienen que copiarse a la respuesta exterior, que es la que recibe el punto de acceso. Abre el servidor virtual interno:
sudo nano /etc/freeradius/3.0/sites-available/inner-tunnel
En la sección post-auth, localiza este bloque comentado y quita los # para activarlo:
update {
&outer.session-state: += &reply:
}
El servidor default ya incluye en su post-auth el bloque que añade session-state a la respuesta final. Valida, reinicia y prueba con radtest:
sudo freeradius -XC | tail -1
sudo systemctl restart freeradius
radtest your_user 'your_strong_password' 127.0.0.1 0 testing123
Received Access-Accept Id 88 from 127.0.0.1:1812 to 127.0.0.1:40125 length 37
Tunnel-Type:0 = VLAN
Tunnel-Medium-Type:0 = IEEE-802
Tunnel-Private-Group-Id:0 = "20"
En el punto de acceso o switch, activa la asignación dinámica de VLAN (suele llamarse RADIUS VLAN assignment o dynamic VLAN) y asegúrate de que la VLAN 20 existe y está en el troncal.
Solución de problemas
radtest no recibe respuesta. El servidor está parado, UFW bloquea el tráfico o el cliente no está en clients.conf. Con sudo freeradius -X verás Ignoring request ... from unknown client si falta el cliente.
Access-Reject con la contraseña correcta. Busca en la salida de freeradius -X la línea que rechaza la petición. Un caso típico es haber añadido el usuario al final de authorize, detrás de una entrada DEFAULT que corta el procesamiento.
El dispositivo WiFi no termina de conectar. Suele ser el certificado: el dispositivo no confía en la CA, el nombre configurado no coincide con el subjectAltName o el certificado ha caducado. En modo depuración aparecerá un error TLS justo después de ClientHello.
Failed binding to auth address * port 1812: Address already in use. Estás lanzando freeradius -X con el servicio en marcha. Ejecuta sudo systemctl stop freeradius antes.
Conclusión
Tienes FreeRADIUS 3.2 funcionando en Ubuntu 24.04 con usuarios locales, clientes NAS restringidos por IP y secreto, PEAP-MSCHAPv2 con un certificado de tu propia CA y asignación de VLAN por usuario. Como siguientes pasos puedes sustituir el archivo de usuarios por un directorio LDAP o Active Directory con el módulo ldap, guardar el accounting en una base de datos SQL o añadir un segundo servidor RADIUS en los puntos de acceso para tener redundancia.
