FreeRADIUS
O mecanismo padrão de autenticação PPPoE/Hotspot em ISP brasileiro — da arquitetura interna ao troubleshooting, com integração real MySQL + Mikrotik.
Nesta página
1. Contexto histórico e normativo
O protocolo RADIUS (Remote Authentication Dial-In User Service) foi criado em 1991 pela Merit Network para autenticação discada na NSFNET. Foi padronizado nas RFC 2865 (Authentication) e RFC 2866 (Accounting), e posteriormente estendido pela RFC 5176 (CoA/PoD) para controle de sessão ativa, e RFC 6614 (RadSec) para transporte sobre TLS.
O FreeRADIUS é a implementação open-source mais utilizada no mundo, citada em dezenas de RFCs como implementação de referência. No Brasil, tornou-se o padrão de fato em ISPs que usam PPPoE ou Hotspot com Mikrotik, combinado com MySQL/MariaDB para armazenamento de credenciais e registros de conexão — estes últimos com obrigação legal de guarda pelo Marco Civil (Art. 13).
2. Arquitetura interna e fluxo de processamento
O FreeRADIUS é baseado em uma arquitetura modular. Cada funcionalidade (autenticação SQL, LDAP, EAP, etc.) é implementada por um módulo (rlm_*.so). O daemon principal (radiusd) orquestra o processamento de cada pacote através de uma cadeia de módulos organizada em seções:
- authorize — verifica se o cliente (NAS) é conhecido, pré-processa o pedido.
- authenticate — valida as credenciais (senha, certificado, etc.).
- post-auth — ações pós-autenticação (ex.: gravar log, aplicar políticas).
- accounting — registra início, atualização e fim de sessão.
Os virtual servers (definidos em sites-available/) permitem rodar múltiplas políticas diferentes no mesmo daemon — por exemplo, um virtual server para PPPoE e outro para Hotspot, cada um com seu próprio fluxo de módulos. Isso é crucial para ISPs que oferecem serviços distintos.
3. Instalação (Debian/Ubuntu)
apt update
apt install freeradius freeradius-mysql freeradius-utils mariadb-server
# Confirma versão instalada (3.0.x é o padrão nas distros atuais)
freeradius -v
Nomenclatura de diretório: FreeRADIUS 2.x usava /etc/raddb/; a versão 3.0 (atual) usa /etc/freeradius/3.0/. Guias antigos ainda referenciam o caminho velho.
4. Arquivos de configuração principais
/etc/freeradius/3.0/radiusd.conf— configuração central do daemon (threads, logs, etc.)./etc/freeradius/3.0/clients.conf— cadastro dos NAS autorizados./etc/freeradius/3.0/mods-available/sql— conexão com banco de dados./etc/freeradius/3.0/mods-available/sqlippool— pool de IP dinâmico./etc/freeradius/3.0/sites-available/default— virtual server padrão./etc/freeradius/3.0/dictionary— mapeamento de atributos RADIUS.
5. Integração com MySQL/MariaDB
# Criar banco e usuário dedicado
mysql -u root -p
CREATE DATABASE radius;
CREATE USER 'radius'@'localhost' IDENTIFIED BY 'senha-forte-aqui';
GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost';
FLUSH PRIVILEGES;
EXIT;
# Importar schema padrão do FreeRADIUS
mariadb -u radius -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
Configuração do módulo SQL (mods-available/sql):
sql {
driver = "rlm_sql_mysql"
dialect = "mysql"
server = "localhost"
port = 3306
login = "radius"
password = "senha-forte-aqui"
radius_db = "radius"
pool {
start = 5
min = 4
max = 100
spare = 3
}
}
Habilitar o módulo:
ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/sql
# Em sites-available/default, descomentar "sql" nos blocos authorize {} e accounting {}
6. Schema — tabelas principais
| Tabela | Função |
|---|---|
| radcheck | Credenciais do usuário e atributos de checagem |
| radreply | Atributos devolvidos ao NAS após autenticação |
| radgroupcheck / radgroupreply | Mesma lógica, mas por grupo de usuários (planos) |
| radusergroup | Associação usuário ↔ grupo |
| radacct | Registro de accounting — início/fim de sessão, bytes trafegados |
-- Cadastrar usuário de teste
INSERT INTO radcheck (username, attribute, op, value)
VALUES ('cliente001', 'Cleartext-Password', ':=', 'senha123');
-- Limitar banda via atributo Mikrotik-Rate-Limit
INSERT INTO radreply (username, attribute, op, value)
VALUES ('cliente001', 'Mikrotik-Rate-Limit', ':=', '10M/10M');
7. Cadastro de NAS (clients.conf)
client mikrotik-borda-01 {
ipaddr = 10.0.0.1
secret = "segredo-forte-compartilhado"
shortname = borda-01
nas_type = other
}
O secret deve ser idêntico ao configurado no Mikrotik (seção 9). Divergência é a causa nº 1 de "Access-Reject sem motivo aparente".
8. Teste — radtest e modo debug
# Parar o serviço e rodar em primeiro plano com log verboso
systemctl stop freeradius
freeradius -X
# Em outro terminal, testar autenticação
radtest cliente001 senha123 localhost 0 segredo-forte-compartilhado
# Resposta esperada: Access-Accept
O modo debug (-X) é a ferramenta de diagnóstico mais importante — mostra cada módulo executado e o motivo exato de Accept/Reject.
9. Integração com Mikrotik RouterOS
/radius add service=ppp address=10.0.0.20 secret=segredo-forte-compartilhado \
authentication-port=1812 accounting-port=1813
/ppp aaa set use-radius=yes accounting=yes interim-update=5m
interim-update=5m balanceia precisão do accounting vs. volume de tráfego RADIUS.
10. CoA e PoD — controle de sessão ativa
CoA (Change of Authorization) altera atributos de uma sessão ativa. PoD (Packet of Disconnect) força o encerramento. Ambos usam a porta 3799/UDP (RFC 5176).
# Desconectar usuário remotamente
echo "User-Name=cliente001" | radclient -x 10.0.0.1:3799 disconnect segredo-forte-compartilhado
O daloRADIUS oferece interface web para essas funções, sem linha de comando manual.
11. Exemplos de políticas reais de ISP
| Cenário | Configuração |
|---|---|
| Plano de banda (10 Mbps) | Mikrotik-Rate-Limit := 10M/10M em radreply |
| Bloqueio por inadimplência | Remover entrada em radcheck (usuário inexistente → Access-Reject) ou usar atributo Auth-Type := Reject |
| Redirecionamento para portal de pagamento | Atributos WISPr-Redirection-URL ou Mikrotik-Advertise-URL (dicionário Mikrotik) |
| IP fixo por cliente | Framed-IP-Address := 10.0.0.100 em radreply |
12. Performance e dimensionamento
Para ISPs com milhares de assinantes, o gargalo geralmente está no banco de dados. Estratégias de otimização:
- Pool de threads — ajuste em
radiusd.confpara evitar filas. - Índices no MySQL — garantir índices em
username,groupname,acctstarttime. - Cache de sessão — módulo
rlm_cachereduz consultas repetidas ao banco. - Replicação MySQL — um slave dedicado para consultas de accounting, deixando o master para autenticação.
- Teste de carga — usar
radperf(parte do FreeRADIUS) ouradclientem loop para simular centenas de autenticações/segundo e medir tempos de resposta.
# Ajuste de threads (radiusd.conf)
thread pool {
start_servers = 10
max_servers = 64
min_spare_servers = 6
max_spare_servers = 20
max_queue_size = 131072
}
13. Monitoramento
Script para monitorar a saúde do FreeRADIUS e integrar com Zabbix/PRTG:
#!/bin/bash
# check_freeradius.sh — verifica se o RADIUS está respondendo
radtest monitor-user senha-monitor localhost 0 segredo-local
if [ $? -eq 0 ]; then
echo "OK: RADIUS respondendo"
exit 0
else
echo "CRITICAL: RADIUS não respondeu"
exit 2
fi
Monitore também: fila de autenticação (radiusd -X mostra o backlog), taxa de Accept/Reject (via log), e tempo de resposta via radclient com cronômetro.
14. Segurança
- Nunca usar o secret padrão (
testing123) em produção. - Restringir clients.conf a IPs específicos, nunca faixas amplas.
- RadSec (RADIUS sobre TLS) — usar quando o tráfego RADIUS atravessar redes não confiáveis. O FreeRADIUS suporta RadSec via módulo
rlm_radsec(RFC 6614). - Proteção contra brute-force — limitar tentativas consecutivas com
rlm_counterou firewall (fail2ban). - Senhas com hash — sempre que possível, usar PAP com hash (ex.: SHA1-Password) em vez de Cleartext-Password. PPPoE com CHAP/MSCHAP exige texto puro no RADIUS; nesse caso, restrinja o acesso ao banco.
15. Backup e recuperação
O que deve ser backupeado em um servidor FreeRADIUS:
- Banco de dados MySQL — contém credenciais, planos e registros de conexão (obrigação Marco Civil). Use restic ou Borg com dump prévio.
- Arquivos de configuração —
/etc/freeradius/(clients.conf, dictionary, mods-*, sites-*). - Schema do banco — embora recriável, é mais rápido ter um backup.
Teste de restauração: após restaurar os arquivos e o banco, execute radtest com um usuário de teste para validar. Conecte-se ao LGPD e à regra 3-2-1-1-0 para garantir que o backup do RADIUS atenda à exigência de recuperação.
16. Troubleshooting
Rodar freeradius -X (seção 8). Causas comuns: secret divergente entre NAS e clients.conf, usuário sem entrada em radcheck, senha errada.
Checar radreply/radgroupreply — nome de atributo incorreto (ex.: dicionário Mikrotik) gera esse sintoma silenciosamente.
Causado por interim-update mal configurado ou perda de Accounting-Stop. Job periódico pode fechar sessões órfãs.
Verificar se lease_duration (sqlippool) é maior que o Acct-Interim-Interval.
17. Glossário
18. Referências
- RFC 2865 — Remote Authentication Dial In User Service (RADIUS).
- RFC 2866 — RADIUS Accounting.
- RFC 5176 — Dynamic Authorization Extensions to RADIUS (CoA/PoD).
- RFC 6614 — Transport Layer Security (TLS) Encryption for RADIUS (RadSec).
- Documentação oficial FreeRADIUS (freeradius.org).
- NIST SP 800-63 — Digital Identity Guidelines (referência para autenticação).
- CGI.br — Cartilha de Segurança para Internet (boas práticas de autenticação).
- Páginas relacionadas: Conceitos de AAA, daloRADIUS, LGPD, Regra 3-2-1(-1-0).
Conteúdo técnico independente. Nenhum trecho é cópia literal de fonte de terceiro — comandos refletem a sintaxe funcional real do software.