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

Suscriptor DSL/FTTH
  CPE (modem/bridge)
       │  PPPoE
┌─────────────────┐        RADIUS (UDP 1812/1813)       ┌────────────────────┐
│  MikroTik L2TP  │ ─────────────────────────────────► │   FreeRADIUS       │
│  / PPPoE Server │                                     │   + MariaDB        │
│  (NAS)          │ ◄─────────────────────────────────  │   (192.168.1.10)   │
└─────────────────┘       Access-Accept / Reject         └────────────────────┘
                                                         ┌────────────────────┐
                                                         │   daloRADIUS       │
                                                         │   (web UI PHP)     │
                                                         └────────────────────┘
ComponenteRol
FreeRADIUSServidor AAA, procesa solicitudes del NAS
MariaDBBackend con usuarios, grupos y atributos
daloRADIUSInterfaz web para gestión de usuarios y reportes
MikroTikNAS que autentica sesiones PPPoE contra RADIUS

Paso 1: Instalar MariaDB y crear la base de datos

apt update && apt install -y mariadb-server
mysql_secure_installation

Crear la base de datos y el usuario:

mysql -u root -p

CREATE DATABASE radius CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'radius'@'localhost' IDENTIFIED BY 'RadiusP@ss2026';
GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Paso 2: Instalar FreeRADIUS con módulo SQL

apt 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/:

mysql -u radius -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql

Esto crea las tablas fundamentales:

TablaPropósito
radcheckAtributos de autenticación por usuario (contraseña)
radreplyAtributos que RADIUS devuelve al NAS tras el Accept
radgroupcheckAtributos de verificación por grupo
radgroupreplyAtributos de respuesta por grupo (pool IP, etc.)
radusergroupAsignación de usuarios a grupos
radacctContabilidad de sesiones (Accounting)
nasDispositivos NAS autorizados

Configurar el módulo SQL

Habilitar el módulo:

ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/sql

Editar /etc/freeradius/3.0/mods-available/sql:

sql {
    dialect = "mysql"

    driver = "rlm_sql_mysql"

    server = "localhost"
    port = 3306
    login = "radius"
    password = "RadiusP@ss2026"
    radius_db = "radius"

    # Leer usuarios de la tabla radcheck
    read_clients = yes
    client_table = "nas"

    pool {
        start = 5
        min = 3
        max = 32
        spare = 10
        uses = 0
        lifetime = 0
        idle_timeout = 60
    }
}

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:

authorize {
    filter_username
    preprocess
    chap
    mschap
    digest
    suffix
    eap {
        ok = return
    }
    sql           # ← agregar/descomentar
    pap
}

accounting {
    detail
    sql           # ← agregar/descomentar
    exec
    attr_filter.accounting_response
}

session {
    sql           # ← agregar/descomentar
}

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:

mysql -u radius -p radius

INSERT INTO nas (nasname, shortname, type, secret, description)
VALUES ('192.168.1.1', 'MikroTik-PPPoE', 'other', 'SecretShared123', 'Router PPPoE principal');

El campo secret debe coincidir exactamente con el configurado en el cliente RADIUS del MikroTik.


Paso 4: Agregar un usuario de prueba

-- Contraseña en texto claro (Cleartext-Password)
INSERT INTO radcheck (username, attribute, op, value)
VALUES ('testuser', 'Cleartext-Password', ':=', 'TestPass2026');

-- Asignar al grupo "pppoe-users"
INSERT INTO radusergroup (username, groupname, priority)
VALUES ('testuser', 'pppoe-users', 1);

Definir atributos de respuesta del grupo (pool de IPs):

INSERT INTO radgroupreply (groupname, attribute, op, value)
VALUES
  ('pppoe-users', 'Framed-Pool',        ':=', 'pool-clientes'),
  ('pppoe-users', 'Session-Timeout',    ':=', '86400'),
  ('pppoe-users', 'Idle-Timeout',       ':=', '3600');

Paso 5: Verificar FreeRADIUS en modo debug

Detener el servicio y correr en debug para ver el flujo completo:

systemctl stop freeradius
freeradius -X

En otra terminal, probar con radtest:

radtest testuser TestPass2026 127.0.0.1 0 testing123

Respuesta esperada:

Sending Access-Request of id 123 to 127.0.0.1 port 1812
        User-Name = "testuser"
        User-Password = "TestPass2026"
        ...
Received Access-Accept of id 123 from 127.0.0.1 port 1812
        Framed-Pool = "pool-clientes"
        Session-Timeout = 86400

Si obtienes Access-Accept, FreeRADIUS está operando correctamente. Iniciar el servicio:

systemctl enable --now freeradius

Paso 6: Instalar daloRADIUS

daloRADIUS es una interfaz web PHP para gestionar usuarios, NAS y revisar reportes de contabilidad.

Dependencias

apt install -y apache2 php php-mysql php-gd php-curl php-mail php-mail-mime \
               php-pear php-db libapache2-mod-php unzip curl

Descargar e instalar

cd /var/www/html
curl -LO https://github.com/lirantal/daloradius/archive/refs/heads/master.zip
unzip master.zip
mv daloradius-master daloradius
chown -R www-data:www-data /var/www/html/daloradius
chmod -R 755 /var/www/html/daloradius

Importar esquema adicional de daloRADIUS

mysql -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:

$configValues['FREERADIUS_VERSION'] = '3';
$configValues['DB_ENGINE'] = 'mysqli';
$configValues['DB_HOST'] = 'localhost';
$configValues['DB_PORT'] = '3306';
$configValues['DB_USER'] = 'radius';
$configValues['DB_PASS'] = 'RadiusP@ss2026';
$configValues['DB_NAME'] = 'radius';

VirtualHost de Apache (opcional, dominio dedicado)

Crear /etc/apache2/sites-available/daloradius.conf:

<VirtualHost *:80>
    ServerName radius.midominio.com
    DocumentRoot /var/www/html/daloradius

    <Directory /var/www/html/daloradius>
        Options -Indexes
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/daloradius_error.log
    CustomLog ${APACHE_LOG_DIR}/daloradius_access.log combined
</VirtualHost>
a2ensite daloradius
a2enmod rewrite
systemctl reload apache2

Acceder a http://192.168.1.10/daloradius con las credenciales por defecto:

CampoValor
Usuarioadministrator
Passwordradius

Cambiar la contraseña inmediatamente en Config → Operators → Manage Operators.


Paso 7: Configurar MikroTik como cliente RADIUS

En el RouterOS del MikroTik (PPPoE Server):

# Agregar el servidor RADIUS
/radius add \
    address=192.168.1.10 \
    secret=SecretShared123 \
    service=ppp \
    authentication-port=1812 \
    accounting-port=1813

# Activar uso de RADIUS en el perfil PPPoE
/ppp aaa set use-radius=yes accounting=yes

# Verificar
/radius print

Confirmar que el perfil de PPPoE apunta a RADIUS:

/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:

/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á:

Login OK: [testuser] (from client MikroTik-PPPoE port 0 via TLS tunnel)

En MikroTik verificar la sesión activa:

/ppp active print

En daloRADIUS ir a Accounting → Active Sessions para ver la sesión en tiempo real.


Atributos RADIUS útiles para PPPoE

Atributo RADIUSEfecto en MikroTik
Framed-PoolPool de IPs del que se asigna la dirección
Framed-IP-AddressIP fija para el usuario
Session-TimeoutTiempo máximo de sesión en segundos
Idle-TimeoutDesconexión por inactividad
Mikrotik-Rate-LimitLímite de velocidad (ej. 10M/10M)
Mikrotik-Address-ListAgrega la IP del usuario a una lista

Ejemplo para limitar velocidad a 10 Mbps simétrico via radgroupreply:

INSERT INTO radgroupreply (groupname, attribute, op, value)
VALUES ('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 secret del NAS no coincide entre MikroTik y la tabla nas.
  • El módulo SQL no está habilitado en authorize.
  • La contraseña en radcheck usa el operador incorrecto (debe ser :=, no ==).

daloRADIUS muestra error de conexión a DB

# Probar conexión directa
mysql -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:

/ppp aaa print
       use-radius: yes
       accounting: yes

Si accounting: no, los registros de sesión no se guardarán en radacct.


Consideraciones de seguridad

  • Usar un secret compartido 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-Password a MD5-Password o 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.