Você está na página 1de 67

Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.

br/4085

Gerador de Senhas
Meu IPv4
Meu IPv6
Converter Bytes
Gerador de CGNAT
Arquivos

Github

LINUX / MIKROTIK / TUTORIAIS / TUTORIAIS  14 SIGA:     

PRÓXIMO HISTÓRIA

Entendendo o funcionamento Servidor Looking Glass simples e


rápido!

do FreeRadius e fazendo HISTÓRIA ANTERIOR

Criando um servidor de autenticação

autenticações PPPoE, Hotspot e


 com FreeRadius no Debian 10 Buster
(Extra sqlippool)

Wireless PSK/EAP (Lab DOAÇÃO PARA O CAFÉ!

1 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

Mikrotik/Ubiquiti)
POR RUDIMAR REMONTTI · PUBLISHED 13 DE MARÇO DE 2020 · UPDATED 19 DE MAIO DE
2021

Ouvir tutorial
GITHUB

TELEGRAM (CONTATOS)

GRUPO DE AJUDA:
@remontticombr
CANAL:
Neste tutorial você irá aprender como integrar o freeradius 3.0.>16 para @blogremontti

fazer autenticações PPPoE, Hotspot, Wireless PSK/EAP entre outras. PESSOAL:


@remontti
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)

2 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

Cenário ilustrativo
1 # Servidores
2 FreeRadius: 180.255.0.3
3
4 # Concentradores
5 MK HotSpot: 180.255.1.1
6 MK PPPoE: 180.255.1.3
7
8 # Torre 1
9 UBNT AP1 WPA EAP: 10.0.0.2
10 UBNT AP2 WPA EAP: 10.0.0.3
11 UBNT AP3 WPA EAP: 10.0.0.4
12
13 # Torre 2
14 MK AP1 WPA PSK: 10.1.0.2
15 MK AP2 WPA PSK: 10.1.0.3
16 MK AP3 WPA PSK: 10.1.0.4

3 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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

4 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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 con�guraçã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.:

1 INSERT INTO `nas` (`nasname`, `shortname`, `type`, `ports`, `secret`, `server


2 -- Mikrotik PPPoE Server --
3 ('180.255.1.1', 'RB-RouterOS-PPPoE', 'other', NULL, 'SEU_SECRET', NULL, NULL,
4 -- Mikrotik Hotspot Server --
5 ('180.255.1.3', 'RB-RouterOS-HotSpot', 'other', NULL, 'SEU_SECRET', NULL, NULL
6 -- Torre Ubiquiti --
7 ('10.0.0.2', 'UBNT-AP-A', 'other', NULL, 'SEU_SECRET', NULL, NULL, 'U-POP1-A'
8 ('10.0.0.3', 'UBNT-AP-B', 'other', NULL, 'SEU_SECRET', NULL, NULL, 'U-POP1-B'
9 ('10.0.0.4', 'UBNT-AP-C', 'other', NULL, 'SEU_SECRET', NULL, NULL, 'U-POP1-C'
10 -- Torre Mikrotik --
11 ('10.1.0.2', 'MK-AP-A', 'other', NULL, 'SEU_SECRET', NULL, NULL, 'M-POP2-A'),
12 ('10.1.0.3', 'MK-AP-B', 'other', NULL, 'SEU_SECRET', NULL, NULL, 'M-POP2-B'),
13 ('10.1.0.4', 'MK-AP-C', 'other', NULL, 'SEU_SECRET', NULL, NULL, 'M-POP2-B');

5 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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.

1 # systemctl restart freeradius

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) simpli�cando 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

6 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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 con�gurar usando a
radippool.

1 /ip pool
2 add name=failover ranges=100.100.100.0/23

– Criar um pro�le informando nossa pool, bem como DNS e velocidades.


(Tudo isso migraremos para as tabelas mais a frente)

1 /ppp profile
2 add dns-server=8.8.8.8,8.8.4.4 local-address=180.255.1.1 name=Profile50M rate-limit

– Criamos o PPPoE Server em uma de suas interfaces que está ouvindo


os roteadores que irão “discar”, bem como informando o pro�le que foi
criado.

1 /interface pppoe-server server


2 add authentication=pap,chap disabled=no keepalive-timeout=30 service-name=pppoe

– Con�guramos os usuários para serem buscado do freeradius, bem


como que que o intervalo de atualização das tabelas seja de 5min.

1 /ppp aaa

7 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

2 set interim-update=5m use-radius=yes

– Adicionamos nossa conexão o servidor radius informando os tipos de


autenticações que serão utilizados.

1 /radius
2 add address=180.255.0.3 secret="SEU_SECRET" service=ppp

Vamos autenticar nosso primeiro usuário o jose@provedor.com o


“plano/pro�le” 50Mb. Para isso insira em seu banco de dados:

1 INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES


2 ('jose@provedor.com', 'Cleartext-Password', ':=', 'senha_do_usuario');

Agora con�guro em nosso roteador que irá autenticar o pppoe-cliente,


exemplo em um outro Mikroik:

1 /interface pppoe-client
2 add add-default-route=yes disabled=no interface=ether1 name=pppoe-out1 password

Acessando seu concentrador já é possível ver nosso usuário


jose@provedor.com autenticado:

8 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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!)

1 /radius
2 add address=180.255.0.3 secret="SEU_SECRET" service=ppp,login
3 /user aaa
4 set use-radius=yes

9 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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

10 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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 �caria 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)

1 INSERT INTO `radcheck` (`id`, `username`, `attribute`, `op`, `value`) VALUES

11 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

2 (NULL, 'usuario_router', 'Cleartext-Password', ':=', 'senha_do_usuario'),


3 (NULL, 'usuario_router', 'Service-Type', '==', 'Login-User');
4
5 INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES
6 (NULL, 'usuario_router', 'Mikrotik-Group', ':=', 'full');

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

1 INSERT INTO `radcheck` (`id`, `username`, `attribute`, `op`, `value`) VALUES


2 (NULL, 'usuario_router', 'Calling-Station-Id', '==', '180.255.3.33');

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


deste concentrador

1 INSERT INTO `radcheck` (`id`, `username`, `attribute`, `op`, `value`) VALUES


2 (NULL, 'usuario_router', 'NAS-IP-Address', '==', '180.255.1.1');

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.

12 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

Bom para nossa segurança vamos incluir os atributos Service-Type com


valor Framed-User e Framed-Protocol com valor PPP

1 INSERT INTO `radcheck` (`id`, `username`, `attribute`, `op`, `value`) VALUES


2 (NULL, 'jose@provedor.com', 'Service-Type', '==', 'Framed-User'),
3 (NULL, 'jose@provedor.com', 'Framed-Protocol', ':=', 'PPP');

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

1 INSERT INTO `radcheck` (`id`, `username`, `attribute`, `op`, `value`) VALUES


2 (NULL, 'jose@provedor.com', 'Calling-Station-Id', '==', '08:00:00:00:00:B2');

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.

1 MariaDB [radius]> SELECT * FROM `radcheck` WHERE `username` = 'jose@provedor.com'


2 +----+-------------------+--------------------+----+-------------------+
3 | id | username | attribute | op | value |
4 +----+-------------------+--------------------+----+-------------------+
5 | 1 | jose@provedor.com | Cleartext-Password | := | senha_do_usuario |
6 | 2 | jose@provedor.com | Service-Type | == | Framed-User |
7 | 3 | jose@provedor.com | Framed-Protocol | := | PPP |
8 | 4 | jose@provedor.com | Calling-Station-Id | == | 08:00:00:00:00:B2 |
9 +----+-------------------+--------------------+----+-------------------+
10 4 rows in set (0.001 sec)

Para que nosso controle de banda (queues) também seja con�gurado


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 pro�le irei colocar no valor 100Mb de Donw e 30 de Upload.

13 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

1 INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES


2 (NULL, 'jose@provedor.com', 'Mikrotik-Rate-Limit', ':=', '30M/100M');

Desconecte o usuário jose@provedor.com para que as novas


con�guraçõ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.

1 INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES


2 (NULL, 'jose@provedor.com', 'Mikrotik-Rate-Limit', ':=', '10M/50M 20M/100M 10M/50M 120/120 0'

14 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

1 INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES


2 (NULL, 'jose@provedor.com', 'Framed-IP-Address', ':=', '180.255.0.150');

Infelizmente o Mikrotik ainda não compreende o atributo Delegated-


IPv6-Pre�x (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-Pre�x (IPv6 WAN) e o Mikrotik-Delegated-IPv6-Pool
com o nome do da Pool que foi criada manualmente lá no seu router.

15 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

1 INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES


2 -- IPv6 WAN --
3 (NULL, 'jose@provedor.com', 'Framed-IPv6-Prefix', ':=', '2001:db8:A:B::/64'),
4 -- IPv6PD LAN Nome da Pool --
5 (NULL, 'jose@provedor.com', 'Mikrotik-Delegated-IPv6-Pool', '=', 'nome_da_pool6'

Lembrando q Delegated-IPv6-Pre�x não funciona no Mikrotik (hj),


oremos para que um dia seja implementado Ficaria assim:

1 INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES


2 (NULL, 'jose@provedor.com', 'Delegated-IPv6-Prefix', '=', '2001:db8:C::/56');

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 pro�le


con�guramos 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.

1 INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES


2 (NULL, 'jose@provedor.com', 'MS-Primary-DNS-Server', ':=', '1.1.1.1'),
3 (NULL, 'jose@provedor.com', 'MS-Secondary-DNS-Server', ':=', '9.9.9.9');

16 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

Fazendo um SELECT na tabelas radreply temos 4 atributos vinculados a


con�gurações que serão entregue ao usuário jose@provedor.com.

1 MariaDB [radius]> SELECT * FROM `radreply` WHERE `username` = 'jose@provedor.com'


2 +----+-------------------+-------------------------+----+----------------------------------+
3 | id | username | attribute | op | value
4 +----+-------------------+-------------------------+----+----------------------------------+
5 | 3 | jose@provedor.com | Mikrotik-Rate-Limit | := | 10M/50M 20M/100M 10M
6 | 6 | jose@provedor.com | MS-Primary-DNS-Server | := | 1.1.1.1
7 | 7 | jose@provedor.com | MS-Secondary-DNS-Server | := | 9.9.9.9
8 | 8 | jose@provedor.com | Framed-IP-Address | := | 180.255.0.150
9 +----+-------------------+-------------------------+----+----------------------------------+
10 4 rows in set (0.001 sec)

Podemos dispensar as con�gurações feita no pro�le 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,

17 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

apesar que no caso do Mikrotik se o DNS não estiver informado no Pro�le


ele irá usar o DNS do router (/ip dns). Normalmente no concentrador
PPPoE eu tenho apenas um pro�le 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 con�gurações de banda do radius ele estará
autenticando com velocidade ilimitada.

1 # No seu RouteOS
2 /ppp profile set Profile50M rate-limit=100k/100k

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.

1 INSERT INTO `radippool`


2 (`pool_name`, `framedipaddress`, `calledstationid`, `callingstationid`, `username`,
3 ('pool_valido', '180.255.3.128','','','','0'),
4 ('pool_valido', '180.255.3.129','','','','0'),
5 ('pool_valido', '180.255.3.130','','','','0'),
6 ('pool_bloq','100.127.0.0','','','','0'),
7 ('pool_bloq','100.127.0.1','','','','0'),
8 ('pool_bloq','100.127.0.2','','','','0');

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.

1 DELETE FROM `radreply` WHERE `username` LIKE 'jose@provedor.com' AND `attribute`

18 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

Para entregar ao usuário jose@provedor.com a pool_valido utilizaremos


o atributo Pool-Name

1 INSERT INTO `radcheck` (`id`, `username`, `attribute`, `op`, `value`) VALUES


2 (NULL, 'jose@provedor.com', 'Pool-Name', ':=', 'pool_valido');

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

RouterOS

1 [usuario_router@PPP-SERVER-LAB] > ppp active print


2 Flags: R - radius
3 # NAME SERVICE CALLER-ID ADDRESS UPTIME ENCODING
4 0 R jose@prov... pppoe 08:00:00:00:00:B2 45.250.3.129 7m51s

Radius

1 MariaDB [radius]> SELECT pool_name,framedipaddress,username,pool_key FROM `radippool


2 +-------------+-----------------+-------------------+-------------------+
3 | pool_name | framedipaddress | username | pool_key |
4 +-------------+-----------------+-------------------+-------------------+
5 | pool_valido | 45.250.3.128 | | 0 |
6 | pool_valido | 45.250.3.129 | jose@provedor.com | 08:00:00:00:00:B2 |
7 | pool_valido | 45.250.3.130 | | 0 |
8 | pool_bloq | 100.127.0.0 | | 0 |
9 | pool_bloq | 100.127.0.1 | | 0 |
10 | pool_bloq | 100.127.0.2 | | 0 |
11 +-------------+-----------------+-------------------+-------------------+

Podemos ver que o usuário jose@provedor.com recebeu o IP


45.250.3.129. Lembrando que esse endereço IP é entregue
randomicamente, con�gurado 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

19 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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 simpli�car. É 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.

1 INSERT INTO `radgroupcheck` (`groupname`, `attribute`, `op`, `value`) VALUES


2 ('PLANO_10MB', 'Service-Type', '==', 'Framed-User'),
3 ('PLANO_10MB', 'Framed-Protocol', ':=', 'PPP'),
4 ('PLANO_10MB', 'Pool-Name', ':=', 'pool_valido');
5
6 INSERT INTO `radgroupreply` (`groupname`, `attribute`, `op`, `value`) VALUES
7 ('PLANO_10MB', 'Acct-Interim-Interval', ':=', '300'),
8 ('PLANO_10MB', 'Mikrotik-Rate-Limit', ':=', '5M/10M'),
9 ('PLANO_10MB', 'MS-Primary-DNS-Server', ':=', '9.9.9.9'),
10 ('PLANO_10MB', 'MS-Secondary-DNS-Server', ':=', '149.112.112.112');

Aproveitando irei criar um Plano de bloqueio.

1 INSERT INTO `radgroupcheck` (`groupname`, `attribute`, `op`, `value`) VALUES


2 ('BLOQUEADO', 'Service-Type', '==', 'Framed-User'),
3 ('BLOQUEADO', 'Framed-Protocol', ':=', 'PPP'),

20 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

4 ('BLOQUEADO', 'Pool-Name', ':=', 'pool_bloq');


5
6 INSERT INTO `radgroupreply` (`groupname`, `attribute`, `op`, `value`) VALUES
7 ('BLOQUEADO', 'Acct-Interim-Interval', ':=', '300'),
8 ('BLOQUEADO', 'Mikrotik-Rate-Limit', ':=', '666k/666k'),
9 ('BLOQUEADO', 'MS-Primary-DNS-Server', ':=', '8.8.8.8'),
10 ('BLOQUEADO', 'MS-Secondary-DNS-Server', ':=', '8.8.4.4');

Para melhor entendimento e simpli�car vamos apagar do usuário


jose@provedor.com das tabelas radcheck e radreply.

1 DELETE FROM `radcheck` WHERE `username` LIKE 'jose@provedor.com';


2 DELETE FROM `radreply` WHERE `username` LIKE 'jose@provedor.com';

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:

1 INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES


2 ('jose@provedor.com', 'Cleartext-Password', ':=', 'senha_do_usuario'),
3 ('jose@provedor.com', 'Calling-Station-Id', '==', '08:00:00:00:00:B2');

Se nesse momento o usuário conectar ele estaria sem um grupo e as


con�gurações que estaria recebendo seriam as do pro�le 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?!

1 INSERT INTO `radusergroup` (`username`, `groupname`) VALUES


2 ('jose@provedor.com', 'PLANO_10MB');

Desconecte o usuário e veri�que se o mesmo irá receber as novas


con�gurações com base em grupos.

21 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

PPPoE Server: IP Randômico [OK] / Controle de Banda [OK]

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

22 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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


do usuário para BLOQUEADO.

1 UPDATE `radusergroup` SET `groupname` = 'BLOQUEADO' WHERE `username` LIKE 'jose@provedor.com'

Desconectamos novamente e veri�camos as con�gurações recebidas.

23 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

24 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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 �xo 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 �xo, 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:

1 MariaDB [radius]> SELECT * FROM `radgroupcheck`;


2 +----+------------+-----------------+----+-------------+
3 | id | groupname | attribute | op | value |
4 +----+------------+-----------------+----+-------------+
5 | 1 | PLANO_10MB | Service-Type | == | Framed-User |
6 | 2 | PLANO_10MB | Framed-Protocol | := | PPP |
7 | 3 | PLANO_10MB | Pool-Name | := | pool_valido |
8 | 4 | BLOQUEADO | Service-Type | == | Framed-User |
9 | 5 | BLOQUEADO | Framed-Protocol | := | PPP |
10 | 6 | BLOQUEADO | Pool-Name | := | pool_bloq |
11 +----+------------+-----------------+----+-------------+
12 6 rows in set (0.000 sec)
13
14 MariaDB [radius]> SELECT * FROM `radgroupreply`;
15 +----+------------+-------------------------+----+-----------------+
16 | id | groupname | attribute | op | value |
17 +----+------------+-------------------------+----+-----------------+
18 | 1 | PLANO_10MB | Acct-Interim-Interval | := | 300 |
19 | 2 | PLANO_10MB | Mikrotik-Rate-Limit | := | 5M/10M |
20 | 3 | PLANO_10MB | MS-Primary-DNS-Server | := | 9.9.9.9 |
21 | 4 | PLANO_10MB | MS-Secondary-DNS-Server | := | 149.112.112.112 |
22 | 5 | BLOQUEADO | Acct-Interim-Interval | := | 300 |
23 | 6 | BLOQUEADO | Mikrotik-Rate-Limit | := | 666k/666k |
24 | 7 | BLOQUEADO | MS-Primary-DNS-Server | := | 8.8.8.8 |
25 | 8 | BLOQUEADO | MS-Secondary-DNS-Server | := | 8.8.4.4 |

25 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

26 +----+------------+-------------------------+----+-----------------+
27 8 rows in set (0.000 sec)
28
29 MariaDB [radius]> SELECT * FROM `radcheck` WHERE `username` = 'jose@provedor.com'
30 +----+-------------------+--------------------+----+-------------------+
31 | id | username | attribute | op | value |
32 +----+-------------------+--------------------+----+-------------------+
33 | 15 | jose@provedor.com | Cleartext-Password | := | senha_do_usuario |
34 | 16 | jose@provedor.com | Calling-Station-Id | == | 08:00:00:00:00:B2 |
35 +----+-------------------+--------------------+----+-------------------+
36 2 rows in set (0.000 sec)
37
38 MariaDB [radius]> SELECT * FROM `radusergroup`;
39 +----+-------------------+-----------+----------+
40 | id | username | groupname | priority |
41 +----+-------------------+-----------+----------+
42 | 1 | jose@provedor.com | BLOQUEADO | 1 |
43 +----+-------------------+-----------+----------+
44 1 row in set (0.000 sec)

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 �caria:

1 INSERT INTO `radgroupcheck` (`groupname`, `attribute`, `op`, `value`) VALUES


2 ('PLANO_X', 'Simultaneous-Use', ':=', '1');

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

1 session {
2 radutmp

26 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

3 sql
4 }

Mas é extremamente importante você saber que qualquer falha de


comunicação entre o roteador e o servidor a conexão ira �car
“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 veri�car 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

27 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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 con�guramos 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 �cando 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á di�cil algum usuário
autenticar sem remover seu antigo IP alocado. Mas você pode ajustar de
acordo com suas necessidades/realidade.

1 # sed -i 's/lease_duration = 3600/lease_duration = 600/' /etc/freeradius/3.0/mods-available/sql


2 # systemctl restart freeradius

28 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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

Porém é interessante você ajustar as querys em /etc/freeradius


/3.0/mods-con�g/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
veri�ca 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:

29 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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

30 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

todos os pppoe-server. Lembre-se de não pode nenhum �rewall


bloqueando ICMP.

1 /system scheduler
2 add interval=5m name=checa-radius on-event="{ \r\
3 \n :local cont 0\r\
4 \n :local services [/interface pppoe-server server print count-only]\r\
5 \n /interface pppoe-server server print\r\
6 \n :if ([/ping 180.255.0.3 count=10] = 0) do={\r\
7 \n :log error message=\"COMUNICACAO RADIUS [ OFF ]\";\r\
8 \n :while (\$cont < \$services) do={\r\
9 \n /interface pppoe-server server disable numbers=\$cont\r\
10 \n /interface pppoe-server server enable numbers=\$cont\r\
11 \n :set cont (\$cont+1)\r\
12 \n }\r\
13 \n }\r\
14 \n}" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon

1 {
2 :local cont 0
3 :local services [/interface pppoe-server server print count-only]
4 /interface pppoe-server server print
5 :if ([/ping 180.255.0.3 count=10] = 0) do={
6 :log error message="COMUNICACAO RADIUS [ OFF ]";
7 :while ($cont < $services) do={
8 /interface pppoe-server server disable numbers=$cont
9 /interface pppoe-server server enable numbers=$cont
10 :set cont ($cont+1)
11 }
12 }
13 }

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)

31 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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_�nd
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-con�g


/sql/ippool/mysql/queries.conf.

1 # vim /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf

Comentando as linhas atuais da variável allocate_�nd:

1 ##allocate_find = "\
2 ## SELECT framedipaddress FROM ${ippool_table} \
3 ## WHERE pool_name = '%{control:Pool-Name}' \
4 ## AND expiry_time IS NULL \
5 ## ORDER BY \
6 ## RAND() \
7 ## LIMIT 1 \
8 ## FOR UPDATE"

E adicionando as seguintes: (Perceba que o nome da pool


alternativa/failover/backup é pool_cgnat)

1 allocate_find = "\
2 SELECT framedipaddress FROM ${ippool_table} \
3 WHERE ( \
4 CASE WHEN (SELECT COUNT(framedipaddress) FROM ${ippool_table} WHERE pool_name
5 (pool_name = '%{control:Pool-Name}' AND expiry_time IS NULL) \
6 ELSE \
7 (pool_name = 'pool_cgnat' AND expiry_time IS NULL) \

32 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

8 END) \
9 ORDER BY RAND() \
10 LIMIT 1 \
11 FOR UPDATE"

Lembre-se que toda a ateração nos arquivos de con�gurações é


necessário reiniciar o serviço.

1 # systemctl restart freeradius

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

1 INSERT INTO `radippool`


2 (`pool_name`, `framedipaddress`, `nasipaddress`, `calledstationid`, `callingstationid`,
3 ('pool_cgnat', '100.64.0.0', '', '', '', NULL, '', '0'),
4 ('pool_cgnat', '100.64.0.1', '', '', '', NULL, '', '0'),
5 ('pool_cgnat', '100.64.0.2', '', '', '', NULL, '', '0'),
6 ('pool_cgnat', '100.64.0.3', '', '', '', NULL, '', '0');

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 �xas 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

33 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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ó con�gurar 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 in�nidade
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

34 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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
con�gurar nosso AP-Mikrotik.

Crie um novo pro�le de segurança

1 /interface wireless security-profiles


2 add name=WPA2-PSK-Radius \
3 mode=dynamic-keys management-protection=allowed \
4 authentication-types=wpa2-psk radius-called-format=ssid \
5 radius-mac-authentication=yes \
6 wpa2-pre-shared-key=dZluej6SCdcFvRWd

35 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

Con�gurando a interface wireless “wlan1” setamos o security-pro�le


para WPA2-PSK-Radius que acabamos de criar e darei o nome do sinal
(ssid) de SSID-PSK-Radius.

1 /interface wireless
2 set [ find default-name=wlan1 ] \
3 disabled=no mode=ap-bridge \
4 security-profile=WPA2-PSK-Radius \
5 ssid=SSID-PSK-Radius

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

1 /radius
2 add address=180.255.0.3 secret=SEU_SECRET service=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:

1 INSERT INTO `nas` (`nasname`, `shortname`, `type`, `ports`, `secret`, `server`,


2 ('10.1.0.4', 'MK-AP-C', 'other', NULL, 'SEU_SECRET', NULL, NULL, 'SSID-PSK-Radius'

1 # systemctl restart freeradius

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:

1 (16) Service-Type = Framed-User

36 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

2 (16) NAS-Port-Id = "wlan1"


3 (16) NAS-Port-Type = Wireless-802.11
4 (16) User-Name = "44:45:4D:45:4B:4D"
5 (16) Calling-Station-Id = "44-45-4D-45-4B-4D"
6 (16) Called-Station-Id = "SSID-PSK-Radius"
7 (16) User-Password = ""
8 (16) NAS-Identifier = "MikroTik"
9 (16) NAS-IP-Address = 10.1.0.4

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-Identi�er =
“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 pro�le 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 )

1 INSERT INTO `radreply` (`username`, `attribute`, `op`, `value`) VALUES


2 ('44:45:4D:45:4B:4D', 'Mikrotik-Wireless-PSK', ':=', '3ZKEG5mMq0ZRSUQy');

37 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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 de�nir 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”.

1 INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES


2 ('44:45:4D:45:4B:4D', 'Auth-Type', ':=', 'Accept'),
3 ('44:45:4D:45:4B:4D', 'NAS-Port-Type', '==', 'Wireless-802.11'),
4 ('44:45:4D:45:4B:4D', 'Called-Station-Id', '==', 'SSID-PSK-Radius');

Seria ainda possível prender ao Identity (NAS-Identi�er) 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 pro�le de segurança, para diferenciar usarei o mac-
format=XXXXXXXXXXXX. Vale lembrar que tem outras formas de
con�gurar o EAP, mas para nosso lab podemos subi-lo da forma mais
simples.

1 /interface wireless security-profiles


2 add authentication-types=wpa2-eap \
3 management-protection=allowed mode=dynamic-keys \

38 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

4 name=WPA2-EAP-Radius radius-called-format=ssid \
5 radius-eap-accounting=yes radius-mac-format=XXXXXXXXXXXX\
6 supplicant-identity=MikroTik

Ajuste sua interface

1 /interface wireless
2 set [ find default-name=wlan1 ] disabled=no \
3 mode=ap-bridge security-profile=WPA2-EAP-Radius ssid=WPA2-EAP-Radius

Conecte ao radius.

1 /radius
2 add address=180.255.0.3 secret=SEU_SECRET service=wireless

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

No EAP não é necessariamente ser o MAC o usuário, mas �ca mais pratico
até para programar, logo precisamos de um usuário e senha e prender ele

39 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

ao tipo EAP. Eu particularmente NÃO uso EAP no mikrotik, por mais que
PSK seja mais facil quebrar com o uso do radius �ca muito complicado, e
além do mais �ca 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.

1 INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES


2 ('44454D454B4D', 'Cleartext-Password', ':=', 'enIkMVfhq3WIqyKq'),
3 ('44454D454B4D', 'Auth-Type', ':=', 'eap');

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.

1 # ln -s /etc/freeradius/3.0/mods-available/sqlcounter /etc/freeradius/3.0/mods-enabled/sqlcount

Adicione em instantiate {…} dailycounter, monthlycounter e


noresetcounter do arquivo /etc/freeradius/3.0/radiusd.conf

1 # sed -i '683i\ dailycounter' /etc/freeradius/3.0/radiusd.conf

40 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

2 # sed -i '684i\ monthlycounter' /etc/freeradius/3.0/radiusd.conf


3 # sed -i '685i\ noresetcounter' /etc/freeradius/3.0/radiusd.conf

Adicione em authorize {…} dailycounter, monthlycounter e


noresetcounter do arquivo /etc/freeradius/3.0/sites-enabled/default

1 # sed -i '406i\ dailycounter' /etc/freeradius/3.0/sites-enabled/default


2 # sed -i '407i\ monthlycounter' /etc/freeradius/3.0/sites-enabled/default
3 # sed -i '408i\ noresetcounter' /etc/freeradius/3.0/sites-enabled/default

Restart o freeradius

1 # systemctl restart 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 con�gurações automaticamente.

1 /ip hotspot setup


2 Select interface to run HotSpot on
3
4 hotspot interface: wlan1 #--> Defina a interface que vai rodar o server
5 Set HotSpot address for interface
6
7 local address of network: 10.5.50.1/24 #--> Informe o IP/mascara da rede
8 masquerade network: yes #--> Ativa o NAT já para a classe
9 Set pool for HotSpot addresses
10
11 address pool of network: 10.5.50.2-10.5.50.254 #--> Range da pool de IPs
12 Select hotspot SSL certificate
13
14 select certificate: no #--> Sem certificado
15 Select SMTP server
16
17 ip address of smtp server: 0.0.0.0 #--> Pode deixar 0.0.0.0
18 Setup DNS configuration
19
20 dns servers: 8.8.8.8,1.1.1.1 #--> Servidores DNS

41 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

21 DNS name of local hotspot server


22
23 dns name: hotspot.remontti.com.br #--> Domínio qualquer (Se acessado irá mostrar o status)
24 Create local hotspot user
25
26 name of local hotspot user: admin #--> Vai ser necessário criar um usuario
27 password for the user: admin #--> que vamos remover

Remova o usuário admin criado no wizard, de�na o por�le para usar o


radius e na conexão com o radius marque hotspot.

1 /ip hotspot user remove admin


2
3 /ip hotspot profile
4 set hsprof1 use-radius=yes
5
6 /radius
7 add address=180.255.0.3 secret=SEU_SECRET service=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é.

1 /ip hotspot walled-garden ip


2 add action=accept disabled=no \
3 dst-address=180.255.0.3 !dst-port !protocol !src-address
4 add action=accept disabled=no !dst-address \
5 !dst-address-list dst-port=53 protocol=udp \
6 !src-address !src-address-list

Com nosso AP con�gurado acessamos:

42 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

Vou tentar logar com tadeu@remontti.com.br com qualquer senha e


visualizar no freeradius -X (debug) o que chega lá:

1 (6) NAS-Port-Type = Wireless-802.11


2 (6) Calling-Station-Id = "44:45:4D:45:4B:4D"
3 (6) Called-Station-Id = "hotspot1"
4 (6) NAS-Port-Id = "wlan1"
5 (6) User-Name = "tadeu@remontti.com.br"
6 (6) NAS-Port = 2151677963
7 (6) Acct-Session-Id = "8040000b"
8 (6) Framed-IP-Address = 10.5.50.254
9 (6) Mikrotik-Host-IP = 10.5.50.254
10 (6) CHAP-Challenge = 0xaf9b9672cf915d68fd7244fc43035d7a
11 (6) CHAP-Password = 0x647d5c258b16ca7841803bfb3b0d376b79
12 (6) Service-Type = Login-User
13 (6) WISPr-Logoff-URL = "http://10.5.50.1/logout"
14 (6) NAS-Identifier = "LAB"
15 (6) NAS-IP-Address = 180.255.1.3

43 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

Vimos que chegaram alguns valores interessantes, podemos fazer �ltro


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.

1 INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES


2 ('tadeu@remontti.com.br', 'Cleartext-Password', ':=', 'enIkMVfhq3WIqyKq');

Vamos ao teste:

44 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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

1 INSERT INTO `radgroupcheck` (`groupname`, `attribute`, `op`, `value`) VALUES


2 ('30MIN-DIA', 'Max-Daily-Session', ':=', '1800'),
3 ('30MIN-DIA', 'NAS-Port-Type', '==', 'Wireless-802.11'),
4 ('7h-MES', 'Max-Monthly-Session', ':=', '25200'),
5 ('7h-MES', 'NAS-Port-Type', '==', 'Wireless-802.11'),
6 ('2h-UNICA', 'Max-All-Session', ':=', '7200'),
7 ('2h-UNICA', 'NAS-Port-Type', '==', 'Wireless-802.11'),
8 ('ILIMITADO', 'NAS-Port-Type', '==', 'Wireless-802.11');
9
10 INSERT INTO `radgroupreply` (`groupname`, `attribute`, `op`, `value`) VALUES
11 ('30MIN-DIA', 'Acct-Interim-Interval', ':=', '300'),
12 ('30MIN-DIA', 'Mikrotik-Rate-Limit', ':=', '2M/8M'),
13 ('7h-MES', 'Acct-Interim-Interval', ':=', '300'),
14 ('7h-MES', 'Mikrotik-Rate-Limit', ':=', '3072K/10240K'),
15 ('2h-UNICO', 'Acct-Interim-Interval', ':=', '300'),
16 ('2h-UNICO', 'Mikrotik-Rate-Limit', ':=', '8M/20240K'),
17 ('ILIMITADO', 'Acct-Interim-Interval', ':=', '300'),

45 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

18 ('ILIMITADO', 'Mikrotik-Rate-Limit', ':=', '10M/30M');

Agora vamos vincular o usuário a um grupo.

1 INSERT INTO `radusergroup` (`username`, `groupname`) VALUES


2 ('tadeu@remontti.com.br', '30MIN-DIA');

No caso dos planos com contabilidade de tempo ao término do seu


tempo o login não conseguirá mais logar. Essas veri�cação de tempo é
realizada na bom base na tabela radacct.

Um dica �nal é: 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
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.

1 mariadb -p -u radius

Crie dois campos framedipv6pre�x e delegatedipv6pre�x

1 USE radius;
2 ALTER TABLE `radacct`
3 ADD `framedipv6prefix` VARCHAR(41) NULL DEFAULT NULL AFTER `framedipaddress`,
4 ADD `delegatedipv6prefix` VARCHAR(41) NULL DEFAULT NULL AFTER `framedipv6prefix

46 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

Agora ajuste as queries em queries.conf

1 # vim /etc/freeradius/3.0/mods-config/sql/main/mysql/queries.conf

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

1 # -*- text -*-


2 #
3 # main/mysql/queries.conf-- MySQL configuration for default schema (schema.sql)
4 #
5 # $Id: 40508024d5fd6a319bbb85775c3fe1e8388be656 $
6
7 # Safe characters list for sql queries. Everything else is replaced
8 # with their mime-encoded equivalents.
9 # The default list should be ok
10 #safe_characters = "@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_: /"
11
12 #######################################################################
13 # Connection config
14 #######################################################################
15 # The character set is not configurable. The default character set of
16 # the mysql client library is used. To control the character set,
17 # create/edit my.cnf (typically in /etc/mysql/my.cnf or /etc/my.cnf)
18 # and enter
19 # [client]
20 # default-character-set = utf8
21 #
22
23 #######################################################################
24 # Query config: Username
25 #######################################################################
26 # This is the username that will get substituted, escaped, and added
27 # as attribute 'SQL-User-Name'. '%{SQL-User-Name}' should be used below
28 # everywhere a username substitution is needed so you you can be sure
29 # the username passed from the client is escaped properly.
30 #
31 # Uncomment the next line, if you want the sql_user_name to mean:
32 #
33 # Use Stripped-User-Name, if it's there.
34 # Else use User-Name, if it's there,
35 # Else use hard-coded string "DEFAULT" as the user name.
36 #sql_user_name = "%{%{Stripped-User-Name}:-%{%{User-Name}:-DEFAULT}}"

47 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

37 #
38 sql_user_name = "%{User-Name}"
39
40 #######################################################################
41 # Default profile
42 #######################################################################
43 # This is the default profile. It is found in SQL by group membership.
44 # That means that this profile must be a member of at least one group
45 # which will contain the corresponding check and reply items.
46 # This profile will be queried in the authorize section for every user.
47 # The point is to assign all users a default profile without having to
48 # manually add each one to a group that will contain the profile.
49 # The SQL module will also honor the User-Profile attribute. This
50 # attribute can be set anywhere in the authorize section (ie the users
51 # file). It is found exactly as the default profile is found.
52 # If it is set then it will *overwrite* the default profile setting.
53 # The idea is to select profiles based on checks on the incoming packets,
54 # not on user group membership. For example:
55 # -- users file --
56 # DEFAULT Service-Type == Outbound-User, User-Profile := "outbound"
57 # DEFAULT Service-Type == Framed-User, User-Profile := "framed"
58 #
59 # By default the default_user_profile is not set
60 #
61 #default_user_profile = "DEFAULT"
62
63 #######################################################################
64 # NAS Query
65 #######################################################################
66 # This query retrieves the radius clients
67 #
68 # 0. Row ID (currently unused)
69 # 1. Name (or IP address)
70 # 2. Shortname
71 # 3. Type
72 # 4. Secret
73 # 5. Server
74 #######################################################################
75
76 client_query = "\
77 SELECT id, nasname, shortname, type, secret, server \
78 FROM ${client_table}"
79
80 #######################################################################
81 # Authorization Queries
82 #######################################################################

48 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

83 # These queries compare the check items for the user


84 # in ${authcheck_table} and setup the reply items in
85 # ${authreply_table}. You can use any query/tables
86 # you want, but the return data for each row MUST
87 # be in the following order:
88 #
89 # 0. Row ID (currently unused)
90 # 1. UserName/GroupName
91 # 2. Item Attr Name
92 # 3. Item Attr Value
93 # 4. Item Attr Operation
94 #######################################################################
95 # Use these for case sensitive usernames.
96
97 #authorize_check_query = "\
98 # SELECT id, username, attribute, value, op \
99 # FROM ${authcheck_table} \
100 # WHERE username = BINARY '%{SQL-User-Name}' \
101 # ORDER BY id"
102
103 #authorize_reply_query = "\
104 # SELECT id, username, attribute, value, op \
105 # FROM ${authreply_table} \
106 # WHERE username = BINARY '%{SQL-User-Name}' \
107 # ORDER BY id"
108
109 #
110 # The default queries are case insensitive. (for compatibility with
111 # older versions of FreeRADIUS)
112 #
113 authorize_check_query = "\
114 SELECT id, username, attribute, value, op \
115 FROM ${authcheck_table} \
116 WHERE username = '%{SQL-User-Name}' \
117 ORDER BY id"
118
119 authorize_reply_query = "\
120 SELECT id, username, attribute, value, op \
121 FROM ${authreply_table} \
122 WHERE username = '%{SQL-User-Name}' \
123 ORDER BY id"
124
125 #
126 # Use these for case sensitive usernames.
127 #
128 #group_membership_query = "\

49 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

129 # SELECT groupname \


130 # FROM ${usergroup_table} \
131 # WHERE username = BINARY '%{SQL-User-Name}' \
132 # ORDER BY priority"
133
134 group_membership_query = "\
135 SELECT groupname \
136 FROM ${usergroup_table} \
137 WHERE username = '%{SQL-User-Name}' \
138 ORDER BY priority"
139
140 authorize_group_check_query = "\
141 SELECT id, groupname, attribute, \
142 Value, op \
143 FROM ${groupcheck_table} \
144 WHERE groupname = '%{${group_attribute}}' \
145 ORDER BY id"
146
147 authorize_group_reply_query = "\
148 SELECT id, groupname, attribute, \
149 value, op \
150 FROM ${groupreply_table} \
151 WHERE groupname = '%{${group_attribute}}' \
152 ORDER BY id"
153
154 #######################################################################
155 # Simultaneous Use Checking Queries
156 #######################################################################
157 # simul_count_query - query for the number of current connections
158 # - If this is not defined, no simultaneous use checking
159 # - will be performed by this module instance
160 # simul_verify_query - query to return details of current connections
161 # for verification
162 # - Leave blank or commented out to disable verification step
163 # - Note that the returned field order should not be changed.
164 #######################################################################
165
166 simul_count_query = "\
167 SELECT COUNT(*) \
168 FROM ${acct_table1} \
169 WHERE username = '%{SQL-User-Name}' \
170 AND acctstoptime IS NULL"
171
172 simul_verify_query = "\
173 SELECT \
174 radacctid, acctsessionid, username, nasipaddress, nasportid, framedipaddress

50 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

175 callingstationid, framedprotocol \


176 FROM ${acct_table1} \
177 WHERE username = '%{SQL-User-Name}' \
178 AND acctstoptime IS NULL"
179
180 #######################################################################
181 # Accounting and Post-Auth Queries
182 #######################################################################
183 # These queries insert/update accounting and authentication records.
184 # The query to use is determined by the value of 'reference'.
185 # This value is used as a configuration path and should resolve to one
186 # or more 'query's. If reference points to multiple queries, and a query
187 # fails, the next query is executed.
188 #
189 # Behaviour is identical to the old 1.x/2.x module, except we can now
190 # fail between N queries, and query selection can be based on any
191 # combination of attributes, or custom 'Acct-Status-Type' values.
192 #######################################################################
193 accounting {
194 reference = "%{tolower:type.%{Acct-Status-Type}.query}"
195
196 # Write SQL queries to a logfile. This is potentially useful for bulk inserts
197 # when used with the rlm_sql_null driver.
198 # logfile = ${logdir}/accounting.sql
199
200 column_list = "\
201 acctsessionid, acctuniqueid, username, \
202 realm, nasipaddress, nasportid, \
203 nasporttype, acctstarttime, acctupdatetime, \
204 acctstoptime, acctsessiontime, acctauthentic, \
205 connectinfo_start, connectinfo_stop, acctinputoctets, \
206 acctoutputoctets, calledstationid, callingstationid, \
207 acctterminatecause, servicetype, framedprotocol, \
208 framedipaddress, framedipv6prefix, delegatedipv6prefix"
209
210 type {
211 accounting-on {
212 #
213 # Bulk terminate all sessions associated with a given NAS
214 #
215 query = "\
216 UPDATE ${....acct_table1} \
217 SET \
218 acctstoptime = FROM_UNIXTIME(\
219 %{integer:Event-Timestamp}), \
220 acctsessiontime = '%{integer:Event-Timestamp}' \

51 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

221 - UNIX_TIMESTAMP(acctstarttime), \
222 acctterminatecause = '%{%{Acct-Terminate-Cause}:-NAS-Reboot}'
223 WHERE acctstoptime IS NULL \
224 AND nasipaddress = '%{NAS-IP-Address}' \
225 AND acctstarttime <= FROM_UNIXTIME(\
226 %{integer:Event-Timestamp})"
227 }
228
229 accounting-off {
230 query = "${..accounting-on.query}"
231 }
232
233 start {
234 #
235 # Insert a new record into the sessions table
236 #
237 query = "\
238 INSERT INTO ${....acct_table1} \
239 (${...column_list}) \
240 VALUES \
241 ('%{Acct-Session-Id}', \
242 '%{Acct-Unique-Session-Id}', \
243 '%{SQL-User-Name}', \
244 '%{Realm}', \
245 '%{NAS-IP-Address}', \
246 '%{%{NAS-Port-ID}:-%{NAS-Port}}', \
247 '%{NAS-Port-Type}', \
248 FROM_UNIXTIME(%{integer:Event-Timestamp}), \
249 FROM_UNIXTIME(%{integer:Event-Timestamp}), \
250 NULL, \
251 '0', \
252 '%{Acct-Authentic}', \
253 '%{Connect-Info}', \
254 '', \
255 '0', \
256 '0', \
257 '%{Called-Station-Id}', \
258 '%{Calling-Station-Id}', \
259 '', \
260 '%{Service-Type}', \
261 '%{Framed-Protocol}', \
262 '%{Framed-IP-Address}', \
263 '%{Framed-IPv6-Prefix}', \
264 '%{Delegated-IPv6-Prefix}')"
265
266 #

52 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

267 # Key constraints prevented us from inserting a new session,


268 # use the alternate query to update an existing session.
269 #
270 query = "\
271 UPDATE ${....acct_table1} SET \
272 acctstarttime = FROM_UNIXTIME(%{integer:Event-Timestamp
273 acctupdatetime = FROM_UNIXTIME(%{integer:Event-Timestamp
274 connectinfo_start = '%{Connect-Info}' \
275 WHERE AcctUniqueId = '%{Acct-Unique-Session-Id}'"
276 }
277
278 interim-update {
279 #
280 # Update an existing session and calculate the interval
281 # between the last data we received for the session and this
282 # update. This can be used to find stale sessions.
283 #
284 query = "\
285 UPDATE ${....acct_table1} \
286 SET \
287 acctupdatetime = (@acctupdatetime_old:=acctupdatetime),
288 acctupdatetime = FROM_UNIXTIME(\
289 %{integer:Event-Timestamp}), \
290 acctinterval = %{integer:Event-Timestamp} - \
291 UNIX_TIMESTAMP(@acctupdatetime_old), \
292 framedipaddress = '%{Framed-IP-Address}', \
293 framedipv6prefix = '%{Framed-IPv6-Prefix}', \
294 delegatedipv6prefix = '%{Delegated-IPv6-Prefix}', \
295 acctsessiontime = %{%{Acct-Session-Time}:-NULL}, \
296 acctinputoctets = '%{%{Acct-Input-Gigawords}:-0}' \
297 << 32 | '%{%{Acct-Input-Octets}:-0}', \
298 acctoutputoctets = '%{%{Acct-Output-Gigawords}:-0}' \
299 << 32 | '%{%{Acct-Output-Octets}:-0}' \
300 WHERE AcctUniqueId = '%{Acct-Unique-Session-Id}'"
301
302 #
303 # The update condition matched no existing sessions. Use
304 # the values provided in the update to create a new session.
305 #
306 query = "\
307 INSERT INTO ${....acct_table1} \
308 (${...column_list}) \
309 VALUES \
310 ('%{Acct-Session-Id}', \
311 '%{Acct-Unique-Session-Id}', \
312 '%{SQL-User-Name}', \

53 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

313 '%{Realm}', \
314 '%{NAS-IP-Address}', \
315 '%{%{NAS-Port-ID}:-%{NAS-Port}}', \
316 '%{NAS-Port-Type}', \
317 FROM_UNIXTIME(%{integer:Event-Timestamp} - %{%{Acct-Session
318 FROM_UNIXTIME(%{integer:Event-Timestamp}), \
319 NULL, \
320 %{%{Acct-Session-Time}:-NULL}, \
321 '%{Acct-Authentic}', \
322 '%{Connect-Info}', \
323 '', \
324 '%{%{Acct-Input-Gigawords}:-0}' << 32 | '%{%{Acct-Input-Octets}:-0}'
325 '%{%{Acct-Output-Gigawords}:-0}' << 32 | '%{%{Acct-Output-Octets}:-0}'
326 '%{Called-Station-Id}', \
327 '%{Calling-Station-Id}', \
328 '', \
329 '%{Service-Type}', \
330 '%{Framed-Protocol}', \
331 '%{Framed-IP-Address}', \
332 '%{Framed-IPv6-Prefix}', \
333 '%{Delegated-IPv6-Prefix}')"
334 }
335
336 stop {
337 #
338 # Session has terminated, update the stop time and statistics.
339 #
340 query = "\
341 UPDATE ${....acct_table2} SET \
342 acctstoptime = FROM_UNIXTIME(\
343 %{integer:Event-Timestamp}), \
344 acctsessiontime = %{%{Acct-Session-Time}:-NULL}, \
345 acctinputoctets = '%{%{Acct-Input-Gigawords}:-0}' \
346 << 32 | '%{%{Acct-Input-Octets}:-0}', \
347 acctoutputoctets = '%{%{Acct-Output-Gigawords}:-0}' \
348 << 32 | '%{%{Acct-Output-Octets}:-0}', \
349 acctterminatecause = '%{Acct-Terminate-Cause}', \
350 connectinfo_stop = '%{Connect-Info}' \
351 WHERE AcctUniqueId = '%{Acct-Unique-Session-Id}'"
352
353 #
354 # The update condition matched no existing sessions. Use
355 # the values provided in the update to create a new session.
356 #
357 query = "\
358 INSERT INTO ${....acct_table2} \

54 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

359 (${...column_list}) \
360 VALUES \
361 ('%{Acct-Session-Id}', \
362 '%{Acct-Unique-Session-Id}', \
363 '%{SQL-User-Name}', \
364 '%{Realm}', \
365 '%{NAS-IP-Address}', \
366 '%{%{NAS-Port-ID}:-%{NAS-Port}}', \
367 '%{NAS-Port-Type}', \
368 FROM_UNIXTIME(%{integer:Event-Timestamp} - %{%{Acct-Session
369 FROM_UNIXTIME(%{integer:Event-Timestamp}), \
370 FROM_UNIXTIME(%{integer:Event-Timestamp}), \
371 %{%{Acct-Session-Time}:-NULL}, \
372 '%{Acct-Authentic}', \
373 '', \
374 '%{Connect-Info}', \
375 '%{%{Acct-Input-Gigawords}:-0}' << 32 | '%{%{Acct-Input-Octets}:-0}'
376 '%{%{Acct-Output-Gigawords}:-0}' << 32 | '%{%{Acct-Output-Octets}:-0}'
377 '%{Called-Station-Id}', \
378 '%{Calling-Station-Id}', \
379 '%{Acct-Terminate-Cause}', \
380 '%{Service-Type}', \
381 '%{Framed-Protocol}', \
382 '%{Framed-IP-Address}', \
383 '%{Framed-IPv6-Prefix}', \
384 '%{Delegated-IPv6-Prefix}')"
385 }
386 }
387 }
388
389
390 #######################################################################
391 # Authentication Logging Queries
392 #######################################################################
393 # postauth_query - Insert some info after authentication
394 #######################################################################
395
396 post-auth {
397 # Write SQL queries to a logfile. This is potentially useful for bulk inserts
398 # when used with the rlm_sql_null driver.
399 # logfile = ${logdir}/post-auth.sql
400
401 query = "\
402 INSERT INTO ${..postauth_table} \
403 (username, pass, reply, authdate) \
404 VALUES ( \

55 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

405 '%{SQL-User-Name}', \
406 '%{%{User-Password}:-%{Chap-Password}}', \
407 '%{reply:Packet-Type}', \
408 '%S')"
409 }

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é �carei muito feliz pelo seu
reconhecimento! (Esse deu trabalho!)

Se não puder doar pode deixar seu agradecimento nos comentário


também �carei 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 �car atualizado sempre que publicar


um novo tutorial.

Abraço!

Fontes:
https://wiki.freeradius.org/guide/SQL-HOWTO

56 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

https://wiki.freeradius.org/modules/Rlm_sql
https://wiki.freeradius.org/modules/Rlm_sqlippool
https://wiki.freeradius.org/modules/Rlm_sqlcounter

Tags: autenticação auth eap freeradius hotspot laboratório MariaDB Mikrotik

pppoe psk radius ubiquiti wireless

Rudimar Remontti
Trabalho atualmente como Gerente de Redes em um Provedor de

Internet no Rio Grande do Sul.

 VOCÊ PODE GOSTAR...

 12 1 7

Instalação do Grafana Instalação do Nginx Modelo simples e


e integrando com Proxy Manager funcional de Firewall
Zabbix (Debian 10) 18 DE JUNHO DE 2022
com iptables
8 DE FEVEREIRO DE 2020 4 DE MAIO DE 2018

57 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

14 RESULTADOS

 Comentários 13  Pingbacks 1

Pedro  29 de agosto de 2022 às 11:08 PM


Boa noite Rumidar

Em primeiro lugar quero felicitar pelo exelente tutorial, segui os passos em


um servidor ubuntu 20.04 e funcionou 100%, �z 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
con�g 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 �le /etc/freeradius/3.0/mods-enabled/sql.conf


sql {
driver = “rlm_sql_mysql”
server = “localhost”
port = 3306
login = “radius”

58 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

password = <<>>
radius_db = “radius”
read_groups = yes
read_pro�les = yes
read_clients = yes
delete_stale_sessions = yes
sql_user_name = “%{User-Name}”
log�le = “/var/log/freeradius/radacct/sql.log”
default_user_pro�le = “”
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”

59 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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-o� {
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,

60 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

acctstoptime,acctsessiontime, acctauthentic, connectinfo_start,


connectinfo_stop, acctinputoctets, acctoutputoctets, calledstationid,
callingstationid, acctterminatecause, servicetype, framedprotocol,
framedipaddress, framedipv6address, framedipv6pre�x, framedinterfaceid,
delegatedipv6pre�x) 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-Pre�x}', '%{Framed-
Interface-Id}', '%{Delegated-IPv6-Pre�x}')"
}
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}', framedipv6pre�x =
'%{Framed-IPv6-Pre�x}', framedinterfaceid = '%{Framed-Interface-Id}',
delegatedipv6pre�x = '%{Delegated-IPv6-Pre�x}', 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}'"
}

61 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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"
log�le = "/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 veri�cada nas con�gs?

Responder

Ramon  19 de julho de 2022 às 11:24 AM


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

Responder

62 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

Rui Bernardes Pereira  20 de julho de 2021 às 10:33 AM


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 con�guro para ele
aceitar todas as requisições que receber?

Responder

Anderson  9 de maio de 2021 às 12:26 PM


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?

Responder

Eder Zavoli  27 de março de 2021 às 6:08 PM


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’);

Responder

Paulo Roberto Tomasi  12 de fevereiro de 2021 às 12:52 PM


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

63 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

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?

Responder

Rudimar Remontti  18 de fevereiro de 2021 às 9:33 PM



Sim, basta vc prender eles nos “grupos de permissões” que só deixa ele
logar (não discar um pppoe por ex)

Responder

Thiago Lima  19 de agosto de 2020 às 5:12 PM


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í�cos. 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

Responder

Wesley  20 de outubro de 2020 às 11:42 AM


No meu caso gostaria de saber se e possivel determinar horarios para
autenticacao ! Exemplo : Jose so pode logar das 08:00 as 17:00

64 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

Joao das 09:00 as 19:00′

Responder

Rudimar Remontti  20 de outubro de 2020 às 2:50 PM



https://networkradius.com/doc/3.0.10/raddb/mods-available
/logintime.html

Responder

Walisson Gois  19 de maio de 2020 às 12:04 PM


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 ?

Responder

Sergio Souza  6 de abril de 2020 às 10:57 AM


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.

65 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

No Mikrotik RouterOS o tempo entre as rodadas do algorítimo é o 1/16 do


Burst Time.

Responder

Rudimar Remontti  6 de abril de 2020 às 4:29 PM



Obrigado Sergio. Sempre �z o cálculos com essa tabelinha aqui.

Testei em bancada e funciona 100%

1 INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value


2 (NULL, 'jose@provedor.com', 'Mikrotik-Rate-Limit', ':=', '10M/50M 20M/100M 10M/5

Responder

DEIXE UM COMENTÁRIO

Comentário *

Nome * E-mail *

Site

66 of 67 02/01/2023 16:41
Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, ... https://blog.remontti.com.br/4085

Publicar comentário

CONSULTORIA PARTICULAR
Utilitários ➔
Gerador de Senhas
Meu IPv4
Meu IPv6
Converter Bytes
Gerador de CGNAT
Arquivos
Github


Remontti © 2018. Todos os direitos reservados.
   

67 of 67 02/01/2023 16:41

Você também pode gostar