Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, Hotspot e Wireless PSK/EAP (Lab Mikrotik/Ubiquiti)


Neste tutorial você irá aprender como integrar o freeradius 3.0.>16 para fazer autenticações PPPoE, Hotspot, Wireless PSK/EAP entre outras. Aprendendo mais sobre os atributos do banco de dados radius.

Para demonstrar irei criar um cenário ilustrativo de “nossa rede” com Mikrotik e Ubiquiti mas basicamente as autenticações podem serem para outras marcas. (Com algumas exceções para os atributos da Mikrotik)

Cenário ilustrativo

Vou tomar como base a instalação do FreeRadius no tutorial: (requisito)
Criando um servidor de autenticação com FreeRadius 3.0.x no Debian Buster

Entendo as tabelas do banco de dados

• nas
A tabela NAS contém dados de hosts clientes, seria uma “substituição” do arquivo clients.conf. É muito mais fácil alimentar os hosts clientes no banco de dados do que dentro do arquivo de configuração. Então quem do nosso cenário será vamos incluir nesta tabela? Todos os equipamentos que precisarem comunicar com seu servidor para de alguma forma fazer a autenticação. Para inserir os dados na tabela nas você pode usar o terminal ou então acessando o phpMyAdmin:
Os principais campos são:
‣ nasname: IP Adress (Único)
‣ shortname: Nome (Único)
‣ type: Tipo [other]
‣ secret: Sua “senha de autorização”
‣ description: Obs

Em nosso exemplo serão os dois concentradores e os APs das torres que serão inseridos em nossa tabela nas. Ex.:

Algo extremamente importa é que sempre que adicionar, editar ou apagar dados da tabela NAS é necessário reiniciar o serviço FreeRadius para atualizar os hosts clientes, está é a unica tabela que é necessário um restart no serviço.

Dando continuidade as demais tabelas:

• radcheck – Armazena os registo de cada usuário com os respectivos atributos associados. Exemplo o usuário vs senha, usuário vs MAC.

• radgroupcheck – Associa atributos a um determinado grupo de usuários.

• radgroupreply – Armazena os atributos que são devolvidos a todos os usuários de um grupo.

• radusergroup – Associa um usuário a um grupo (radgroupcheck/radgroupreply) simplificando os insert em suas tabelas.

• radreply – Contém lista de atributos enviados a um único usuário.

• radpostauth – Armazena informações acerca das respostas enviadas para os usuários (Desativada).

• radacct – Se encontra toda a informação de contabilização, é dela que você consultará por exemplo um extrato de conexões, descobrir qual IP estava sendo utilizado por um usuário.

Vamos começar configurando o RouterOS/Mikrotik para fazer autenticações PPPoE (Básico)

– Criamos uma pool chamada failover (pode ser qualquer nome) nesse primeiro momento. Mais a frente veremos como configurar usando a radippool.

– Criar um profile informando nossa pool, bem como DNS e velocidades. (Tudo isso migraremos para as tabelas mais a frente)

– Criamos o PPPoE Server em uma de suas interfaces que está ouvindo os roteadores que irão “discar”, bem como informando o profile que foi
criado.

– Configuramos os usuários para serem buscado do freeradius, bem como que que o intervalo de atualização das tabelas seja de 5min.

– Adicionamos nossa conexão o servidor radius informando os tipos de autenticações que serão utilizados.

Vamos autenticar nosso primeiro usuário o jose@provedor.com o “plano/profile” 50Mb. Para isso insira em seu banco de dados:

Agora configuro em nosso roteador que irá autenticar o pppoe-cliente, exemplo em um outro Mikroik:

Acessando seu concentrador já é possível ver nosso usuário jose@provedor.com autenticado:

Bom até aí nenhum mistério, mas é extremamente perigoso você ter um usuário em seu banco de dados radius sem nenhum outro atributo, pois o com apenas usuário e senha poderia ser feito qualquer autenticação sem exigir muito mais, conheço muitos sistemas que fazem isso!

Vamos supor que na conexão com o radius você tenha marcado login, e nos usuário tenha marcado para autenticar via radius (Já vi sistemas bem famosos fazerem isso!)


Vamos ao teste? Abra seu winbox e tente acessar seu router:

Bingo! Respiramos aliviado em ver que é apenas um usuário de leitura, mas não seria nada legal alguém acessar seu router, e além do mais esse usuário somente leitura em [AAA] –> Default Group poderia ter sido alterado para full e a M* estaria feita. Mas quem sabe você queira ter seus usuários do router no radius, então para isso precisamos pensar na segurança e adicionar outros atributos que prendam ele a este serviço. Veja como ficaria um exemplo seguro onde o atributo Service-Type prende o mesmo ao tipo Login-User, e na tabela radreply insira o atributo Mikrotik-Group informando qual o seu grupo de permissões (full/write/read/personalizada)

Da para melhorar isso? Claro! Podemos dizer que este usuário só pode ser acessado de um determinado IP, ex.: “180.255.3.33”

Também pode informar que este usuário só poderá acessar somente o IP deste concentrador

Agora que já aprendemos como deixar nosso login seguro, não podemos esquecer que os o jose@provedor.com ainda consegue logar no seu router, pois ele não tem nenhum outro atributo vinculado, entendeu o perigo? Isso que não chegamos na parte do WPA-EAP, ele poderia ser utilizado lá também.

Bom para nossa segurança vamos incluir os atributos Service-Type com valor Framed-User e Framed-Protocol com valor PPP

E porque não prender nosso usuário ao MAC Adress dele?

Fazendo um SELECT em nossa tabelas temos 4 atributos atrelado ao nosso usuário jose@provedor.com que deixam de certa foma muito mais seguro. Existe ainda o atributo Simultaneous-Use que falarei dele mais a frente.

Para que nosso controle de banda (queues) também seja configurado através do freeradius, o mikrotik possui uma bliblioteca Mikrotik-Rate-Limit.
Para demonstrar que realmente o jose@provedor.com não irá mais pegar os 50MB do profile irei colocar no valor 100Mb de Donw e 30 de Upload.

Desconecte o usuário jose@provedor.com para que as novas configurações sejam atribuidas:

E se a velocidade utilizar Burst? Exemplo você quer mandar no seu plano de de 10Mb Up/50Mb Down, uma experiencia que por 1 minuto ele tenha o dobro da velocidade.

Infelizmente o Mikrotik ainda não compreende o atributo Delegated-IPv6-Prefix (IPv6PD da LAN do cliente), no forum foram proposto algumas gambiarras pela própria mikrotik como criando script para deixar estatico os IPv6s (gambiarra que na maoria das vezes nada da certo dependendo do modelo do router) no entanto ele aceita os atributo Framed-IPv6-Prefix (IPv6 WAN) e o Mikrotik-Delegated-IPv6-Pool com o nome do da Pool que foi criada manualmente lá no seu router.

Lembrando q Delegated-IPv6-Prefix não funciona no Mikrotik (hj), oremos para que um dia seja implementado 😛 Ficaria assim:

Se você deseja saber mais acesse o tutorial:
Como entregar IPv6+IPv4 no Mikrotik/RouterOS através de PPPoE/DHCPv6 PD e registrando os logs em um banco de dados

Entregando os DNS pelo radius, lembra que em nosso profile configuramos para entregar 8.8.8.8 e 8.8.4.4? Vamos entregar agora ao usuário jose@provedor.com os DNS 1.1.1.1 e 9.9.9.9, para isso adicione a tabela radreply os atributos MS-Primary-DNS-Server e MS-Secondary-DNS-Server.

Fazendo um SELECT na tabelas radreply temos 4 atributos vinculados a configurações que serão entregue ao usuário jose@provedor.com.

Podemos dispensar as configurações feita no profile já que o controle de banda e DNS são entregues pelo radius? Sim, porém eu particularmente deixo os DNS como uma especie de “failover” caso não seja informado, apesar que no caso do Mikrotik se o DNS não estiver informado no Profile ele irá usar o DNS do router (/ip dns). Normalmente no concentrador PPPoE eu tenho apenas um profile qual é usado para todos PPPoE Servers onde altero o Rate Limit (rx/tx) para uma velocidade extremamente baixa (100k/100k), pois assim se algum usuário autenticar e não receber as configurações de banda do radius ele estará autenticando com velocidade ilimitada.

Iremos ver agora como buscar nosso IPv4 através da pool do radius, tabela radippool
Vamos inserir apenas 3 entradas para demonstrar sendo 3 de IPs Validos e 3 para bloqueios. No seu caso você irá inserir todos seus IPs um a um.

Agora para testarmos vamos remover primeiro o IP 180.255.0.150 que setamos para o usuário jose@provedor.com anteriormente, pois se você utilizar o atributo Framed-IP-Address ele terá prioridade a pool.

Para entregar ao usuário jose@provedor.com a pool_valido utilizaremos o atributo Pool-Name

Desconectamos nosso usuário para ver qual IP ele vai receber.

RouterOS

Radius

Podemos ver que o usuário jose@provedor.com recebeu o IP 45.250.3.129. Lembrando que esse endereço IP é entregue randomicamente, configurado lá no tutorial: Criando um servidor de autenticação com FreeRadius 3.0.x no Debian Buster
Se você quiser bloquear o cliente basta alterar sua Pool-Name para pool_bloq.

Talvez você esteja pensando: “Putz mas para cada usuário vai ter vários inserts!”. E é por isso que as tabelas radgroupcheck , radgroupreply e radusergroup existem para simplificar. É nela então que vamos criar nossos “planos”, onde podemos agrupar os atributos Service-Type, Framed-Protocol, Mikrotik-Rate-Limit, MS-Primary-DNS-Server e MS-Secondary-DNS-Server assim não sendo mais necessário informar para cada usuário.

Vamos então criar nosso Plano 10MB. Teremos um novo atributo que acho importante o uso, o Acct-Interim-Interval, ele se “equivale” ao interim-update=5m lá do mikrotik “/ppp aaa”, isso fará que se o mikrotik não atualizar os valores o freeradius solicite, em uma tradução simples é o tempo em que a tabela radacct é atualizada.

Aproveitando irei criar um Plano de bloqueio.

Para melhor entendimento e simplificar vamos apagar do usuário jose@provedor.com das tabelas radcheck e radreply.

Logo nossa radcheck precisa se preocupar com apenas de dois atributos Cleartext-Password (usuário vs senha) e Calling-Station-Id (usuário vs MAC), adicionamos então:

Se nesse momento o usuário conectar ele estaria sem um grupo e as configurações que estaria recebendo seriam as do profile do mikrotik (IP/DNS/Velocidade). Como fazer? Simples, você irá usar a tabela radusergroup onde você irá inserir o nome do usuário e qual o nome do grupo ele pertence. Muito mais simples não?!

Desconecte o usuário e verifique se o mesmo irá receber as novas configurações com base em grupos.
PPPoE Server: IP Randômico [OK] / Controle de Banda [OK]

PPPoE Cliente: IP [OK] / DNS [OK]

Agora para bloquear o usuário basta fazer um UPDATE trocando o plano do usuário para BLOQUEADO.

Desconectamos novamente e verificamos as configurações recebidas.

Podemos ver que nossas regras estão funcionado. Vale lembrar que se for bloquear um usuário qual esteja com o atributo Framed-IP-Address onde você setou um IP fixo para o mesmo será necessário remover, caso contrario o cliente não irá receber o IP da faixa bloqueada.

Qualquer atributo que você queira que sobrescreva a radusergroup basta adicionar diretamente nas tabelas, como é o exemplo do IP fixo, vamos supor que um determinado usuário queira receber um DNS personalizado, basta adicionar o usuário dele na radreply.

Vamos ver como estão nossas tabelas até o momento:

Simultaneous-Use

Existe um atributo chamado Simultaneous-Use qual você pode limitar o número de vezes que aquele usuário pode autenticar, aplicando na radgroupcheck ficaria:

Porém para funcionar o Simultaneous-Use é necessário ajustes em dois arquivos:
– /etc/freeradius/3.0/sites-enabled/inner-tunnel
– /etc/freeradius/3.0/sites-enabled/default
Incluindo dentro de session o valor radutmp

Mas é extremamente importante você saber que qualquer falha de comunicação entre o roteador e o servidor a conexão ira ficar “pendurada“, como vimos na radacct todas as conexões são registradas lá, logo quando um cliente está conectado o campo de stop ainda não foi atualizado, então imagine que seu router sofreu uma falha elétrica e desligou, logo nenhuma informação será enviada para o servidor deixando todas as conexões em aberta, ao iniciar novamente o roteador todos usuários não irão conseguir logar, pois já existe uma conexão. Resumindo se você não estiver preparado para esse tipo de situação é melhor não utiliza-lo. Eu costumo deixar no pppoe server a opção one-session-per-host=yes assim apenas um login pode acessar (que vai fazer a mesma coisa) o ponto negativo é que em distintos concentradores seria possível logar. Mas se você é um cara inteligente você facilmente monta um script para verificar se o existe por exemplo dois usuários iguais na radippool vindo de diferentes nasipaddress e podendo executar uma ação, ex envia um alerta de gatonet 😛

radippool Duplicando IPs

Um outro ponto frequente que me perguntam é sobre a radippool e o problema com duplicidades de IPs. Sim existia alguns problemas em versões mais antigas. Como no caso de uma falha elétrica ou um rompimento irá causar falha de comunicação entre servidor e concentrador. Após a versão 3.0.16 o freeradius teve alguma melhorias. Na radippool existe um campo chamado expiry_time que por padrão é de 1 hora.

Lembra que configuramos o interim-update no mikrotik e Acct-Interim-Interval na tabela radgroupreply qual montamos o “plano” com valores de 5 minutos? Logo o valor de expiry_time sempre será atualizado a cada 5 min (acrecentando o valor do lease_duration) e o prazo de expiração passará ser de +1h, porém se a falta de comunicação for por um curto tempo inferior à 1h e o mesmo usuário reautenticar ele vai manter o IP antigo pois ele ainda não expirou, e o usuário vai receber um novo IP, então o IP antigo só irá sair da tabela na próxima vez que o usuário autenticar e o prazo for maior que 1h, sabemos que uma nova autenticação pode até levar dias para acontecer novamente, e quando der um problema normalmente são muitos usuários, e com isso nossa tabelas de ips acabará facilmente ficando sem IPs livres na pool.

Oque fazer então? Este tempo pode ser ajustado no arquivo /etc/freeradius/3.0/mods-available/sqlippool na variável lease_duration = 3600, eu irei alterar para 10 min, assim será dificil algum usuário autenticar sem remover seu antigo IP alocado. Mas você pode ajustar de acordo com suas necessidades/realidade.

Algo que você pode criar é uma rotina com um script de sua linguagem preferia, fazendo um simples select na radippool e verifica se existe dois usuários, e tomando uma ação.

Porém é interessante você ajustar as querys em /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf Eu levei um bom tempo para deixar isso funcionando de forma que não tivesse mais dor de cabeça, (não irei compartilhar pois é algo que é bem para minha realidade, mais pode me chama no telegram @remontti)

Uma solução simples que encontrei para resolver isso no passado foi criar um script executado a cada 5 min no concentrador PPPoE, onde ele verifica se a conexão com o IP do servidor freeradius está respondendo, e caso não responda ele desative/ative os pppoe-servers fazendo com que os clientes desconectem (Na minha situação quando o concentrador não tem comunicação com o freeradius o cliente também não tem) assim quando estabilizar a comunicação todos irão reautenticar novamente. Tenho isso até hoje, confesso que me sinto mais confortável, caso deseje saber como ele é segue o script:

Altere 180.255.0.3 para o IP do seu servidor Freeradius. O script vai disparar 10 ping e caso não responde ele irá então desativar e ativar todos os pppoe-server. Lembre-se de não pode nenhum firewall bloqueando ICMP.

Personalizando a alocação dos IPS para escolher uma Pool padrão quando esgotar uma Pool-Name. Opcional

Ao término de uma pools na maioria dos casos (provedores) subentender-se que acabou os IPs válidos e será necessários entregar IPs inválidos para fazer o CGNAT. Então porque não ajustar o allocate_find para que se caso uma Pool-Name não contenha mais IPs disponível ela lhe entregar os de uma nova Pool? Bom vale lembrar para nunca deixar a pool de bloqueio/aviso/etc faltar IPs pois se isso acontecer o cliente vai receber um IP de CGNAT. Eu particularmente gosto assim, quanto menos informação no roteador mais controle se tem.

Se desejar fazer isso vamos editar o /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf.

Comentando as linhas atuais da variável allocate_find:

E adicionando as seguintes: (Perceba que o nome da pool alternativa/failover/backup é pool_cgnat)

Lembre-se que toda a ateração nos arquivos de configurações é necessário reiniciar o serviço.

Você vai precisar adicionar agora todos seus IPs de CGNAT (cgnat.sql) ex.:

Agora em seu laboratório você pode deixar apenas 1 IP válido e autenticar mais usuários para ver se a regra funcionou.

Autenticação Wireless

Conheço muitos provedores que tem apenas uma senha para todos seus POPs, ou uma diferente para cada, mas são fixas e isso é muito perigoso!!!
Vamos pensar agora só pelas piores possibilidades OK? Imagine um funcionário seu que saiu da sua empresa sabendo a senha de todas as setoriais de suas torres. Imaginou? Você pode até me dizer: “-Grande coisa ele não vai saber meus usuários e senhas dos PPPoE.” Realmente ele pode não saber (mas eu nem estou preocupado com isso, pois eu prendo usuário ao MAC, agora se seu sistema não faz isso pode brotar uns gatinhos ai na rede) mas o que realmente me preocupa é o fato das “malvadezas” que podem serem feitas, vamos para primeira? Pego um NanoStation e conecto em sua setorial (para piorar essa setorial esta em bridge com mais alguma coisa… quem sabe com toda a rede?), agora que estou “dentro” da rede posso criar um pppoe-server e autenticar todas as solicitações (é só configurar para ignorar as senhas) toda vez q um um cliente solicita uma conexão um pacote broadcast é enviado na rede e quem responde primeiro ganha, posso ainda gerar um alto trafego (DDoS) bagunçar. Ai você me diz: “-Mas aqui na minha cidade o pessoal nem sabe fazer isso.” Realmente, mas se esse infeliz agora pegar e conectar outro NanoStation e interligar um NanoStation no outro? Precisa ser inteligente para fazer isso? (Putz posso estar dando idéias, não faça isso com seu concorrente) Um loop esta feito, e toda essa rede vai parar de funcionar. (Conheco uma galera que usa ONUs na sua rede GPON em brid e esquece isso da para fazer também)… Parei se não vou acabar ser acusado, mas o que quero alertar é que existe uma infinidade de possibilidades ao deixar uma pessoa maliciosa conectar em sua rede.

WPA-PSK

É por isso que uma autenticação com o radius para sua rede wireless é o melhor caminho. Como isso funciona? Para cada dispositivo/antena que for conectar você terá uma senha exclusiva só para ela, vou começar explicando como fazer isso com senhas PSK com o atributo Mikrotik-Wireless-PSK da Mikrotik.

Com base no nosso diagrama da rede vamos ver como seria para autenticar o usuário joao@provedor.com, primeiramente vamos configurar nosso AP-Mikrotik.

Crie um novo profile de segurança

Configurando a interface wireless “wlan1” setamos o security-profile para WPA2-PSK-Radius que acabamos de criar e darei o nome do sinal (ssid) de SSID-PSK-Radius.

Fizemos a nossa conexão com o radius, informando que vamos usar neste caso apenas o serviço wireless.

Não esqueça que sempre que adicionar um novo autenticador ao seu servidor é necessário que o mesmo seja adicionado a tabela NAS e restartado o freeradius, ex:

Para você que está estudando é sempre deixar o radius parado e rado-lo em modo debug com o comando freeradius -X e observar tudo que rola. Para minha bancada estou usando um mikrotik hAp e vou tentar conectar meu celular, sem cadastrar nada no radius ainda, logo em algumas linhas veremos o seguinte:

Podemos observar que chegaram informações como o nome da interface wireless NAS-Port-Id = “wlan1”, o tipo da autenticação NAS-Port-Type = Wireless-802.11, o mac do dispositivo User-Name = “44:45:4D:45:4B:4D”, o nome do sinal Called-Station-Id = “SSID-PSK-Radius”, o nome da router (system -> identity) NAS-Identifier = “MikroTik”, e o IP NAS-IP-Address = 10.1.0.4.

Com base nessas informações vamos alimentar nossa base de dados, e é claro que pensando na segurança! Lembra criar usuário sem prender ele a outros atributos é um perigo!

Primeiro atributo então é os Mikrotik-Wireless-PSK que vamos gravar na radreply, logo nosso usuário será nosso MAC. (Estou usando o MAC Format lá do profile separado por dois pontos, mas se necessário para sua aplicação existe outros formatos "XX XX XX XX XX XX" XX-XX-XX-XX-XX-XX XX:XX:XX:XX:XX:XX XXXX:XXXX:XXXX XXXXXX-XXXXXX XXXXXX:XXXXXX XXXXXXXXXXXX)

Na radcheck vamos então primeiro autorizar a autenticação Auth-Type (Se só gravar isso na tabela seria um perigo pois você esta autorizando esse MAC que é um usuário a autenticar mesmo sem senha) e é por isso que vamos definir que NAS-Port-Type vai ser Wireless-802.11m assim esse user só pode autenticar vindo de uma conexão wireless, e por ultimo você também pode informar que ele só irá poder conectar no SSID com nome “SSID-PSK-Radius”.

Seria ainda possível prender ao Identity (NAS-Identifier) do MK, bem como o IP dele (NAS-IP-Address), mas eu acho mais complicado, mas é possível! Caso você queira que o cliente consiga se conectar em qualquer sinal basta não gravar o atributo Called-Station-Id.

WPA-EAP

No mikrotik:
Crie um novo profile de segurança, para diferenciar usarei o mac-format=XXXXXXXXXXXX. Vale lembrar que tem outras formas de configurar o EAP, mas para nosso lab podemos subi-lo da forma mais simples.

Ajuste sua interface

Conecte ao radius.

No Ubiquiti (Não tem suporte PSK com Radius):

No EAP não é necessariamente ser o MAC o usuário, mas fica mais pratico até para programar, logo precisamos de um usuário e senha e prender ele ao tipo EAP. Eu particularmente NÃO uso EAP no mikrotik, por mais que PSK seja mais facil quebrar com o uso do radius fica muito complicado, e além do mais fica exclusivo ao MAC, já no EAP poderá autenticar com a mesma senha em vários dispositivos.

Inseremos então nosso user EAP no banco de dados.

Hotspot

Vamos falar primeiro do módulo contador (sqlcounter). O módulo sqlcounter permite um contador de pacotes usando registros contábeis gravados no banco de dados.

Com este módulo é possível criar alguns cenários de interessantes no mundo do Hotspot, exemplo:
– limitar o tempo de conexão (ex.: 2h por dia/mês/único vez)

Se desejar habilite o mod sqlcounter.

Adicione em instantiate {…} dailycounter, monthlycounter e noresetcounter do arquivo /etc/freeradius/3.0/radiusd.conf

Adicione em authorize {…} dailycounter, monthlycounter e noresetcounter do arquivo /etc/freeradius/3.0/sites-enabled/default

Restart o freeradius

Aproveitando o Mk hAp do nosso Lab vou criar um hotspot server.

Com o comando /ip hotspot setup demos um inicio a um “wizard” que fará toda as configurações automaticamente.

Remova o usuário admin criado no wizard, defina o porfile para usar o radius e na conexão com o radius marque hotspot.

Caso você ira programar um sistema para fazer cadastro lembre-se de liberar o IP do servidor em walled-garden, assim não é necessário estar autenticado para o usuário acessar-la. Ex onde seria no mesmo serivor, irei permitir a consultas de DNS també.

Com nosso AP configurado acessamos:

Vou tentar logar com tadeu@remontti.com.br com qualquer senha e visualizar no freeradius -X (debug) o que chega lá:

Vimos que chegaram alguns valores interessantes, podemos fazer filtro com MAC Calling-Station-Id = “44:45:4D:45:4B:4D”, nome do serviço do hotspot Called-Station-Id = “hotspot1”, nome da interface, nome da interface NAS-Port-Id = “wlan1” entre outros.

Agora criamos nosso usuário na tabela radcheck.

Vamos ao teste:

100% funcionando, agora que já conhecemos os outros comandos poremos prender o usuário ao NAS-Port-Type para Wireless-802.11, criando um grupo, já vou criar 4 grupos “planos”.
1º – Plano 30 minutos ao diários – Velocidade 2Mb/8Mb
3º – Plano 7 horas por mês – Velocidade 3Mb/10Mb
2º – Plano 2 Horas unica – Velocidade 8Mb/20Mb
4º – Plano Ilimitado – Velocidade 10Mb/30Mb

Agora vamos vincular o usuário a um grupo.

No caso dos planos com contabilidade de tempo ao término do seu tempo o login não conseguirá mais logar. Essas verificação de tempo é realizada na bom base na tabela radacct.

Um dica final é: Nunca use o mesmo freeradius para PPPoE e Hotspot, crie servidores separados, pois é muito fácil de bagunçar e qualquer inser feita indevida você pode está deixando uma brecha de segurança.

Bônus – Logs: Framed-IPv6-Prefix e Delegated-IPv6-Prefix

Só realize isso em versões antigas do freeradius, a versão do freeradius no Debian 11 por exemplo já foram implementadas as tabelas para registro de IPv6.

Em algumas autenticações (Ex accel-ppp) passam os valores de IPv6, para poder registrar os mesmo serão necessários criar os campos na radacct e ajustar o arquivo de queries.

Crie dois campos framedipv6prefix e delegatedipv6prefix

Agora ajuste as queries em queries.conf

Vou destacar as linhas que foram alteradas, ajuste seu arquivo: (linhas 208,262-264,292-294,331-333,382-384)

Espero que tenha aprendido um pouco mais de como o FreeRadius funciona.

Curtiu o conteúdo? Quer me ajudar? 🙂

Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento! (Esse deu trabalho!)

Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.

Participe do canal no telegram para ficar atualizado sempre que publicar um novo tutorial.

Abraço!

Fontes:
https://wiki.freeradius.org/guide/SQL-HOWTO
https://wiki.freeradius.org/modules/Rlm_sql
https://wiki.freeradius.org/modules/Rlm_sqlippool
https://wiki.freeradius.org/modules/Rlm_sqlcounter

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

15 Resultados

  1. Leandro disse:

    Boa noite, eu vi no radiusnet se não me engano, uma função onde o radius deles aceita conexões com usuario/senha invalidos e jogam essas conexoes para uma address-list com nome por exemplo “usuarios_invalidos” nome só de exemplo, com isso não enxe o log no mikrotik por exemplo com falhas de conexões, é possivel fazer isso ?
    Pensei em criar um script php pra buscar as conexoes no banco de dados com status de reject e inserir no mysql, mas se tiver como fazer isso direto pelo radius seria bem legal

  2. Pedro disse:

    Boa noite Rumidar

    Em primeiro lugar quero felicitar pelo exelente tutorial, segui os passos em um servidor ubuntu 20.04 e funcionou 100%, fiz umas pequenas alteracões, estou usando o NAS table pra conectar com o radius do mikrotik, pra isso tive que desabilitar o clients.conf dentro do radius.conf e setar o restante da config no arquivo default.conf

    Consigo autenticar 100% e navegar tranquilo, porém só está armazenando os logs no radipool de entrada hora e data de conexão etc.. no radacct não está armazenando os dados na tabela radacct quando o usuário desconecta e autentica de novo, queria efetuar o armazenamento desses dados e estatisticas, sabe informar se tem que executar mais algum passo ? ou deveria efetuar os logs automáticamente?

    na seccão accounting tenho salvo lá sql e detail como manda no manual do freeradius mas não está logando, no debug freeradius -X eu consigo ver o modulo carregando a inforamcão da tabela radacct

    # Loading module “sql” from file /etc/freeradius/3.0/mods-enabled/sql.conf
    sql {
    driver = “rlm_sql_mysql”
    server = “localhost”
    port = 3306
    login = “radius”
    password = <<>>
    radius_db = “radius”
    read_groups = yes
    read_profiles = yes
    read_clients = yes
    delete_stale_sessions = yes
    sql_user_name = “%{User-Name}”
    logfile = “/var/log/freeradius/radacct/sql.log”
    default_user_profile = “”
    client_query = “SELECT id, nasname, shortname, type, secret, server FROM nas”
    authorize_check_query = “SELECT id, username, attribute, value, op FROM radcheck WHERE username = ‘%{SQL-User-Name}’ ORDER BY id”
    authorize_reply_query = “SELECT id, username, attribute, value, op FROM radreply WHERE username = ‘%{SQL-User-Name}’ ORDER BY id”
    authorize_group_check_query = “SELECT id, groupname, attribute, Value, op FROM radgroupcheck WHERE groupname = ‘%{SQL-Group}’ ORDER BY id”
    authorize_group_reply_query = “SELECT id, groupname, attribute, value, op FROM radgroupreply WHERE groupname = ‘%{SQL-Group}’ ORDER BY id”
    group_membership_query = “SELECT groupname FROM radusergroup WHERE username = ‘%{SQL-User-Name}’ ORDER BY priority”
    simul_count_query = “SELECT COUNT(*) FROM radacct WHERE username = ‘%{SQL-User-Name}’ AND acctstoptime IS NULL”
    simul_verify_query = “SELECT radacctid, acctsessionid, username, nasipaddress, nasportid, framedipaddress, callingstationid, framedprotocol FROM radacct WHERE username = ‘%{SQL-User-Name}’ AND acctstoptime IS NULL”
    safe_characters = “@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_: /”
    auto_escape = no
    accounting {
    reference = “%{tolower:type.%{%{Acct-Status-Type}:-%{Request-Processing-Stage}}.query}”
    type {
    accounting-on {
    query = “UPDATE radacct SET acctstoptime = FROM_UNIXTIME(%{integer:Event-Timestamp}), acctsessiontime = ‘%{integer:Event-Timestamp}’ – UNIX_TIMESTAMP(acctstarttime), acctterminatecause = ‘%{%{Acct-Terminate-Cause}:-NAS-Reboot}’ WHERE acctstoptime IS NULL AND nasipaddress = ‘%{NAS-IP-Address}’ AND acctstarttime <= FROM_UNIXTIME(%{integer:Event-Timestamp})"
    }
    accounting-off {
    query = "UPDATE radacct SET acctstoptime = FROM_UNIXTIME(%{integer:Event-Timestamp}), acctsessiontime = '%{integer:Event-Timestamp}' – UNIX_TIMESTAMP(acctstarttime), acctterminatecause = '%{%{Acct-Terminate-Cause}:-NAS-Reboot}' WHERE acctstoptime IS NULL AND nasipaddress = '%{NAS-IP-Address}' AND acctstarttime <= FROM_UNIXTIME(%{integer:Event-Timestamp})"
    }
    start {
    query = "INSERT INTO radacct (acctsessionid, acctuniqueid, username, realm, nasipaddress, nasportid, nasporttype, acctstarttime, acctupdatetime, acctstoptime,acctsessiontime, acctauthentic, connectinfo_start, connectinfo_stop, acctinputoctets, acctoutputoctets, calledstationid, callingstationid, acctterminatecause, servicetype, framedprotocol, framedipaddress, framedipv6address, framedipv6prefix, framedinterfaceid, delegatedipv6prefix) VALUES ('%{Acct-Session-Id}', '%{Acct-Unique-Session-Id}', '%{SQL-User-Name}', '%{Realm}', '%{NAS-IP-Address}', '%{%{NAS-Port-ID}:-%{NAS-Port}}', '%{NAS-Port-Type}', FROM_UNIXTIME(%{integer:Event-Timestamp}), FROM_UNIXTIME(%{integer:Event-Timestamp}), NULL, '0', '%{Acct-Authentic}', '%{Connect-Info}', '', '0', '0', '%{Called-Station-Id}', '%{Calling-Station-Id}', '', '%{Service-Type}', '%{Framed-Protocol}', '%{Framed-IP-Address}', '%{Framed-IPv6-Address}', '%{Framed-IPv6-Prefix}', '%{Framed-Interface-Id}', '%{Delegated-IPv6-Prefix}')"
    }
    interim-update {
    query = "UPDATE radacct SET acctupdatetime = (@acctupdatetime_old:=acctupdatetime), acctupdatetime = FROM_UNIXTIME(%{integer:Event-Timestamp}), acctinterval = %{integer:Event-Timestamp} – UNIX_TIMESTAMP(@acctupdatetime_old), acctstoptime = NULL, framedipaddress = '%{Framed-IP-Address}', framedipv6address = '%{Framed-IPv6-Address}', framedipv6prefix = '%{Framed-IPv6-Prefix}', framedinterfaceid = '%{Framed-Interface-Id}', delegatedipv6prefix = '%{Delegated-IPv6-Prefix}', acctsessiontime = %{%{Acct-Session-Time}:-NULL}, acctinputoctets = '%{%{Acct-Input-Gigawords}:-0}' << 32 | '%{%{Acct-Input-Octets}:-0}', acctoutputoctets = '%{%{Acct-Output-Gigawords}:-0}' << 32 | '%{%{Acct-Output-Octets}:-0}' WHERE AcctUniqueId = '%{Acct-Unique-Session-Id}'"
    }
    stop {
    query = "UPDATE radacct SET acctstoptime = FROM_UNIXTIME(%{integer:Event-Timestamp}), acctsessiontime = %{%{Acct-Session-Time}:-NULL}, acctinputoctets = '%{%{Acct-Input-Gigawords}:-0}' << 32 | '%{%{Acct-Input-Octets}:-0}', acctoutputoctets = '%{%{Acct-Output-Gigawords}:-0}' << 32 | '%{%{Acct-Output-Octets}:-0}', acctterminatecause = '%{Acct-Terminate-Cause}', connectinfo_stop = '%{Connect-Info}' WHERE AcctUniqueId = '%{Acct-Unique-Session-Id}'"
    }
    }
    }
    post-auth {
    reference = ".query"
    logfile = "/var/log/freeradius/post-auth.sql"
    query = "INSERT INTO radpostauth (username, pass, reply, authdate) VALUES ( '%{SQL-User-Name}', '%{%{User-Password}:-%{Chap-Password}}', '%{reply:Packet-Type}', '%S')"
    }
    }
    rlm_sql (sql): Driver rlm_sql_mysql (module rlm_sql_mysql) loaded and linked

    porém não está logando os dados.. alguma dica a ser verificada nas configs?

  3. Ramon disse:

    Qual comando para desconectar o PPPoE? Exemplo ele está online, e quero derrubar para que reconecte…

  4. Top mais uma vez os tutoriais. gostaria de saber, em caso de um problema na rede com o servidor radius da rede, gostaria de criar um que aceita todas as requisições que ele receber. Poderia me informar aonde configuro para ele aceitar todas as requisições que receber?

  5. Anderson disse:

    Como sempre TOP seus artigos. Uma dúvida, como desconectar o usuário no concentrador automaticamente após exclui-lo da tabela radcheck. Sem fazer manualmente no concentrador?

  6. Eder Zavoli disse:

    Primeiro ótimo artigo, muito didático!
    Segundo, gostaria de contribuir, no meu caso adicionei o atributo Framed-IPv6-Pool, pois assim será possível enviar a pool para a WAN do cliente (roteador).

    Algo como:
    INSERT INTO radreply (id, username, attribute, op, value) VALUES
    (NULL, ‘jose@provedor.com’, ‘Framed-IPv6-Pool’, ‘=’, ‘nome_da_pool6’);

  7. Paulo Roberto Tomasi disse:

    Excelente artigo!

    Estou começando os estudos aqui, utilizando daloRADIUS como frontend para gerenciar os inserts/removes/updates no MySQL, achei mais fácil que o terminal do Linux rss

    Mas… conforme você disse, ao inserir um novo NAS é mandatório entrar no Linux no reiniciar o serviço do FreeRADIUS (se bem que já sugeriram um código PHP para reiniciar o serviço através do daloRADIUS, parece interessante)

    Uma dúvida: é possível utilizar o mesmo servidor FreeRADIUS para controlar os acessos ao Winbox (usuários Read, Write, Full) e também para autenticar clientes PPPoE/Hotspot/Wireless?

  8. Thiago Lima disse:

    Olá, tudo bem? Queria agradecer pelo post, show de bola!! =D

    E queria fazer uma pergunta, uma vez vi em algum lugar que é possível setar velocidades diferentes para os planos em horários específicos. Por exemplo: das 1-7hrs da manhã o PLANO_X terá 100m/200m e nos outros horários ele tem 50m/100m.

    Isso é possível via Radius ou é necessário outra ferramenta?

    Att

  9. Walisson Gois disse:

    Ola, bom dia meu amigo, Tudo na paz ? Queria lhe fazer uma pergunta e avaliar uma possibilidade. É possível o servidor radius autenticar o usuario em um router e em outro router fazer o controle de banda ?

  10. Sergio Souza disse:

    Artigo excelente Remontti, como todos os outros. Só queria fazer um pequeno alerta sobre o comentário a respeito do Burst.

    [quote]E se a velocidade utilizar Burst? Exemplo você quer mandar no seu plano de de 10Mb Up/50Mb Down, uma experiencia que por 1 minuto ele tenha o dobro da velocidade.[/quote]

    Conceitualmente o Burst não funciona dessa forma por ser estatístico. ( ref.: https://wiki.mikrotik.com/wiki/Manual:Queues_-_Burst ).
    Normalmente em todos sistemas ele segue esse padrão estatístico.

    Desta forma o tempo de burst em si é um tempo T qualquer até que uma próxima rodada do algorítimo encontrar um valor de Burst Threshold igual ou maior que o Max Limit (CIR), onde o Burst Limit é cancelado e passa a vigorar apenas o Max Limit.
    No Mikrotik RouterOS o tempo entre as rodadas do algorítimo é o 1/16 do Burst Time.

    • Obrigado Sergio. Sempre fiz o cálculos com essa tabelinha aqui.

      Testei em bancada e funciona 100%

  1. 19 de maio de 2021

    […] seja um tempo menor, para não ter duplicidades de ips. Falo sobre isso no tutorial https://blog.remontti.com.br/4085 recomendo a […]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *