Configurando RADIUS con FreeRADIUS y daloRADIUS para autenticación PPPoE
RADIUS (Remote Authentication Dial-In User Service) es el estándar de facto para centralizar la autenticación, autorización y contabilidad (AAA) de usuarios en redes de acceso. En ISPs pequeños y medianos, la combinación FreeRADIUS + MariaDB + daloRADIUS ofrece un stack robusto y gratuito que puede manejar miles de sesiones PPPoE. Este post cubre la instalación completa desde cero en Debian/Ubuntu, con un servidor PPPoE MikroTik como NAS.
Arquitectura
1Suscriptor DSL/FTTH
2 │
3 ▼
4 CPE (modem/bridge)
5 │ PPPoE
6 ▼
7┌─────────────────┐ RADIUS (UDP 1812/1813) ┌────────────────────┐
8│ MikroTik L2TP │ ─────────────────────────────────► │ FreeRADIUS │
9│ / PPPoE Server │ │ + MariaDB │
10│ (NAS) │ ◄───────────────────────────────── │ (192.168.1.10) │
11└─────────────────┘ Access-Accept / Reject └────────────────────┘
12 │
13 ┌────────────────────┐
14 │ daloRADIUS │
15 │ (web UI PHP) │
16 └────────────────────┘
| Componente | Rol |
|---|---|
| FreeRADIUS | Servidor AAA, procesa solicitudes del NAS |
| MariaDB | Backend con usuarios, grupos y atributos |
| daloRADIUS | Interfaz web para gestión de usuarios y reportes |
| MikroTik | NAS que autentica sesiones PPPoE contra RADIUS |
Paso 1: Instalar MariaDB y crear la base de datos
1apt update && apt install -y mariadb-server
2mysql_secure_installation
Crear la base de datos y el usuario:
1mysql -u root -p
2
3CREATE DATABASE radius CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
4CREATE USER 'radius'@'localhost' IDENTIFIED BY 'RadiusP@ss2026';
5GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost';
6FLUSH PRIVILEGES;
7EXIT;
Paso 2: Instalar FreeRADIUS con módulo SQL
1apt install -y freeradius freeradius-mysql freeradius-utils
Importar el esquema SQL
FreeRADIUS incluye los scripts de esquema en /etc/freeradius/3.0/mods-config/sql/main/mysql/:
1mysql -u radius -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
Esto crea las tablas fundamentales:
| Tabla | Propósito |
|---|---|
radcheck | Atributos de autenticación por usuario (contraseña) |
radreply | Atributos que RADIUS devuelve al NAS tras el Accept |
radgroupcheck | Atributos de verificación por grupo |
radgroupreply | Atributos de respuesta por grupo (pool IP, etc.) |
radusergroup | Asignación de usuarios a grupos |
radacct | Contabilidad de sesiones (Accounting) |
nas | Dispositivos NAS autorizados |
Configurar el módulo SQL
Habilitar el módulo:
1ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/sql
Editar /etc/freeradius/3.0/mods-available/sql:
1sql {
2 dialect = "mysql"
3
4 driver = "rlm_sql_mysql"
5
6 server = "localhost"
7 port = 3306
8 login = "radius"
9 password = "RadiusP@ss2026"
10 radius_db = "radius"
11
12 # Leer usuarios de la tabla radcheck
13 read_clients = yes
14 client_table = "nas"
15
16 pool {
17 start = 5
18 min = 3
19 max = 32
20 spare = 10
21 uses = 0
22 lifetime = 0
23 idle_timeout = 60
24 }
25}
Activar SQL en los sitios virtuales
En /etc/freeradius/3.0/sites-enabled/default, dentro de las secciones authorize, accounting y session, descomentar o agregar sql:
1authorize {
2 filter_username
3 preprocess
4 chap
5 mschap
6 digest
7 suffix
8 eap {
9 ok = return
10 }
11 sql # ← agregar/descomentar
12 pap
13}
14
15accounting {
16 detail
17 sql # ← agregar/descomentar
18 exec
19 attr_filter.accounting_response
20}
21
22session {
23 sql # ← agregar/descomentar
24}
Lo mismo aplica para /etc/freeradius/3.0/sites-enabled/inner-tunnel si se usa EAP.
Paso 3: Registrar el NAS MikroTik
Insertar el NAS en la tabla nas para que FreeRADIUS acepte sus solicitudes:
1mysql -u radius -p radius
2
3INSERT INTO nas (nasname, shortname, type, secret, description)
4VALUES ('192.168.1.1', 'MikroTik-PPPoE', 'other', 'SecretShared123', 'Router PPPoE principal');
El campo
secretdebe coincidir exactamente con el configurado en el cliente RADIUS del MikroTik.
Paso 4: Agregar un usuario de prueba
1-- Contraseña en texto claro (Cleartext-Password)
2INSERT INTO radcheck (username, attribute, op, value)
3VALUES ('testuser', 'Cleartext-Password', ':=', 'TestPass2026');
4
5-- Asignar al grupo "pppoe-users"
6INSERT INTO radusergroup (username, groupname, priority)
7VALUES ('testuser', 'pppoe-users', 1);
Definir atributos de respuesta del grupo (pool de IPs):
1INSERT INTO radgroupreply (groupname, attribute, op, value)
2VALUES
3 ('pppoe-users', 'Framed-Pool', ':=', 'pool-clientes'),
4 ('pppoe-users', 'Session-Timeout', ':=', '86400'),
5 ('pppoe-users', 'Idle-Timeout', ':=', '3600');
Paso 5: Verificar FreeRADIUS en modo debug
Detener el servicio y correr en debug para ver el flujo completo:
1systemctl stop freeradius
2freeradius -X
En otra terminal, probar con radtest:
1radtest testuser TestPass2026 127.0.0.1 0 testing123
Respuesta esperada:
1Sending Access-Request of id 123 to 127.0.0.1 port 1812
2 User-Name = "testuser"
3 User-Password = "TestPass2026"
4 ...
5Received Access-Accept of id 123 from 127.0.0.1 port 1812
6 Framed-Pool = "pool-clientes"
7 Session-Timeout = 86400
Si obtienes Access-Accept, FreeRADIUS está operando correctamente. Iniciar el servicio:
1systemctl enable --now freeradius
Paso 6: Instalar daloRADIUS
daloRADIUS es una interfaz web PHP para gestionar usuarios, NAS y revisar reportes de contabilidad.
Dependencias
1apt install -y apache2 php php-mysql php-gd php-curl php-mail php-mail-mime \
2 php-pear php-db libapache2-mod-php unzip curl
Descargar e instalar
1cd /var/www/html
2curl -LO https://github.com/lirantal/daloradius/archive/refs/heads/master.zip
3unzip master.zip
4mv daloradius-master daloradius
5chown -R www-data:www-data /var/www/html/daloradius
6chmod -R 755 /var/www/html/daloradius
Importar esquema adicional de daloRADIUS
1mysql -u radius -p radius < /var/www/html/daloradius/contrib/db/mysql-daloradius.sql
Configurar la conexión a la base de datos
Editar /var/www/html/daloradius/library/daloradius.conf.php:
1$configValues['FREERADIUS_VERSION'] = '3';
2$configValues['DB_ENGINE'] = 'mysqli';
3$configValues['DB_HOST'] = 'localhost';
4$configValues['DB_PORT'] = '3306';
5$configValues['DB_USER'] = 'radius';
6$configValues['DB_PASS'] = 'RadiusP@ss2026';
7$configValues['DB_NAME'] = 'radius';
VirtualHost de Apache (opcional, dominio dedicado)
Crear /etc/apache2/sites-available/daloradius.conf:
1<VirtualHost *:80>
2 ServerName radius.midominio.com
3 DocumentRoot /var/www/html/daloradius
4
5 <Directory /var/www/html/daloradius>
6 Options -Indexes
7 AllowOverride All
8 Require all granted
9 </Directory>
10
11 ErrorLog ${APACHE_LOG_DIR}/daloradius_error.log
12 CustomLog ${APACHE_LOG_DIR}/daloradius_access.log combined
13</VirtualHost>
1a2ensite daloradius
2a2enmod rewrite
3systemctl reload apache2
Acceder a http://192.168.1.10/daloradius con las credenciales por defecto:
| Campo | Valor |
|---|---|
| Usuario | administrator |
| Password | radius |
Cambiar la contraseña inmediatamente en Config → Operators → Manage Operators.
Paso 7: Configurar MikroTik como cliente RADIUS
En el RouterOS del MikroTik (PPPoE Server):
1# Agregar el servidor RADIUS
2/radius add \
3 address=192.168.1.10 \
4 secret=SecretShared123 \
5 service=ppp \
6 authentication-port=1812 \
7 accounting-port=1813
8
9# Activar uso de RADIUS en el perfil PPPoE
10/ppp aaa set use-radius=yes accounting=yes
11
12# Verificar
13/radius print
Confirmar que el perfil de PPPoE apunta a RADIUS:
1/ppp profile set default use-radius=yes
Pool de IPs administrado por RADIUS
Si RADIUS devuelve el atributo Framed-Pool, el MikroTik asignará una IP del pool local con ese nombre:
1/ip pool add name=pool-clientes ranges=10.20.0.1-10.20.0.254
Paso 8: Probar una sesión PPPoE completa
Conectar un cliente PPPoE con usuario testuser / TestPass2026. En FreeRADIUS logs (/var/log/freeradius/radius.log) se verá:
1Login OK: [testuser] (from client MikroTik-PPPoE port 0 via TLS tunnel)
En MikroTik verificar la sesión activa:
1/ppp active print
En daloRADIUS ir a Accounting → Active Sessions para ver la sesión en tiempo real.
Atributos RADIUS útiles para PPPoE
| Atributo RADIUS | Efecto en MikroTik |
|---|---|
Framed-Pool | Pool de IPs del que se asigna la dirección |
Framed-IP-Address | IP fija para el usuario |
Session-Timeout | Tiempo máximo de sesión en segundos |
Idle-Timeout | Desconexión por inactividad |
Mikrotik-Rate-Limit | Límite de velocidad (ej. 10M/10M) |
Mikrotik-Address-List | Agrega la IP del usuario a una lista |
Ejemplo para limitar velocidad a 10 Mbps simétrico via radgroupreply:
1INSERT INTO radgroupreply (groupname, attribute, op, value)
2VALUES ('plan-10mbps', 'Mikrotik-Rate-Limit', ':=', '10M/10M');
Solución de problemas comunes
Access-Reject sin mensaje claro
Correr freeradius -X y buscar la línea ERROR: o WARNING:. Causas frecuentes:
- El
secretdel NAS no coincide entre MikroTik y la tablanas. - El módulo SQL no está habilitado en
authorize. - La contraseña en
radcheckusa el operador incorrecto (debe ser:=, no==).
daloRADIUS muestra error de conexión a DB
1# Probar conexión directa
2mysql -u radius -p radius -e "SHOW TABLES;"
Si falla, revisar permisos del usuario radius en MariaDB.
MikroTik no envía Accounting
Verificar en /ppp aaa:
1/ppp aaa print
2 use-radius: yes
3 accounting: yes
Si accounting: no, los registros de sesión no se guardarán en radacct.
Consideraciones de seguridad
- Usar un
secretcompartido largo y aleatorio (mínimo 20 caracteres). - Limitar el acceso al puerto 1812/1813 UDP únicamente desde las IPs de los NAS (
ufw allow from 192.168.1.1 to any port 1812,1813 proto udp). - Proteger daloRADIUS con HTTPS y autenticación básica de Apache si está expuesto fuera de la red de gestión.
- Considerar migrar las contraseñas de
Cleartext-PasswordaMD5-Passwordo usar CHAP/MS-CHAPv2 para no transmitir contraseñas en texto claro entre FreeRADIUS y MariaDB.
Con esto tienes un stack RADIUS completamente funcional: FreeRADIUS procesa la autenticación, MariaDB persiste usuarios y sesiones, daloRADIUS da visibilidad operativa, y el MikroTik delega toda la AAA al servidor central. Desde aquí puedes escalar agregando más NAS a la tabla nas, crear grupos por plan de velocidad, y automatizar altas de usuarios desde daloRADIUS o directamente vía SQL.