<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivos psk - Remontti</title>
	<atom:link href="https://blog.remontti.com.br/tag/psk/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.remontti.com.br/tag/psk</link>
	<description>rudimar@remontti</description>
	<lastBuildDate>Mon, 09 Jan 2023 14:09:13 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.remontti.com.br/wp-content/uploads/2024/09/icone-rr-80x80.png</url>
	<title>Arquivos psk - Remontti</title>
	<link>https://blog.remontti.com.br/tag/psk</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, Hotspot e Wireless PSK/EAP (Lab Mikrotik/Ubiquiti)</title>
		<link>https://blog.remontti.com.br/4085</link>
					<comments>https://blog.remontti.com.br/4085#comments</comments>
		
		<dc:creator><![CDATA[Rudimar Remontti]]></dc:creator>
		<pubDate>Fri, 13 Mar 2020 20:33:59 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mikrotik]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[autenticação]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[eap]]></category>
		<category><![CDATA[freeradius]]></category>
		<category><![CDATA[hotspot]]></category>
		<category><![CDATA[laboratório]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[pppoe]]></category>
		<category><![CDATA[psk]]></category>
		<category><![CDATA[radius]]></category>
		<category><![CDATA[ubiquiti]]></category>
		<category><![CDATA[wireless]]></category>
		<guid isPermaLink="false">https://blog.remontti.com.br/?p=4085</guid>

					<description><![CDATA[<p>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&#46;&#46;&#46;</p>
<p>O post <a href="https://blog.remontti.com.br/4085">Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, Hotspot e Wireless PSK/EAP (Lab Mikrotik/Ubiquiti)</a> apareceu primeiro em <a href="https://blog.remontti.com.br">Remontti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img fetchpriority="high" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius-3-debian10-integracoes.png" alt="" width="900" height="428" class="alignnone size-full wp-image-4223" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius-3-debian10-integracoes.png 900w, https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius-3-debian10-integracoes-300x143.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius-3-debian10-integracoes-768x365.png 768w" sizes="(max-width: 900px) 100vw, 900px" /><br />
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. </p>
<p>Para demonstrar irei criar um <strong>cenário ilustrativo</strong> de &#8220;nossa rede&#8221; com Mikrotik e Ubiquiti mas basicamente as autenticações podem serem para outras marcas. <em>(Com algumas exceções para os atributos da Mikrotik)</em></p>
<h3>Cenário ilustrativo</h3>
<pre class="remontti-code"># Servidores
FreeRadius: 180.255.0.3

# Concentradores
MK HotSpot: 180.255.1.1
MK PPPoE: 180.255.1.3

# Torre 1 
UBNT AP1 WPA EAP: 10.0.0.2
UBNT AP2 WPA EAP: 10.0.0.3
UBNT AP3 WPA EAP: 10.0.0.4

# Torre 2 
MK AP1 WPA PSK: 10.1.0.2
MK AP2 WPA PSK: 10.1.0.3
MK AP3 WPA PSK: 10.1.0.4</pre>
<p><a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius_debian_10_buster_mikrotik.jpg" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius_debian_10_buster_mikrotik.jpg" alt="" width="1051" height="845" class="alignnone size-full wp-image-4213" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius_debian_10_buster_mikrotik.jpg 1051w, https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius_debian_10_buster_mikrotik-300x241.jpg 300w, https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius_debian_10_buster_mikrotik-1024x823.jpg 1024w, https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius_debian_10_buster_mikrotik-768x617.jpg 768w" sizes="(max-width: 1051px) 100vw, 1051px" /></a></p>
<p>Vou tomar como base a <strong>instalação do FreeRadius</strong> no tutorial: (<strong><em>requisito</em></strong>)<br />
<a href="https://blog.remontti.com.br/4063" rel="noopener noreferrer" target="_blank">Criando um servidor de autenticação com FreeRadius 3.0.x no Debian Buster</a></p>
<h3>Entendo as tabelas do banco de dados</h3>
<p><strong>• nas</strong><br />
A tabela NAS contém dados de hosts clientes, seria uma &#8220;substituição&#8221; 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 <strong>nas</strong> você pode usar o terminal ou então acessando o phpMyAdmin:<br />
Os principais campos são:<br />
‣ nasname: IP Adress (Único)<br />
‣ shortname: Nome (Único)<br />
‣ type: Tipo [other]<br />
‣ secret: Sua &#8220;senha de autorização&#8221;<br />
‣ description: Obs</p>
<p>Em nosso exemplo serão os dois concentradores e os APs das torres que serão inseridos em nossa tabela nas. Ex.:</p>
<pre class="remontti-code">INSERT INTO `nas` (`nasname`, `shortname`, `type`, `ports`, `secret`, `server`, `community`, `description`) VALUES
-- Mikrotik PPPoE Server --
(&#039;180.255.1.1&#039;, &#039;RB-RouterOS-PPPoE&#039;, &#039;other&#039;, NULL, &#039;SEU_SECRET&#039;, NULL, NULL, &#039;RouterOS PPPoE&#039;),
-- Mikrotik Hotspot Server --
(&#039;180.255.1.3&#039;, &#039;RB-RouterOS-HotSpot&#039;, &#039;other&#039;, NULL, &#039;SEU_SECRET&#039;, NULL, NULL, &#039;RouterOS HotSpot&#039;),
-- Torre Ubiquiti --
(&#039;10.0.0.2&#039;, &#039;UBNT-AP-A&#039;, &#039;other&#039;, NULL, &#039;SEU_SECRET&#039;, NULL, NULL, &#039;U-POP1-A&#039;),
(&#039;10.0.0.3&#039;, &#039;UBNT-AP-B&#039;, &#039;other&#039;, NULL, &#039;SEU_SECRET&#039;, NULL, NULL, &#039;U-POP1-B&#039;),
(&#039;10.0.0.4&#039;, &#039;UBNT-AP-C&#039;, &#039;other&#039;, NULL, &#039;SEU_SECRET&#039;, NULL, NULL, &#039;U-POP1-C&#039;),
-- Torre Mikrotik  --
(&#039;10.1.0.2&#039;, &#039;MK-AP-A&#039;, &#039;other&#039;, NULL, &#039;SEU_SECRET&#039;, NULL, NULL, &#039;M-POP2-A&#039;),
(&#039;10.1.0.3&#039;, &#039;MK-AP-B&#039;, &#039;other&#039;, NULL, &#039;SEU_SECRET&#039;, NULL, NULL, &#039;M-POP2-B&#039;),
(&#039;10.1.0.4&#039;, &#039;MK-AP-C&#039;, &#039;other&#039;, NULL, &#039;SEU_SECRET&#039;, NULL, NULL, &#039;M-POP2-B&#039;);</pre>
<p>Algo <strong>extremamente importa</strong> é que sempre que adicionar, editar ou apagar dados da tabela <strong>NAS</strong> é necessário <strong>reiniciar o serviço</strong> FreeRadius para atualizar os hosts clientes, está é a unica tabela que é necessário um restart no serviço.</p>
<pre class="remontti-code"># systemctl restart freeradius</pre>
<p>Dando continuidade as demais tabelas:</p>
<p><strong>• radcheck </strong>&#8211; Armazena os registo de cada usuário com os respectivos atributos associados. Exemplo o usuário vs senha, usuário vs MAC.</p>
<p><strong>• radgroupcheck</strong> – Associa atributos a um determinado grupo de usuários.</p>
<p><strong>• radgroupreply</strong> – Armazena os atributos que são devolvidos a todos os usuários de um grupo.</p>
<p><strong>• radusergroup</strong> &#8211; Associa um usuário a um grupo (radgroupcheck/radgroupreply) simplificando os insert em suas tabelas.</p>
<p><strong>• radreply</strong> – Contém lista de atributos enviados a um único usuário.</p>
<p><strong>• radpostauth</strong> – Armazena informações acerca das respostas enviadas para os usuários (Desativada).</p>
<p><strong>• radacct</strong> &#8211; 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.</p>
<h4>Vamos começar configurando o RouterOS/Mikrotik para fazer autenticações PPPoE (Básico)</h4>
<p>&#8211; Criamos uma <strong>pool</strong> chamada failover (pode ser qualquer nome) nesse primeiro momento. <em>Mais a frente veremos como configurar usando a radippool.</em></p>
<pre class="remontti-code">/ip pool
add name=failover ranges=100.100.100.0/23</pre>
<p>&#8211; Criar um <strong>profile</strong> informando nossa pool, bem como DNS e velocidades. <em>(Tudo isso migraremos para as tabelas mais a frente)</em></p>
<pre class="remontti-code">/ppp profile
add dns-server=8.8.8.8,8.8.4.4 local-address=180.255.1.1 name=Profile50M rate-limit=50M/50M remote-address=failover</pre>
<p>&#8211; Criamos o <strong>PPPoE Server</strong> em uma de suas interfaces que está ouvindo os roteadores que irão &#8220;discar&#8221;, bem como informando o profile que foi<br />
criado.</p>
<pre class="remontti-code">/interface pppoe-server server
add authentication=pap,chap disabled=no keepalive-timeout=30 service-name=pppoe-service default-profile=Profile50M interface=ether2</pre>
<p>&#8211; Configuramos os <strong>usuários</strong> para serem buscado do freeradius, bem como que que o intervalo de atualização das tabelas seja de 5min.</p>
<pre class="remontti-code">/ppp aaa
set interim-update=5m use-radius=yes</pre>
<p>&#8211; Adicionamos nossa <strong>conexão o servidor radius</strong> informando os tipos de autenticações que serão utilizados.</p>
<pre class="remontti-code">/radius
add address=180.255.0.3 secret=&quot;SEU_SECRET&quot; service=ppp</pre>
<p>Vamos autenticar nosso primeiro usuário o jose@provedor.com o &#8220;plano/profile&#8221; 50Mb. Para isso insira em seu banco de dados:</p>
<pre class="remontti-code">INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES
(&#039;jose@provedor.com&#039;, &#039;Cleartext-Password&#039;, &#039;:=&#039;, &#039;senha_do_usuario&#039;);</pre>
<p>Agora configuro em nosso roteador que irá autenticar o pppoe-cliente, exemplo em um outro Mikroik:</p>
<pre class="remontti-code">/interface pppoe-client
add add-default-route=yes disabled=no interface=ether1 name=pppoe-out1 password=senha_do_usuario use-peer-dns=yes user=jose@provedor.com</pre>
<p>Acessando seu concentrador já é possível ver nosso usuário jose@provedor.com autenticado:<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/pppo_cliente.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/pppo_cliente.png" alt="" width="616" height="264" class="alignnone size-full wp-image-4128" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/pppo_cliente.png 616w, https://blog.remontti.com.br/wp-content/uploads/2020/03/pppo_cliente-300x129.png 300w" sizes="(max-width: 616px) 100vw, 616px" /></a></p>
<p>Bom até aí nenhum mistério, mas é <strong>extremamente perigoso você ter um usuário em seu banco de dados radius sem nenhum outro atributo</strong>, 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!</p>
<p>Vamos supor que na conexão com o radius você tenha marcado login, e nos usuário tenha marcado para autenticar via radius <em>(Já vi sistemas bem famosos fazerem isso!)</em></p>
<pre class="remontti-code">/radius
add address=180.255.0.3 secret=&quot;SEU_SECRET&quot; service=ppp,login
/user aaa
set use-radius=yes</pre>
<p><a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/radiu_perigos.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/radiu_perigos.png" alt="" width="677" height="444" class="alignnone size-full wp-image-4129" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/radiu_perigos.png 677w, https://blog.remontti.com.br/wp-content/uploads/2020/03/radiu_perigos-300x197.png 300w" sizes="auto, (max-width: 677px) 100vw, 677px" /></a><br />
Vamos ao teste? Abra seu winbox e tente acessar seu router:<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/radiu_perigos2.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/radiu_perigos2.png" alt="" width="778" height="484" class="alignnone size-full wp-image-4130" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/radiu_perigos2.png 778w, https://blog.remontti.com.br/wp-content/uploads/2020/03/radiu_perigos2-300x187.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/03/radiu_perigos2-768x478.png 768w" sizes="auto, (max-width: 778px) 100vw, 778px" /></a><br />
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] &#8211;> <strong>Default Group</strong> poderia ter sido alterado para <strong>full</strong> 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 <strong>Service-Type</strong> prende o mesmo ao tipo <strong>Login-User</strong>, e na tabela <strong>radreply</strong> insira o atributo <strong>Mikrotik-Group</strong> informando qual o seu grupo de permissões (full/write/read/personalizada)</p>
<pre class="remontti-code">INSERT INTO `radcheck` (`id`, `username`, `attribute`, `op`, `value`) VALUES 
(NULL, &#039;usuario_router&#039;, &#039;Cleartext-Password&#039;, &#039;:=&#039;, &#039;senha_do_usuario&#039;),
(NULL, &#039;usuario_router&#039;, &#039;Service-Type&#039;, &#039;==&#039;, &#039;Login-User&#039;);

INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES
(NULL, &#039;usuario_router&#039;, &#039;Mikrotik-Group&#039;, &#039;:=&#039;, &#039;full&#039;);</pre>
<p><a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_login_mikrotik.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_login_mikrotik.png" alt="" width="590" height="178" class="alignnone size-full wp-image-4131" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_login_mikrotik.png 590w, https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_login_mikrotik-300x91.png 300w" sizes="auto, (max-width: 590px) 100vw, 590px" /></a></p>
<p>Da para melhorar isso? Claro! Podemos dizer que este usuário só pode ser acessado de um determinado IP, ex.: &#8220;180.255.3.33&#8221;</p>
<pre class="remontti-code">INSERT INTO `radcheck` (`id`, `username`, `attribute`, `op`, `value`) VALUES 
(NULL, &#039;usuario_router&#039;, &#039;Calling-Station-Id&#039;, &#039;==&#039;, &#039;180.255.3.33&#039;);</pre>
<p>Também pode informar que este usuário só poderá acessar somente o IP deste concentrador</p>
<pre class="remontti-code">INSERT INTO `radcheck` (`id`, `username`, `attribute`, `op`, `value`) VALUES 
(NULL, &#039;usuario_router&#039;, &#039;NAS-IP-Address&#039;, &#039;==&#039;, &#039;180.255.1.1&#039;);</pre>
<p>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.</p>
<p>Bom para nossa segurança vamos incluir os atributos <strong>Service-Type</strong> com valor <strong>Framed-User</strong> e <strong>Framed-Protocol</strong> com valor <strong>PPP</strong></p>
<pre class="remontti-code">INSERT INTO `radcheck` (`id`, `username`, `attribute`, `op`, `value`) VALUES 
(NULL, &#039;jose@provedor.com&#039;, &#039;Service-Type&#039;, &#039;==&#039;, &#039;Framed-User&#039;),
(NULL, &#039;jose@provedor.com&#039;, &#039;Framed-Protocol&#039;, &#039;:=&#039;, &#039;PPP&#039;);
</pre>
<p>E porque não prender nosso usuário ao MAC Adress dele?</p>
<pre class="remontti-code">INSERT INTO `radcheck` (`id`, `username`, `attribute`, `op`, `value`) VALUES 
(NULL, &#039;jose@provedor.com&#039;, &#039;Calling-Station-Id&#039;, &#039;==&#039;, &#039;08:00:00:00:00:B2&#039;);</pre>
<p>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.</p>
<pre class="remontti-code-plain">MariaDB [radius]&gt; SELECT * FROM `radcheck` WHERE `username` = &#039;jose@provedor.com&#039;;
+----+-------------------+--------------------+----+-------------------+
| id | username          | attribute          | op | value             |
+----+-------------------+--------------------+----+-------------------+
|  1 | jose@provedor.com | Cleartext-Password | := | senha_do_usuario  |
|  2 | jose@provedor.com | Service-Type       | == | Framed-User       |
|  3 | jose@provedor.com | Framed-Protocol    | := | PPP               |
|  4 | jose@provedor.com | Calling-Station-Id | == | 08:00:00:00:00:B2 |
+----+-------------------+--------------------+----+-------------------+
4 rows in set (0.001 sec)</pre>
<p>Para que nosso controle de banda (queues) também seja configurado através do freeradius, o mikrotik possui uma bliblioteca Mikrotik-Rate-Limit.<br />
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.</p>
<pre class="remontti-code">INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES
(NULL, &#039;jose@provedor.com&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;30M/100M&#039;);</pre>
<p>Desconecte o usuário jose@provedor.com para que as novas configurações sejam atribuidas:<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/queues_radius.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/queues_radius.png" alt="" width="473" height="324" class="alignnone size-full wp-image-4132" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/queues_radius.png 473w, https://blog.remontti.com.br/wp-content/uploads/2020/03/queues_radius-300x205.png 300w" sizes="auto, (max-width: 473px) 100vw, 473px" /></a></p>
<p>E se a velocidade utilizar <strong>Burst</strong>? 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.</p>
<pre class="remontti-code">INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES
(NULL, &#039;jose@provedor.com&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;10M/50M 20M/100M 10M/50M 120/120 0&#039;);</pre>
<p><a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/queues__burst_radius.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/queues__burst_radius.png" alt="" width="468" height="328" class="alignnone size-full wp-image-4133" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/queues__burst_radius.png 468w, https://blog.remontti.com.br/wp-content/uploads/2020/03/queues__burst_radius-300x210.png 300w" sizes="auto, (max-width: 468px) 100vw, 468px" /></a></p>
<pre class="remontti-code">INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES
(NULL, &#039;jose@provedor.com&#039;, &#039;Framed-IP-Address&#039;, &#039;:=&#039;, &#039;180.255.0.150&#039;);</pre>
<p>Infelizmente o Mikrotik ainda não compreende o atributo <strong>Delegated-IPv6-Prefix</strong> (IPv6PD da LAN do cliente), no <a href="https://forum.mikrotik.com/viewtopic.php?t=89443" rel="noopener noreferrer" target="_blank">forum</a> 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 <strong>Framed-IPv6-Prefix</strong> (IPv6 WAN) e o <strong>Mikrotik-Delegated-IPv6-Pool</strong> com o nome do da Pool que foi criada manualmente lá no seu router.</p>
<pre class="remontti-code">INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES
-- IPv6 WAN --
(NULL, &#039;jose@provedor.com&#039;, &#039;Framed-IPv6-Prefix&#039;, &#039;:=&#039;, &#039;2001:db8:A:B::/64&#039;),
-- IPv6PD LAN Nome da Pool --
(NULL, &#039;jose@provedor.com&#039;, &#039;Mikrotik-Delegated-IPv6-Pool&#039;, &#039;=&#039;, &#039;nome_da_pool6&#039;);</pre>
<p>Lembrando q Delegated-IPv6-Prefix não funciona no Mikrotik (hj), oremos para que um dia seja implementado <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f61b.png" alt="😛" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ficaria assim:</p>
<pre class="remontti-code">INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES
(NULL, &#039;jose@provedor.com&#039;, &#039;Delegated-IPv6-Prefix&#039;, &#039;=&#039;, &#039;2001:db8:C::/56&#039;);</pre>
<p>Se você deseja saber mais acesse o tutorial:<br />
<a href="https://blog.remontti.com.br/3931" rel="noopener noreferrer" target="_blank">Como entregar IPv6+IPv4 no Mikrotik/RouterOS através de PPPoE/DHCPv6 PD e registrando os logs em um banco de dados</a></p>
<p><strong>Entregando os DNS pelo radius</strong>, 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 <strong>MS-Primary-DNS-Server</strong> e <strong>MS-Secondary-DNS-Server</strong>.</p>
<pre class="remontti-code">INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES
(NULL, &#039;jose@provedor.com&#039;, &#039;MS-Primary-DNS-Server&#039;, &#039;:=&#039;, &#039;1.1.1.1&#039;),
(NULL, &#039;jose@provedor.com&#039;, &#039;MS-Secondary-DNS-Server&#039;, &#039;:=&#039;, &#039;9.9.9.9&#039;);</pre>
<p><a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_pppoe_cliente_dns.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_pppoe_cliente_dns.png" alt="" width="837" height="469" class="alignnone size-full wp-image-4134" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_pppoe_cliente_dns.png 837w, https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_pppoe_cliente_dns-300x168.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_pppoe_cliente_dns-768x430.png 768w" sizes="auto, (max-width: 837px) 100vw, 837px" /></a></p>
<p>Fazendo um SELECT na tabelas radreply temos 4 atributos vinculados a configurações que serão entregue ao usuário jose@provedor.com.</p>
<pre class="remontti-code-plain">MariaDB [radius]&gt; SELECT * FROM `radreply` WHERE `username` = &#039;jose@provedor.com&#039;;
+----+-------------------+-------------------------+----+----------------------------------+
| id | username          | attribute               | op | value                            |
+----+-------------------+-------------------------+----+----------------------------------+
|  3 | jose@provedor.com | Mikrotik-Rate-Limit     | := | 10M/50M 20M/100M 10M/50M 120/120 |
|  6 | jose@provedor.com | MS-Primary-DNS-Server   | := | 1.1.1.1                          |
|  7 | jose@provedor.com | MS-Secondary-DNS-Server | := | 9.9.9.9                          |
|  8 | jose@provedor.com | Framed-IP-Address       | := | 180.255.0.150                    |
+----+-------------------+-------------------------+----+----------------------------------+
4 rows in set (0.001 sec)</pre>
<p>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 &#8220;failover&#8221; 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.</p>
<pre class="remontti-code"># No seu RouteOS
/ppp profile set Profile50M rate-limit=100k/100k</pre>
<p><strong>Iremos ver agora como buscar nosso IPv4 através da pool do radius, tabela <strong>radippool</strong></strong><br />
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.</p>
<pre class="remontti-code">INSERT INTO `radippool` 
(`pool_name`, `framedipaddress`, `calledstationid`, `callingstationid`, `username`, `pool_key`) VALUES
(&#039;pool_valido&#039;, &#039;180.255.3.128&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;0&#039;),
(&#039;pool_valido&#039;, &#039;180.255.3.129&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;0&#039;),
(&#039;pool_valido&#039;, &#039;180.255.3.130&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;0&#039;),
(&#039;pool_bloq&#039;,&#039;100.127.0.0&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;0&#039;),
(&#039;pool_bloq&#039;,&#039;100.127.0.1&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;0&#039;),
(&#039;pool_bloq&#039;,&#039;100.127.0.2&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;0&#039;);</pre>
<p>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. </p>
<pre class="remontti-code">DELETE FROM `radreply` WHERE `username` LIKE &#039;jose@provedor.com&#039; AND `attribute` LIKE &#039;Framed-IP-Address&#039;</pre>
<p>Para entregar ao usuário jose@provedor.com a pool_valido utilizaremos o atributo <strong>Pool-Name</strong></p>
<pre class="remontti-code">INSERT INTO `radcheck` (`id`, `username`, `attribute`, `op`, `value`) VALUES 
(NULL, &#039;jose@provedor.com&#039;, &#039;Pool-Name&#039;, &#039;:=&#039;, &#039;pool_valido&#039;);</pre>
<p>Desconectamos nosso usuário para ver qual IP ele vai receber.</p>
<p>RouterOS</p>
<pre class="remontti-code-plain">[usuario_router@PPP-SERVER-LAB] &gt; ppp active print
Flags: R - radius
 #   NAME         SERVICE CALLER-ID         ADDRESS         UPTIME   ENCODING 
 0 R jose@prov... pppoe   08:00:00:00:00:B2 45.250.3.129    7m51s</pre>
<p>Radius</p>
<pre class="remontti-code-plain">MariaDB [radius]&gt; SELECT pool_name,framedipaddress,username,pool_key FROM `radippool`;
+-------------+-----------------+-------------------+-------------------+
| pool_name   | framedipaddress | username          | pool_key          |
+-------------+-----------------+-------------------+-------------------+
| pool_valido | 45.250.3.128    |                   | 0                 |
| pool_valido | 45.250.3.129    | jose@provedor.com | 08:00:00:00:00:B2 |
| pool_valido | 45.250.3.130    |                   | 0                 |
| pool_bloq   | 100.127.0.0     |                   | 0                 |
| pool_bloq   | 100.127.0.1     |                   | 0                 |
| pool_bloq   | 100.127.0.2     |                   | 0                 |
+-------------+-----------------+-------------------+-------------------+</pre>
<p>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: <a href="https://blog.remontti.com.br/4063" rel="noopener noreferrer" target="_blank">Criando um servidor de autenticação com FreeRadius 3.0.x no Debian Buster</a><br />
Se você quiser bloquear o cliente basta alterar sua Pool-Name para pool_bloq. </p>
<p>Talvez você esteja pensando: <em>&#8220;Putz mas para cada usuário vai ter vários inserts!&#8221;</em>. E é por isso que as tabelas <strong>radgroupcheck</strong> , <strong>radgroupreply</strong> e <strong>radusergroup</strong> existem para simplificar. É nela então que vamos criar nossos &#8220;planos&#8221;, 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.</p>
<p>Vamos então criar nosso <strong>Plano 10MB</strong>. Teremos um novo atributo que acho importante o uso, o <strong>Acct-Interim-Interval</strong>, ele se &#8220;equivale&#8221; ao interim-update=5m lá do mikrotik &#8220;/ppp aaa&#8221;, 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.</p>
<pre class="remontti-code">INSERT INTO `radgroupcheck` (`groupname`, `attribute`, `op`, `value`) VALUES
(&#039;PLANO_10MB&#039;, &#039;Service-Type&#039;, &#039;==&#039;, &#039;Framed-User&#039;),
(&#039;PLANO_10MB&#039;, &#039;Framed-Protocol&#039;, &#039;:=&#039;, &#039;PPP&#039;),
(&#039;PLANO_10MB&#039;, &#039;Pool-Name&#039;, &#039;:=&#039;, &#039;pool_valido&#039;);

INSERT INTO `radgroupreply` (`groupname`, `attribute`, `op`, `value`) VALUES
(&#039;PLANO_10MB&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;),
(&#039;PLANO_10MB&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;5M/10M&#039;),
(&#039;PLANO_10MB&#039;, &#039;MS-Primary-DNS-Server&#039;, &#039;:=&#039;, &#039;9.9.9.9&#039;),
(&#039;PLANO_10MB&#039;, &#039;MS-Secondary-DNS-Server&#039;, &#039;:=&#039;, &#039;149.112.112.112&#039;);</pre>
<p>Aproveitando irei criar um Plano de bloqueio.</p>
<pre class="remontti-code">INSERT INTO `radgroupcheck` (`groupname`, `attribute`, `op`, `value`) VALUES
(&#039;BLOQUEADO&#039;, &#039;Service-Type&#039;, &#039;==&#039;, &#039;Framed-User&#039;),
(&#039;BLOQUEADO&#039;, &#039;Framed-Protocol&#039;, &#039;:=&#039;, &#039;PPP&#039;),
(&#039;BLOQUEADO&#039;, &#039;Pool-Name&#039;, &#039;:=&#039;, &#039;pool_bloq&#039;);

INSERT INTO `radgroupreply` (`groupname`, `attribute`, `op`, `value`) VALUES
(&#039;BLOQUEADO&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;),
(&#039;BLOQUEADO&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;666k/666k&#039;),
(&#039;BLOQUEADO&#039;, &#039;MS-Primary-DNS-Server&#039;, &#039;:=&#039;, &#039;8.8.8.8&#039;),
(&#039;BLOQUEADO&#039;, &#039;MS-Secondary-DNS-Server&#039;, &#039;:=&#039;, &#039;8.8.4.4&#039;);</pre>
<p>Para melhor entendimento e simplificar vamos apagar do usuário jose@provedor.com das tabelas radcheck e radreply.</p>
<pre class="remontti-code">DELETE FROM `radcheck` WHERE `username` LIKE &#039;jose@provedor.com&#039;;
DELETE FROM `radreply` WHERE `username` LIKE &#039;jose@provedor.com&#039;;</pre>
<p>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:</p>
<pre class="remontti-code">INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES
(&#039;jose@provedor.com&#039;, &#039;Cleartext-Password&#039;, &#039;:=&#039;, &#039;senha_do_usuario&#039;),
(&#039;jose@provedor.com&#039;, &#039;Calling-Station-Id&#039;, &#039;==&#039;, &#039;08:00:00:00:00:B2&#039;);</pre>
<p>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?!</p>
<pre class="remontti-code">INSERT INTO `radusergroup` (`username`, `groupname`) VALUES 
(&#039;jose@provedor.com&#039;, &#039;PLANO_10MB&#039;);</pre>
<p>Desconecte o usuário e verifique se o mesmo irá receber as novas configurações com base em grupos.<br />
PPPoE Server: IP Randômico [OK] / Controle de Banda [OK]<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mikrotik_pppoe_server.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mikrotik_pppoe_server.png" alt="" width="621" height="235" class="alignnone size-full wp-image-4144" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mikrotik_pppoe_server.png 621w, https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mikrotik_pppoe_server-300x114.png 300w" sizes="auto, (max-width: 621px) 100vw, 621px" /></a></p>
<p>PPPoE Cliente: IP [OK] / DNS [OK]<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mikrotik_pppoe_client.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mikrotik_pppoe_client.png" alt="" width="545" height="416" class="alignnone size-full wp-image-4145" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mikrotik_pppoe_client.png 545w, https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mikrotik_pppoe_client-300x229.png 300w" sizes="auto, (max-width: 545px) 100vw, 545px" /></a></p>
<p>Agora para bloquear o usuário basta fazer um <strong>UPDATE</strong>  trocando o plano do usuário para <strong>BLOQUEADO</strong>.</p>
<pre class="remontti-code">UPDATE `radusergroup` SET `groupname` = &#039;BLOQUEADO&#039; WHERE `username` LIKE &#039;jose@provedor.com&#039;;</pre>
<p>Desconectamos novamente e verificamos as configurações recebidas.<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mk_bloqueio_server.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mk_bloqueio_server.png" alt="" width="607" height="235" class="alignnone size-full wp-image-4147" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mk_bloqueio_server.png 607w, https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mk_bloqueio_server-300x116.png 300w" sizes="auto, (max-width: 607px) 100vw, 607px" /></a></p>
<p><a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mk_bloqueio_cliente.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mk_bloqueio_cliente.png" alt="" width="534" height="417" class="alignnone size-full wp-image-4146" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mk_bloqueio_cliente.png 534w, https://blog.remontti.com.br/wp-content/uploads/2020/03/radius_mk_bloqueio_cliente-300x234.png 300w" sizes="auto, (max-width: 534px) 100vw, 534px" /></a></p>
<p>Podemos ver que nossas regras estão funcionado. Vale lembrar que se for bloquear um usuário qual esteja com o atributo <strong>Framed-IP-Address</strong> 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.</p>
<p>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.</p>
<p>Vamos ver como estão nossas tabelas até o momento:</p>
<pre class="remontti-code-plain">MariaDB [radius]&gt; SELECT * FROM `radgroupcheck`;
+----+------------+-----------------+----+-------------+
| id | groupname  | attribute       | op | value       |
+----+------------+-----------------+----+-------------+
|  1 | PLANO_10MB | Service-Type    | == | Framed-User |
|  2 | PLANO_10MB | Framed-Protocol | := | PPP         |
|  3 | PLANO_10MB | Pool-Name       | := | pool_valido |
|  4 | BLOQUEADO  | Service-Type    | == | Framed-User |
|  5 | BLOQUEADO  | Framed-Protocol | := | PPP         |
|  6 | BLOQUEADO  | Pool-Name       | := | pool_bloq   |
+----+------------+-----------------+----+-------------+
6 rows in set (0.000 sec)

MariaDB [radius]&gt; SELECT * FROM `radgroupreply`;
+----+------------+-------------------------+----+-----------------+
| id | groupname  | attribute               | op | value           |
+----+------------+-------------------------+----+-----------------+
|  1 | PLANO_10MB | Acct-Interim-Interval   | := | 300             |
|  2 | PLANO_10MB | Mikrotik-Rate-Limit     | := | 5M/10M          |
|  3 | PLANO_10MB | MS-Primary-DNS-Server   | := | 9.9.9.9         |
|  4 | PLANO_10MB | MS-Secondary-DNS-Server | := | 149.112.112.112 |
|  5 | BLOQUEADO  | Acct-Interim-Interval   | := | 300             |
|  6 | BLOQUEADO  | Mikrotik-Rate-Limit     | := | 666k/666k       |
|  7 | BLOQUEADO  | MS-Primary-DNS-Server   | := | 8.8.8.8         |
|  8 | BLOQUEADO  | MS-Secondary-DNS-Server | := | 8.8.4.4         |
+----+------------+-------------------------+----+-----------------+
8 rows in set (0.000 sec)

MariaDB [radius]&gt; SELECT * FROM `radcheck` WHERE `username` = &#039;jose@provedor.com&#039;;
+----+-------------------+--------------------+----+-------------------+
| id | username          | attribute          | op | value             |
+----+-------------------+--------------------+----+-------------------+
| 15 | jose@provedor.com | Cleartext-Password | := | senha_do_usuario  |
| 16 | jose@provedor.com | Calling-Station-Id | == | 08:00:00:00:00:B2 |
+----+-------------------+--------------------+----+-------------------+
2 rows in set (0.000 sec)

MariaDB [radius]&gt; SELECT * FROM `radusergroup`;
+----+-------------------+-----------+----------+
| id | username          | groupname | priority |
+----+-------------------+-----------+----------+
|  1 | jose@provedor.com | BLOQUEADO |        1 |
+----+-------------------+-----------+----------+
1 row in set (0.000 sec)</pre>
<h3>Simultaneous-Use</h3>
<p>Existe um atributo chamado <strong>Simultaneous-Use</strong> qual você pode limitar o número de vezes que aquele usuário pode autenticar, aplicando na radgroupcheck ficaria: </p>
<pre class="remontti-code">INSERT INTO `radgroupcheck` (`groupname`, `attribute`, `op`, `value`) VALUES
(&#039;PLANO_X&#039;, &#039;Simultaneous-Use&#039;, &#039;:=&#039;, &#039;1&#039;);</pre>
<p>Porém para funcionar o Simultaneous-Use é necessário ajustes em dois arquivos:<br />
 &#8211; /etc/freeradius/3.0/sites-enabled/inner-tunnel<br />
 &#8211; /etc/freeradius/3.0/sites-enabled/default<br />
Incluindo dentro de <strong>session</strong> o valor <strong>radutmp</strong></p>
<pre class="remontti-code-plain">session { 
    radutmp
    sql
}</pre>
<p>Mas <strong>é extremamente importante você saber</strong> que qualquer falha de comunicação entre o roteador e o servidor a conexão ira ficar &#8220;<strong>pendurada</strong>&#8220;, 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 <strong>one-session-per-host=yes</strong> 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 <strong>radippool</strong> vindo de diferentes <strong>nasipaddress</strong> e podendo executar uma ação, ex envia um alerta de gatonet <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f61b.png" alt="😛" class="wp-smiley" style="height: 1em; max-height: 1em;" /> </p>
<h3>radippool Duplicando IPs</h3>
<p>Um outro ponto frequente que me perguntam é sobre a <strong>radippool e o problema com duplicidades de IPs</strong>. 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 <strong>expiry_time</strong> que por padrão é de <strong>1 hora</strong>.</p>
<p>Lembra que configuramos o <strong>interim-update</strong> no mikrotik e <strong>Acct-Interim-Interval</strong> na tabela radgroupreply qual montamos o &#8220;plano&#8221; 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. </p>
<p>Oque fazer então? Este tempo pode ser ajustado no arquivo /etc/freeradius/3.0/mods-available/sqlippool na variável <strong>lease_duration = 3600</strong>, 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. </p>
<pre class="remontti-code"># sed -i &#039;s/lease_duration = 3600/lease_duration = 600/&#039; /etc/freeradius/3.0/mods-available/sqlippool
# systemctl restart freeradius</pre>
<p>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.</p>
<p>Porém é interessante você ajustar as querys em <strong>/etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf</strong> 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)</p>
<p>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 <em>(Na minha situação quando o concentrador não tem comunicação com o freeradius o cliente também não tem)</em> 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:</p>
<p><a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/script_radius.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/script_radius.png" alt="" width="526" height="587" class="alignnone size-full wp-image-4150" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/script_radius.png 526w, https://blog.remontti.com.br/wp-content/uploads/2020/03/script_radius-269x300.png 269w" sizes="auto, (max-width: 526px) 100vw, 526px" /></a></p>
<p>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.</p>
<pre class="remontti-code">/system scheduler
add interval=5m name=checa-radius on-event=&quot;{ \r\
    \n  :local cont 0\r\
    \n  :local services [/interface pppoe-server server print count-only]\r\
    \n  /interface pppoe-server server print\r\
    \n  :if ([/ping 180.255.0.3 count=10] = 0) do={\r\
    \n    :log error message=\&quot;COMUNICACAO RADIUS [ OFF ]\&quot;;\r\
    \n    :while (\$cont &lt; \$services) do={\r\
    \n      /interface pppoe-server server disable numbers=\$cont\r\
    \n      /interface pppoe-server server enable numbers=\$cont\r\
    \n      :set cont (\$cont+1)\r\
    \n    }\r\
    \n  }\r\
    \n}&quot; policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-time=startup</pre>
<pre class="remontti-code-plain">{ 
  :local cont 0
  :local services [/interface pppoe-server server print count-only]
  /interface pppoe-server server print
  :if ([/ping 180.255.0.3 count=10] = 0) do={
    :log error message=&quot;COMUNICACAO RADIUS [ OFF ]&quot;;
    :while ($cont &lt; $services) do={
      /interface pppoe-server server disable numbers=$cont
      /interface pppoe-server server enable numbers=$cont
      :set cont ($cont+1)
    }
  }
}</pre>
<h3>Personalizando a alocação dos IPS para escolher uma Pool padrão quando esgotar uma Pool-Name. `Opcional`</h3>
<p>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 <strong>allocate_find</strong> 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.</p>
<p>Se desejar fazer isso vamos editar o /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf.</p>
<pre class="remontti-code"># vim /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf</pre>
<p>Comentando as linhas atuais da variável <strong>allocate_find</strong>:</p>
<pre class="remontti-code">##allocate_find = &quot;\
##        SELECT framedipaddress FROM ${ippool_table} \
##        WHERE pool_name = &#039;%{control:Pool-Name}&#039; \
##        AND expiry_time IS NULL \
##        ORDER BY \
##                RAND() \
##        LIMIT 1 \
##        FOR UPDATE&quot;</pre>
<p>E adicionando as seguintes: (Perceba que o nome da pool alternativa/failover/backup é <strong>pool_cgnat</strong>)</p>
<pre class="remontti-code">allocate_find = &quot;\
    SELECT framedipaddress FROM ${ippool_table} \
    WHERE ( \
    CASE WHEN (SELECT COUNT(framedipaddress) FROM ${ippool_table} WHERE pool_name = &#039;%{control:Pool-Name}&#039; AND expiry_time IS NULL LIMIT 1) &gt; 0 THEN \
    (pool_name = &#039;%{control:Pool-Name}&#039; AND expiry_time IS NULL) \
    ELSE \
    (pool_name = &#039;pool_cgnat&#039; AND expiry_time IS NULL) \
    END) \
    ORDER BY RAND() \
    LIMIT 1 \
    FOR UPDATE&quot;
</pre>
<p>Lembre-se que toda a ateração nos arquivos de configurações é necessário reiniciar o serviço.</p>
<pre class="remontti-code"># systemctl restart freeradius</pre>
<p>Você vai precisar adicionar agora todos seus IPs de CGNAT (<a rel="noopener noreferrer" target="_blank" href="https://blog.remontti.com.br/wp-content/uploads/2020/03/radippool_cgnat.sql_.txt">cgnat.sql</a>) ex.:</p>
<pre class="remontti-code">INSERT INTO `radippool` 
(`pool_name`, `framedipaddress`, `nasipaddress`, `calledstationid`, `callingstationid`, `expiry_time`, `username`, `pool_key`) VALUES
(&#039;pool_cgnat&#039;, &#039;100.64.0.0&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;pool_cgnat&#039;, &#039;100.64.0.1&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;pool_cgnat&#039;, &#039;100.64.0.2&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;pool_cgnat&#039;, &#039;100.64.0.3&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;);</pre>
<p>Agora em seu laboratório você pode deixar apenas 1 IP válido e autenticar mais usuários para ver se a regra funcionou.</p>
<h3> Autenticação Wireless</h3>
<p>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!!!<br />
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.</p>
<h3>WPA-PSK</h3>
<p>É 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 <strong>senha exclusiva</strong> só para ela, vou começar explicando como fazer isso com senhas PSK com o atributo <strong>Mikrotik-Wireless-PSK</strong> da Mikrotik.</p>
<p>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.</p>
<p>Crie um novo profile de segurança</p>
<pre class="remontti-code">/interface wireless security-profiles 
add name=WPA2-PSK-Radius \
    mode=dynamic-keys management-protection=allowed \
    authentication-types=wpa2-psk radius-called-format=ssid \
    radius-mac-authentication=yes \
    wpa2-pre-shared-key=dZluej6SCdcFvRWd</pre>
<p><a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/psk-mk-radius.jpeg" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/psk-mk-radius.jpeg" alt="" width="870" height="429" class="alignnone size-full wp-image-4188" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/psk-mk-radius.jpeg 870w, https://blog.remontti.com.br/wp-content/uploads/2020/03/psk-mk-radius-300x148.jpeg 300w, https://blog.remontti.com.br/wp-content/uploads/2020/03/psk-mk-radius-768x379.jpeg 768w" sizes="auto, (max-width: 870px) 100vw, 870px" /></a></p>
<p>Configurando a interface wireless "<strong>wlan1</strong>" setamos o <strong>security-profile</strong> para <strong>WPA2-PSK-Radius</strong> que acabamos de criar e darei o nome do sinal (ssid) de <strong>SSID-PSK-Radius</strong>.</p>
<pre class="remontti-code">/interface wireless
set [ find default-name=wlan1 ] \
    disabled=no mode=ap-bridge \
    security-profile=WPA2-PSK-Radius \
    ssid=SSID-PSK-Radius</pre>
<p>Fizemos a nossa conexão com o radius, informando que vamos usar neste caso apenas o serviço wireless.</p>
<pre class="remontti-code">/radius
add address=180.255.0.3 secret=SEU_SECRET service=wireless</pre>
<p>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:</p>
<pre class="remontti-code">INSERT INTO `nas` (`nasname`, `shortname`, `type`, `ports`, `secret`, `server`, `community`, `description`) VALUES
(&#039;10.1.0.4&#039;, &#039;MK-AP-C&#039;, &#039;other&#039;, NULL, &#039;SEU_SECRET&#039;, NULL, NULL, &#039;SSID-PSK-Radius&#039;);</pre>
<pre class="remontti-code"># systemctl restart freeradius</pre>
<p>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:</p>
<pre class="remontti-code-plain">(16)   Service-Type = Framed-User
(16)   NAS-Port-Id = &quot;wlan1&quot;
(16)   NAS-Port-Type = Wireless-802.11
(16)   User-Name = &quot;44:45:4D:45:4B:4D&quot;
(16)   Calling-Station-Id = &quot;44-45-4D-45-4B-4D&quot;
(16)   Called-Station-Id = &quot;SSID-PSK-Radius&quot;
(16)   User-Password = &quot;&quot;
(16)   NAS-Identifier = &quot;MikroTik&quot;
(16)   NAS-IP-Address = 10.1.0.4</pre>
<p>Podemos observar que chegaram informações como o nome da interface wireless <strong>NAS-Port-Id = "wlan1"</strong>, o tipo da autenticação <strong>NAS-Port-Type = Wireless-802.11</strong>, o mac do dispositivo <strong>User-Name = "44:45:4D:45:4B:4D"</strong>, o nome do sinal <strong>Called-Station-Id = "SSID-PSK-Radius"</strong>, o nome da router (system -> identity) <strong>NAS-Identifier = "MikroTik"</strong>, e o IP <strong>NAS-IP-Address = 10.1.0.4</strong>.</p>
<p>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!</p>
<p>Primeiro atributo então é os Mikrotik-Wireless-PSK que vamos gravar na radreply, logo nosso usuário será nosso MAC. (Estou usando o <strong>MAC Format</strong> 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`)</p>
<pre class="remontti-code">INSERT INTO `radreply` (`username`, `attribute`, `op`, `value`) VALUES
(&#039;44:45:4D:45:4B:4D&#039;, &#039;Mikrotik-Wireless-PSK&#039;, &#039;:=&#039;, &#039;3ZKEG5mMq0ZRSUQy&#039;); </pre>
<p>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 <em>"SSID-PSK-Radius"</em>.</p>
<pre class="remontti-code">INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES
(&#039;44:45:4D:45:4B:4D&#039;, &#039;Auth-Type&#039;, &#039;:=&#039;, &#039;Accept&#039;),
(&#039;44:45:4D:45:4B:4D&#039;, &#039;NAS-Port-Type&#039;, &#039;==&#039;, &#039;Wireless-802.11&#039;),
(&#039;44:45:4D:45:4B:4D&#039;, &#039;Called-Station-Id&#039;, &#039;==&#039;, &#039;SSID-PSK-Radius&#039;);</pre>
<p>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.</p>
<h3>WPA-EAP</h3>
<p>No mikrotik:<br />
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.</p>
<pre class="remontti-code">/interface wireless security-profiles
add authentication-types=wpa2-eap \
    management-protection=allowed mode=dynamic-keys \
    name=WPA2-EAP-Radius radius-called-format=ssid \
    radius-eap-accounting=yes radius-mac-format=XXXXXXXXXXXX\
    supplicant-identity=MikroTik
</pre>
<p>Ajuste sua interface</p>
<pre class="remontti-code">/interface wireless
set [ find default-name=wlan1 ] disabled=no \
    mode=ap-bridge security-profile=WPA2-EAP-Radius ssid=WPA2-EAP-Radius</pre>
<p>Conecte ao radius.</p>
<pre class="remontti-code">/radius
add address=180.255.0.3 secret=SEU_SECRET service=wireless</pre>
<p>No Ubiquiti (Não tem suporte PSK com Radius):<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/screencapture-172-30-67-194-2020-03-12-14_42_47.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/screencapture-172-30-67-194-2020-03-12-14_42_47.png" alt="" width="987" height="530" class="alignnone size-full wp-image-4194" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/screencapture-172-30-67-194-2020-03-12-14_42_47.png 987w, https://blog.remontti.com.br/wp-content/uploads/2020/03/screencapture-172-30-67-194-2020-03-12-14_42_47-300x161.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/03/screencapture-172-30-67-194-2020-03-12-14_42_47-768x412.png 768w" sizes="auto, (max-width: 987px) 100vw, 987px" /></a></p>
<p>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. </p>
<p>Inseremos então nosso user EAP no banco de dados.</p>
<pre class="remontti-code">INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES
(&#039;44454D454B4D&#039;, &#039;Cleartext-Password&#039;, &#039;:=&#039;, &#039;enIkMVfhq3WIqyKq&#039;),
(&#039;44454D454B4D&#039;, &#039;Auth-Type&#039;, &#039;:=&#039;, &#039;eap&#039;);</pre>
<h2>Hotspot</h2>
<p>Vamos falar primeiro do módulo contador (<strong><a href="https://wiki.freeradius.org/modules/Rlm_sqlcounter" rel="noopener noreferrer" target="_blank">sqlcounter</a></strong>). O módulo sqlcounter permite um contador de pacotes usando registros contábeis gravados no banco de dados. </p>
<p>Com este módulo é possível criar alguns cenários de interessantes no mundo do Hotspot, exemplo:<br />
 - limitar o tempo de conexão (ex.: 2h por dia/mês/único vez)</p>
<p>Se desejar habilite o mod sqlcounter.</p>
<pre class="remontti-code"># ln -s /etc/freeradius/3.0/mods-available/sqlcounter /etc/freeradius/3.0/mods-enabled/sqlcounter</pre>
<p>Adicione em instantiate {...} dailycounter, monthlycounter e noresetcounter do arquivo /etc/freeradius/3.0/radiusd.conf</p>
<pre class="remontti-code"># sed -i &#039;683i\        dailycounter&#039; /etc/freeradius/3.0/radiusd.conf
# sed -i &#039;684i\        monthlycounter&#039; /etc/freeradius/3.0/radiusd.conf
# sed -i &#039;685i\        noresetcounter&#039; /etc/freeradius/3.0/radiusd.conf</pre>
<p>Adicione em authorize {...} dailycounter, monthlycounter e noresetcounter do arquivo /etc/freeradius/3.0/sites-enabled/default</p>
<pre class="remontti-code"># sed -i &#039;406i\        dailycounter&#039; /etc/freeradius/3.0/sites-enabled/default
# sed -i &#039;407i\        monthlycounter&#039; /etc/freeradius/3.0/sites-enabled/default
# sed -i &#039;408i\        noresetcounter&#039; /etc/freeradius/3.0/sites-enabled/default</pre>
<p>Restart o freeradius</p>
<pre class="remontti-code"># systemctl restart freeradius</pre>
<p>Aproveitando o Mk hAp do nosso Lab vou criar um hotspot server.</p>
<p>Com o comando /ip hotspot setup  demos um inicio a um "wizard" que fará toda as configurações automaticamente.</p>
<pre class="remontti-code">/ip hotspot setup  
Select interface to run HotSpot on 

hotspot interface: wlan1 #--&gt; Defina a interface que vai rodar o server
Set HotSpot address for interface 

local address of network: 10.5.50.1/24 #--&gt; Informe o IP/mascara da rede
masquerade network: yes #--&gt; Ativa o NAT já para a classe
Set pool for HotSpot addresses 

address pool of network: 10.5.50.2-10.5.50.254 #--&gt; Range da pool de IPs 
Select hotspot SSL certificate 

select certificate: no #--&gt; Sem certificado
Select SMTP server 

ip address of smtp server: 0.0.0.0 #--&gt; Pode deixar 0.0.0.0
Setup DNS configuration 

dns servers: 8.8.8.8,1.1.1.1 #--&gt; Servidores DNS
DNS name of local hotspot server 

dns name: hotspot.remontti.com.br #--&gt; Domínio qualquer (Se acessado irá mostrar o status)
Create local hotspot user 

name of local hotspot user: admin #--&gt; Vai ser necessário criar um usuario
password for the user: admin #--&gt; que vamos remover</pre>
<p>Remova o usuário admin criado no wizard, defina o porfile para usar o radius e na conexão com o radius marque hotspot.</p>
<pre class="remontti-code">/ip hotspot user remove admin 

/ip hotspot profile
set hsprof1 use-radius=yes

/radius
add address=180.255.0.3 secret=SEU_SECRET service=hotspot</pre>
<p>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é.</p>
<pre class="remontti-code">/ip hotspot walled-garden ip
add action=accept disabled=no \
    dst-address=180.255.0.3 !dst-port !protocol !src-address
add action=accept disabled=no !dst-address \
    !dst-address-list dst-port=53 protocol=udp \
    !src-address !src-address-list</pre>
<p>Com nosso AP configurado acessamos:<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/hotspot_mikrotik_login_radius.jpg" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/hotspot_mikrotik_login_radius.jpg" alt="" width="300" height="362" class="alignnone size-full wp-image-4209" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/hotspot_mikrotik_login_radius.jpg 300w, https://blog.remontti.com.br/wp-content/uploads/2020/03/hotspot_mikrotik_login_radius-249x300.jpg 249w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Vou tentar logar com tadeu@remontti.com.br com qualquer senha e visualizar no freeradius -X (debug) o que chega lá:</p>
<pre class="remontti-code-plain">(6)   NAS-Port-Type = Wireless-802.11
(6)   Calling-Station-Id = &quot;44:45:4D:45:4B:4D&quot;
(6)   Called-Station-Id = &quot;hotspot1&quot;
(6)   NAS-Port-Id = &quot;wlan1&quot;
(6)   User-Name = &quot;tadeu@remontti.com.br&quot;
(6)   NAS-Port = 2151677963
(6)   Acct-Session-Id = &quot;8040000b&quot;
(6)   Framed-IP-Address = 10.5.50.254
(6)   Mikrotik-Host-IP = 10.5.50.254
(6)   CHAP-Challenge = 0xaf9b9672cf915d68fd7244fc43035d7a
(6)   CHAP-Password = 0x647d5c258b16ca7841803bfb3b0d376b79
(6)   Service-Type = Login-User
(6)   WISPr-Logoff-URL = &quot;http://10.5.50.1/logout&quot;
(6)   NAS-Identifier = &quot;LAB&quot;
(6)   NAS-IP-Address = 180.255.1.3
</pre>
<p>Vimos que chegaram alguns valores interessantes, podemos fazer filtro com MAC <strong>Calling-Station-Id = "44:45:4D:45:4B:4D"</strong>, nome do serviço do hotspot <strong>Called-Station-Id = "hotspot1"</strong>, nome da interface, nome da interface <strong>NAS-Port-Id = "wlan1"</strong> entre outros.</p>
<p>Agora criamos nosso usuário na tabela radcheck.</p>
<pre class="remontti-code">INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES
(&#039;tadeu@remontti.com.br&#039;, &#039;Cleartext-Password&#039;, &#039;:=&#039;, &#039;enIkMVfhq3WIqyKq&#039;);</pre>
<p>Vamos ao teste:<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/login_ok.jpg" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/login_ok.jpg" alt="" width="300" height="296" class="alignnone size-full wp-image-4210" /></a></p>
<p><a href="https://blog.remontti.com.br/wp-content/uploads/2020/03/hotspot_radius.png" data-rel="lightbox-gallery-WufobMGN" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/hotspot_radius.png" alt="" width="795" height="255" class="alignnone size-full wp-image-4211" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/hotspot_radius.png 795w, https://blog.remontti.com.br/wp-content/uploads/2020/03/hotspot_radius-300x96.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/03/hotspot_radius-768x246.png 768w" sizes="auto, (max-width: 795px) 100vw, 795px" /></a></p>
<p>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".<br />
1º - Plano 30 minutos ao diários - Velocidade 2Mb/8Mb<br />
3º - Plano 7 horas por mês - Velocidade 3Mb/10Mb<br />
2º - Plano 2 Horas unica - Velocidade 8Mb/20Mb<br />
4º - Plano Ilimitado - Velocidade 10Mb/30Mb</p>
<pre class="remontti-code">INSERT INTO `radgroupcheck` (`groupname`, `attribute`, `op`, `value`) VALUES
(&#039;30MIN-DIA&#039;, &#039;Max-Daily-Session&#039;, &#039;:=&#039;, &#039;1800&#039;),
(&#039;30MIN-DIA&#039;, &#039;NAS-Port-Type&#039;, &#039;==&#039;, &#039;Wireless-802.11&#039;),
(&#039;7h-MES&#039;, &#039;Max-Monthly-Session&#039;, &#039;:=&#039;, &#039;25200&#039;),
(&#039;7h-MES&#039;, &#039;NAS-Port-Type&#039;, &#039;==&#039;, &#039;Wireless-802.11&#039;),
(&#039;2h-UNICA&#039;, &#039;Max-All-Session&#039;, &#039;:=&#039;, &#039;7200&#039;),
(&#039;2h-UNICA&#039;, &#039;NAS-Port-Type&#039;, &#039;==&#039;, &#039;Wireless-802.11&#039;),
(&#039;ILIMITADO&#039;, &#039;NAS-Port-Type&#039;, &#039;==&#039;, &#039;Wireless-802.11&#039;);

INSERT INTO `radgroupreply` (`groupname`, `attribute`, `op`, `value`) VALUES
(&#039;30MIN-DIA&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;),
(&#039;30MIN-DIA&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;2M/8M&#039;),
(&#039;7h-MES&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;),
(&#039;7h-MES&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;3072K/10240K&#039;),
(&#039;2h-UNICO&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;),
(&#039;2h-UNICO&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;8M/20240K&#039;),
(&#039;ILIMITADO&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;),
(&#039;ILIMITADO&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;10M/30M&#039;);</pre>
<p>Agora vamos vincular o usuário a um grupo.</p>
<pre class="remontti-code">INSERT INTO `radusergroup` (`username`, `groupname`) VALUES 
(&#039;tadeu@remontti.com.br&#039;, &#039;30MIN-DIA&#039;);</pre>
<p>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.</p>
<p>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. </p>
<h3>Bônus - Logs: Framed-IPv6-Prefix e  Delegated-IPv6-Prefix</h3>
<p><strong><font color="red">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.</font></strong></p>
<p>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.</p>
<pre class="remontti-code">mariadb -p -u radius</pre>
<p>Crie dois campos framedipv6prefix e delegatedipv6prefix</p>
<pre class="remontti-code">USE radius;
ALTER TABLE `radacct` 
ADD `framedipv6prefix` VARCHAR(41) NULL DEFAULT NULL AFTER `framedipaddress`, 
ADD `delegatedipv6prefix` VARCHAR(41) NULL DEFAULT NULL AFTER `framedipv6prefix`;</pre>
<p>Agora ajuste as queries em queries.conf</p>
<pre class="remontti-code"># vim /etc/freeradius/3.0/mods-config/sql/main/mysql/queries.conf</pre>
<p>Vou destacar as linhas que foram alteradas, ajuste seu arquivo: (linhas 208,262-264,292-294,331-333,382-384)</p>
<pre class="remontti-code"># -*- text -*-
#
#  main/mysql/queries.conf-- MySQL configuration for default schema (schema.sql)
#
#  $Id: 40508024d5fd6a319bbb85775c3fe1e8388be656 $

# Safe characters list for sql queries. Everything else is replaced
# with their mime-encoded equivalents.
# The default list should be ok
#safe_characters = &quot;@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_: /&quot;

#######################################################################
#  Connection config
#######################################################################
# The character set is not configurable. The default character set of
# the mysql client library is used. To control the character set,
# create/edit my.cnf (typically in /etc/mysql/my.cnf or /etc/my.cnf)
# and enter
# [client]
# default-character-set = utf8
#

#######################################################################
#  Query config:  Username
#######################################################################
# This is the username that will get substituted, escaped, and added
# as attribute &#039;SQL-User-Name&#039;. &#039;%{SQL-User-Name}&#039; should be used below
# everywhere a username substitution is needed so you you can be sure
# the username passed from the client is escaped properly.
#
# Uncomment the next line, if you want the sql_user_name to mean:
#
#	Use Stripped-User-Name, if it&#039;s there.
#	Else use User-Name, if it&#039;s there,
#	Else use hard-coded string &quot;DEFAULT&quot; as the user name.
#sql_user_name = &quot;%{%{Stripped-User-Name}:-%{%{User-Name}:-DEFAULT}}&quot;
#
sql_user_name = &quot;%{User-Name}&quot;

#######################################################################
# Default profile
#######################################################################
# This is the default profile. It is found in SQL by group membership.
# That means that this profile must be a member of at least one group
# which will contain the corresponding check and reply items.
# This profile will be queried in the authorize section for every user.
# The point is to assign all users a default profile without having to
# manually add each one to a group that will contain the profile.
# The SQL module will also honor the User-Profile attribute. This
# attribute can be set anywhere in the authorize section (ie the users
# file). It is found exactly as the default profile is found.
# If it is set then it will *overwrite* the default profile setting.
# The idea is to select profiles based on checks on the incoming packets,
# not on user group membership. For example:
# -- users file --
# DEFAULT	Service-Type == Outbound-User, User-Profile := &quot;outbound&quot;
# DEFAULT	Service-Type == Framed-User, User-Profile := &quot;framed&quot;
#
# By default the default_user_profile is not set
#
#default_user_profile = &quot;DEFAULT&quot;

#######################################################################
# NAS Query
#######################################################################
# This query retrieves the radius clients
#
# 0. Row ID (currently unused)
# 1. Name (or IP address)
# 2. Shortname
# 3. Type
# 4. Secret
# 5. Server
#######################################################################

client_query = &quot;\
	SELECT id, nasname, shortname, type, secret, server \
	FROM ${client_table}&quot;

#######################################################################
# Authorization Queries
#######################################################################
# These queries compare the check items for the user
# in ${authcheck_table} and setup the reply items in
# ${authreply_table}. You can use any query/tables
# you want, but the return data for each row MUST
# be in the following order:
#
# 0. Row ID (currently unused)
# 1. UserName/GroupName
# 2. Item Attr Name
# 3. Item Attr Value
# 4. Item Attr Operation
#######################################################################
# Use these for case sensitive usernames.

#authorize_check_query = &quot;\
#	SELECT id, username, attribute, value, op \
#	FROM ${authcheck_table} \
#	WHERE username = BINARY &#039;%{SQL-User-Name}&#039; \
#	ORDER BY id&quot;

#authorize_reply_query = &quot;\
#	SELECT id, username, attribute, value, op \
#	FROM ${authreply_table} \
#	WHERE username = BINARY &#039;%{SQL-User-Name}&#039; \
#	ORDER BY id&quot;

#
#  The default queries are case insensitive. (for compatibility with
#  older versions of FreeRADIUS)
#
authorize_check_query = &quot;\
	SELECT id, username, attribute, value, op \
	FROM ${authcheck_table} \
	WHERE username = &#039;%{SQL-User-Name}&#039; \
	ORDER BY id&quot;

authorize_reply_query = &quot;\
	SELECT id, username, attribute, value, op \
	FROM ${authreply_table} \
	WHERE username = &#039;%{SQL-User-Name}&#039; \
	ORDER BY id&quot;

#
#  Use these for case sensitive usernames.
#
#group_membership_query = &quot;\
#	SELECT groupname \
#	FROM ${usergroup_table} \
#	WHERE username = BINARY &#039;%{SQL-User-Name}&#039; \
#	ORDER BY priority&quot;

group_membership_query = &quot;\
	SELECT groupname \
	FROM ${usergroup_table} \
	WHERE username = &#039;%{SQL-User-Name}&#039; \
	ORDER BY priority&quot;

authorize_group_check_query = &quot;\
	SELECT id, groupname, attribute, \
	Value, op \
	FROM ${groupcheck_table} \
	WHERE groupname = &#039;%{${group_attribute}}&#039; \
	ORDER BY id&quot;

authorize_group_reply_query = &quot;\
	SELECT id, groupname, attribute, \
	value, op \
	FROM ${groupreply_table} \
	WHERE groupname = &#039;%{${group_attribute}}&#039; \
	ORDER BY id&quot;

#######################################################################
# Simultaneous Use Checking Queries
#######################################################################
# simul_count_query	- query for the number of current connections
#			- If this is not defined, no simultaneous use checking
#			- will be performed by this module instance
# simul_verify_query	- query to return details of current connections
#				for verification
#			- Leave blank or commented out to disable verification step
#			- Note that the returned field order should not be changed.
#######################################################################

simul_count_query = &quot;\
	SELECT COUNT(*) \
	FROM ${acct_table1} \
	WHERE username = &#039;%{SQL-User-Name}&#039; \
	AND acctstoptime IS NULL&quot;

simul_verify_query = &quot;\
	SELECT \
		radacctid, acctsessionid, username, nasipaddress, nasportid, framedipaddress, \
		callingstationid, framedprotocol \
	FROM ${acct_table1} \
	WHERE username = &#039;%{SQL-User-Name}&#039; \
	AND acctstoptime IS NULL&quot;

#######################################################################
# Accounting and Post-Auth Queries
#######################################################################
# These queries insert/update accounting and authentication records.
# The query to use is determined by the value of &#039;reference&#039;.
# This value is used as a configuration path and should resolve to one
# or more &#039;query&#039;s. If reference points to multiple queries, and a query
# fails, the next query is executed.
#
# Behaviour is identical to the old 1.x/2.x module, except we can now
# fail between N queries, and query selection can be based on any
# combination of attributes, or custom &#039;Acct-Status-Type&#039; values.
#######################################################################
accounting {
	reference = &quot;%{tolower:type.%{Acct-Status-Type}.query}&quot;

	# Write SQL queries to a logfile. This is potentially useful for bulk inserts
	# when used with the rlm_sql_null driver.
#	logfile = ${logdir}/accounting.sql

	column_list = &quot;\
		acctsessionid,		acctuniqueid,		username, \
		realm,			nasipaddress,		nasportid, \
		nasporttype,		acctstarttime,		acctupdatetime, \
		acctstoptime,		acctsessiontime, 	acctauthentic, \
		connectinfo_start,	connectinfo_stop, 	acctinputoctets, \
		acctoutputoctets,	calledstationid, 	callingstationid, \
		acctterminatecause,	servicetype,		framedprotocol, \
        framedipaddress,    framedipv6prefix,   delegatedipv6prefix&quot;

	type {
		accounting-on {
			#
			#  Bulk terminate all sessions associated with a given NAS
			#
			query = &quot;\
				UPDATE ${....acct_table1} \
				SET \
					acctstoptime = FROM_UNIXTIME(\
						%{integer:Event-Timestamp}), \
					acctsessiontime	= &#039;%{integer:Event-Timestamp}&#039; \
						- UNIX_TIMESTAMP(acctstarttime), \
					acctterminatecause = &#039;%{%{Acct-Terminate-Cause}:-NAS-Reboot}&#039; \
				WHERE acctstoptime IS NULL \
				AND nasipaddress   = &#039;%{NAS-IP-Address}&#039; \
				AND acctstarttime &lt;= FROM_UNIXTIME(\
					%{integer:Event-Timestamp})&quot;
		}

		accounting-off {
			query = &quot;${..accounting-on.query}&quot;
		}

		start {
			#
			#  Insert a new record into the sessions table
			#
			query = &quot;\
				INSERT INTO ${....acct_table1} \
					(${...column_list}) \
				VALUES \
					(&#039;%{Acct-Session-Id}&#039;, \
					&#039;%{Acct-Unique-Session-Id}&#039;, \
					&#039;%{SQL-User-Name}&#039;, \
					&#039;%{Realm}&#039;, \
					&#039;%{NAS-IP-Address}&#039;, \
					&#039;%{%{NAS-Port-ID}:-%{NAS-Port}}&#039;, \
					&#039;%{NAS-Port-Type}&#039;, \
					FROM_UNIXTIME(%{integer:Event-Timestamp}), \
					FROM_UNIXTIME(%{integer:Event-Timestamp}), \
					NULL, \
					&#039;0&#039;, \
					&#039;%{Acct-Authentic}&#039;, \
					&#039;%{Connect-Info}&#039;, \
					&#039;&#039;, \
					&#039;0&#039;, \
					&#039;0&#039;, \
					&#039;%{Called-Station-Id}&#039;, \
					&#039;%{Calling-Station-Id}&#039;, \
					&#039;&#039;, \
					&#039;%{Service-Type}&#039;, \
					&#039;%{Framed-Protocol}&#039;, \
					&#039;%{Framed-IP-Address}&#039;, \
                    &#039;%{Framed-IPv6-Prefix}&#039;, \
                    &#039;%{Delegated-IPv6-Prefix}&#039;)&quot;

			#
			#  Key constraints prevented us from inserting a new session,
			#  use the alternate query to update an existing session.
			#
			query = &quot;\
				UPDATE ${....acct_table1} SET \
					acctstarttime	= FROM_UNIXTIME(%{integer:Event-Timestamp}), \
					acctupdatetime	= FROM_UNIXTIME(%{integer:Event-Timestamp}), \
					connectinfo_start = &#039;%{Connect-Info}&#039; \
				WHERE AcctUniqueId = &#039;%{Acct-Unique-Session-Id}&#039;&quot;
		}

		interim-update {
			#
			#  Update an existing session and calculate the interval
			#  between the last data we received for the session and this
			#  update. This can be used to find stale sessions.
			#
			query = &quot;\
				UPDATE ${....acct_table1} \
				SET \
					acctupdatetime  = (@acctupdatetime_old:=acctupdatetime), \
					acctupdatetime  = FROM_UNIXTIME(\
						%{integer:Event-Timestamp}), \
					acctinterval    = %{integer:Event-Timestamp} - \
						UNIX_TIMESTAMP(@acctupdatetime_old), \
					framedipaddress = &#039;%{Framed-IP-Address}&#039;, \
                    framedipv6prefix = &#039;%{Framed-IPv6-Prefix}&#039;, \
                    delegatedipv6prefix = &#039;%{Delegated-IPv6-Prefix}&#039;, \
					acctsessiontime = %{%{Acct-Session-Time}:-NULL}, \
					acctinputoctets = &#039;%{%{Acct-Input-Gigawords}:-0}&#039; \
						&lt;&lt; 32 | &#039;%{%{Acct-Input-Octets}:-0}&#039;, \
					acctoutputoctets = &#039;%{%{Acct-Output-Gigawords}:-0}&#039; \
						&lt;&lt; 32 | &#039;%{%{Acct-Output-Octets}:-0}&#039; \
				WHERE AcctUniqueId = &#039;%{Acct-Unique-Session-Id}&#039;&quot;

			#
			#  The update condition matched no existing sessions. Use
			#  the values provided in the update to create a new session.
			#
			query = &quot;\
				INSERT INTO ${....acct_table1} \
					(${...column_list}) \
				VALUES \
					(&#039;%{Acct-Session-Id}&#039;, \
					&#039;%{Acct-Unique-Session-Id}&#039;, \
					&#039;%{SQL-User-Name}&#039;, \
					&#039;%{Realm}&#039;, \
					&#039;%{NAS-IP-Address}&#039;, \
					&#039;%{%{NAS-Port-ID}:-%{NAS-Port}}&#039;, \
					&#039;%{NAS-Port-Type}&#039;, \
					FROM_UNIXTIME(%{integer:Event-Timestamp} - %{%{Acct-Session-Time}:-0}), \
					FROM_UNIXTIME(%{integer:Event-Timestamp}), \
					NULL, \
					%{%{Acct-Session-Time}:-NULL}, \
					&#039;%{Acct-Authentic}&#039;, \
					&#039;%{Connect-Info}&#039;, \
					&#039;&#039;, \
					&#039;%{%{Acct-Input-Gigawords}:-0}&#039; &lt;&lt; 32 | &#039;%{%{Acct-Input-Octets}:-0}&#039;, \
					&#039;%{%{Acct-Output-Gigawords}:-0}&#039; &lt;&lt; 32 | &#039;%{%{Acct-Output-Octets}:-0}&#039;, \
					&#039;%{Called-Station-Id}&#039;, \
					&#039;%{Calling-Station-Id}&#039;, \
					&#039;&#039;, \
					&#039;%{Service-Type}&#039;, \
					&#039;%{Framed-Protocol}&#039;, \
					&#039;%{Framed-IP-Address}&#039;, \
                    &#039;%{Framed-IPv6-Prefix}&#039;, \
                    &#039;%{Delegated-IPv6-Prefix}&#039;)&quot;
		}

		stop {
			#
			#  Session has terminated, update the stop time and statistics.
			#
			query = &quot;\
				UPDATE ${....acct_table2} SET \
					acctstoptime	= FROM_UNIXTIME(\
						%{integer:Event-Timestamp}), \
					acctsessiontime	= %{%{Acct-Session-Time}:-NULL}, \
					acctinputoctets	= &#039;%{%{Acct-Input-Gigawords}:-0}&#039; \
						&lt;&lt; 32 | &#039;%{%{Acct-Input-Octets}:-0}&#039;, \
					acctoutputoctets = &#039;%{%{Acct-Output-Gigawords}:-0}&#039; \
						&lt;&lt; 32 | &#039;%{%{Acct-Output-Octets}:-0}&#039;, \
					acctterminatecause = &#039;%{Acct-Terminate-Cause}&#039;, \
					connectinfo_stop = &#039;%{Connect-Info}&#039; \
				WHERE AcctUniqueId = &#039;%{Acct-Unique-Session-Id}&#039;&quot;

			#
			#  The update condition matched no existing sessions. Use
			#  the values provided in the update to create a new session.
			#
			query = &quot;\
				INSERT INTO ${....acct_table2} \
					(${...column_list}) \
				VALUES \
					(&#039;%{Acct-Session-Id}&#039;, \
					&#039;%{Acct-Unique-Session-Id}&#039;, \
					&#039;%{SQL-User-Name}&#039;, \
					&#039;%{Realm}&#039;, \
					&#039;%{NAS-IP-Address}&#039;, \
					&#039;%{%{NAS-Port-ID}:-%{NAS-Port}}&#039;, \
					&#039;%{NAS-Port-Type}&#039;, \
					FROM_UNIXTIME(%{integer:Event-Timestamp} - %{%{Acct-Session-Time}:-0}), \
					FROM_UNIXTIME(%{integer:Event-Timestamp}), \
					FROM_UNIXTIME(%{integer:Event-Timestamp}), \
					%{%{Acct-Session-Time}:-NULL}, \
					&#039;%{Acct-Authentic}&#039;, \
					&#039;&#039;, \
					&#039;%{Connect-Info}&#039;, \
					&#039;%{%{Acct-Input-Gigawords}:-0}&#039; &lt;&lt; 32 | &#039;%{%{Acct-Input-Octets}:-0}&#039;, \
					&#039;%{%{Acct-Output-Gigawords}:-0}&#039; &lt;&lt; 32 | &#039;%{%{Acct-Output-Octets}:-0}&#039;, \
					&#039;%{Called-Station-Id}&#039;, \
					&#039;%{Calling-Station-Id}&#039;, \
					&#039;%{Acct-Terminate-Cause}&#039;, \
					&#039;%{Service-Type}&#039;, \
					&#039;%{Framed-Protocol}&#039;, \
					&#039;%{Framed-IP-Address}&#039;, \
                    &#039;%{Framed-IPv6-Prefix}&#039;, \
                    &#039;%{Delegated-IPv6-Prefix}&#039;)&quot;
		}
	}
}


#######################################################################
# Authentication Logging Queries
#######################################################################
# postauth_query	- Insert some info after authentication
#######################################################################

post-auth {
	# Write SQL queries to a logfile. This is potentially useful for bulk inserts
	# when used with the rlm_sql_null driver.
#	logfile = ${logdir}/post-auth.sql

	query =	&quot;\
		INSERT INTO ${..postauth_table} \
			(username, pass, reply, authdate) \
		VALUES ( \
			&#039;%{SQL-User-Name}&#039;, \
			&#039;%{%{User-Password}:-%{Chap-Password}}&#039;, \
			&#039;%{reply:Packet-Type}&#039;, \
			&#039;%S&#039;)&quot;
}</pre>
<p>Espero que tenha aprendido um pouco mais de como o FreeRadius funciona. </p>
<p>Curtiu o conteúdo? Quer me ajudar? <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><strong>Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento! (Esse deu trabalho!)</strong><br />
<a href="https://blog.remontti.com.br/doar"><img decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2019/07/quero-doar-remontti.png" /></a></p>
<p>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 <a href="https://blog.remontti.com.br/meucontato" rel="noopener noreferrer" target="_blank">clique aqui.</a></p>
<p>Participe do canal no <a href="https://t.me/blogremontti" rel="noopener noreferrer" target="_blank">telegram</a> para ficar atualizado sempre que publicar um novo tutorial. </p>
<p>Abraço!</p>
<p>Fontes:<br />
<a href="https://wiki.freeradius.org/guide/SQL-HOWTO" rel="noopener noreferrer" target="_blank">https://wiki.freeradius.org/guide/SQL-HOWTO</a><br />
<a href="https://wiki.freeradius.org/modules/Rlm_sql" rel="noopener noreferrer" target="_blank">https://wiki.freeradius.org/modules/Rlm_sql</a><br />
<a href="https://wiki.freeradius.org/modules/Rlm_sqlippool" rel="noopener noreferrer" target="_blank">https://wiki.freeradius.org/modules/Rlm_sqlippool</a><br />
<a href="https://wiki.freeradius.org/modules/Rlm_sqlcounter" rel="noopener noreferrer" target="_blank">https://wiki.freeradius.org/modules/Rlm_sqlcounter</a></p>
<p>O post <a href="https://blog.remontti.com.br/4085">Entendendo o funcionamento do FreeRadius e fazendo autenticações PPPoE, Hotspot e Wireless PSK/EAP (Lab Mikrotik/Ubiquiti)</a> apareceu primeiro em <a href="https://blog.remontti.com.br">Remontti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.remontti.com.br/4085/feed</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
			</item>
		<item>
		<title>Criando um servidor de autenticação com FreeRadius no Debian 10 Buster (Extra sqlippool)</title>
		<link>https://blog.remontti.com.br/4063</link>
					<comments>https://blog.remontti.com.br/4063#comments</comments>
		
		<dc:creator><![CDATA[Rudimar Remontti]]></dc:creator>
		<pubDate>Fri, 13 Mar 2020 20:25:16 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mikrotik]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[3.0.16]]></category>
		<category><![CDATA[3.0.17]]></category>
		<category><![CDATA[autenticar]]></category>
		<category><![CDATA[buster]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[eap]]></category>
		<category><![CDATA[freeradius]]></category>
		<category><![CDATA[hotspot]]></category>
		<category><![CDATA[ppp]]></category>
		<category><![CDATA[pppo]]></category>
		<category><![CDATA[pptp]]></category>
		<category><![CDATA[psk]]></category>
		<category><![CDATA[radius]]></category>
		<category><![CDATA[ubiquiti]]></category>
		<category><![CDATA[wpa]]></category>
		<guid isPermaLink="false">https://blog.remontti.com.br/?p=4063</guid>

					<description><![CDATA[<p>Esse tutorial é ideal para provedores que desejam criar seu próprio sistema de autenticação com freeradius, fazendo autenticação do tipo PPPoE, hotspot, Wireless (PSK/EAP) entre outras. Neste tutorial iremos instalar e configurar o FreeRadius&#46;&#46;&#46;</p>
<p>O post <a href="https://blog.remontti.com.br/4063">Criando um servidor de autenticação com FreeRadius no Debian 10 Buster (Extra sqlippool)</a> apareceu primeiro em <a href="https://blog.remontti.com.br">Remontti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius-3-debian10-instalacao.png" alt="" width="900" height="428" class="alignnone size-full wp-image-4221" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius-3-debian10-instalacao.png 900w, https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius-3-debian10-instalacao-300x143.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/03/freeradius-3-debian10-instalacao-768x365.png 768w" sizes="auto, (max-width: 900px) 100vw, 900px" /><br />
Esse tutorial é ideal para provedores que desejam criar seu próprio sistema de autenticação com freeradius, fazendo autenticação do tipo PPPoE, hotspot, Wireless (PSK/EAP)  entre outras.</p>
<p>Neste tutorial iremos instalar e configurar o FreeRadius 3.0.x sobre o Debina 10, com integração dos na base de dados MariaDB (frok do MySQL), ativaremos ainda o módulos SQLIPPOOL para armazenar nossa pool de IPs na base de dados. </p>
<p><strong>REQUISITOS</strong><br />
1 – <a href="https://blog.remontti.com.br/2966" rel="noopener noreferrer" target="_blank">Debian 10 bustes &#8211; Instalação limpa</a><br />
2 – <a href="https://blog.remontti.com.br/3006" rel="noopener noreferrer" target="_blank">WEB Apache + PHP + MariaDB + phpMyAdmin no Debian 10 Buster “LAMP” </a> (Se desejar usar o phpMyAdmin)</p>
<p><strong>Instalação do FreeRadius 3.0.`>17`</strong></p>
<p>Primeiramente iremos criar o banco de dados e usuário e conceder as permissões de acesso.</p>
<p>Abra o terminal de comando do MariaDB e crie a base e o usuario chamados de radius e defina a senha para este usuário.</p>
<pre class="remontti-code"># mariadb -u root</pre>
<p>Altere <strong>SENHA_USER_RADIUS</strong>. Você pode gerar uma senha forte e segura em <a href="https://senhasegura.remontti.com.br/" rel="noopener noreferrer" target="_blank">https://senhasegura.remontti.com.br</a></p>
<pre class="remontti-code">CREATE DATABASE radius;
GRANT ALL PRIVILEGES ON radius.* TO &#039;radius&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;SENHA_USER_RADIUS&#039;;
FLUSH PRIVILEGES;
quit;</pre>
<p>Instale os pacotes do <strong>freeradius</strong></p>
<pre class="remontti-code"># apt install freeradius freeradius-mysql freeradius-utils</pre>
<p>Com o o banco de dados radius criado iremos importar as tabelas padrões do freeradius:</p>
<pre class="remontti-code"># mariadb -u radius -p radius &lt; /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
# mariadb -u radius -p radius &lt; /etc/freeradius/3.0/mods-config/sql/ippool/mysql/schema.sql</pre>
<p>Após comando será solicitado a senha do usuario radius (SENHA_USER_RADIUS).</p>
<p>Caso deseje logs mais detalhados (recomendo) edite o arquivo /etc/freeradius/3.0/radiusd.conf, mas antes faça um backup do mesmo.</p>
<pre class="remontti-code"># cp /etc/freeradius/3.0/radiusd.conf /etc/freeradius/3.0/radiusd.conf.orig
# vim /etc/freeradius/3.0/radiusd.conf</pre>
<p>Localize as variáveis e altere para yes  </p>
<pre class="remontti-code">[...]
log {
    [...]
        stripped_names = yes
        auth = yes
        auth_badpass = yes
        auth_goodpass = yes
    [...]
}
[...]</pre>
<p>Ajustaremos o <a href="https://wiki.freeradius.org/guide/SQL-HOWTO-for-freeradius-3.x-on-Debian-Ubuntu" rel="noopener noreferrer" target="_blank">mod SQL</a> para trabalhar com conexão do tipo mysql, e informamos os dados para conexão com o banco de dados. Arquivo /etc/freeradius/3.0/mods-available/sql.orig</p>
<pre class="remontti-code"># cp /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-available/sql.orig</pre>
<p>Usarei o comando <strong>sed</strong> para facilitar sua vida <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> mas preste atenção nos comandos, se desejar pode editar o arquivo manualmente e alterar as entradas.</p>
<pre class="remontti-code"># sed -i &#039;s/driver = &quot;rlm_sql_null&quot;/driver = &quot;rlm_sql_mysql&quot;/&#039; /etc/freeradius/3.0/mods-available/sql
# sed -i &#039;s/dialect = &quot;sqlite&quot;/dialect = &quot;mysql&quot;/&#039; /etc/freeradius/3.0/mods-available/sql
# sed -i &#039;/server = &quot;localhost&quot;/s/^#//g&#039; /etc/freeradius/3.0/mods-available/sql
# sed -i &#039;/port = 3306/s/^#//g&#039; /etc/freeradius/3.0/mods-available/sql
# sed -i &#039;/login = &quot;radius&quot;/s/^#//g&#039; /etc/freeradius/3.0/mods-available/sql
# sed -i &#039;/password = &quot;radpass&quot;/s/^#//g&#039; /etc/freeradius/3.0/mods-available/sql
# sed -i &#039;/read_clients = yes/s/^#//g&#039; /etc/freeradius/3.0/mods-available/sql</pre>
<p>No próximo comando altere <strong>SENHA_USER_RADIUS</strong> para a senha de conexão do usuário radius.</p>
<pre class="remontti-code"># sed -i &#039;s/radpass/SENHA_USER_RADIUS/&#039; /etc/freeradius/3.0/mods-available/sql</pre>
<p>Habilite o mod:</p>
<pre class="remontti-code"># ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/sql</pre>
<p>Agora no arquivo /etc/freeradius/3.0/sites-enabled/default vamos comentar alguns componentes que não nos interessa (Se você entrar no arquivo e editar manualmente ele está todo comentado, auto explicativo.) e incluir alguns componentes como o SQL.</p>
<pre class="remontti-code"># cp /etc/freeradius/3.0/sites-available/default  /etc/freeradius/3.0/sites-available/default.org</pre>
<pre class="remontti-code"># sed -i &#039;/digest/s/^/#/g&#039; /etc/freeradius/3.0/sites-available/default
# sed -i &#039;/suffix/s/^/#/g&#039; /etc/freeradius/3.0/sites-available/default
# sed -i &#039;/files/s/^/#/g&#039; /etc/freeradius/3.0/sites-available/default
# sed -i &#039;/ldap/s/^/#/g&#039; /etc/freeradius/3.0/sites-available/default
# sed -i &#039;/exec/s/^/#/g&#039; /etc/freeradius/3.0/sites-available/default
# sed -i &#039;/detail/s/^/#/g&#039; /etc/freeradius/3.0/sites-available/default
# sed -i &#039;/unix/s/^/#/g&#039; /etc/freeradius/3.0/sites-available/default
# sed -i &#039;/attr_filter.accounting_response/s/^/#/g&#039; /etc/freeradius/3.0/sites-available/default
# sed -i &#039;s/-sql/sql/&#039; /etc/freeradius/3.0/sites-available/default
# sed -i &#039;682 s/# *//&#039; /etc/freeradius/3.0/sites-available/default
# sed -i &#039;829,849 {s/^/##/}&#039; /etc/freeradius/3.0/sites-available/default</pre>
<p>Habilitando o mod <strong> <a href="http://sqlippool" rel="noopener noreferrer" target="_blank">sqlippool</a></strong><br />
Como o mod sqlippool você poderá ter sua pool de IPs direto no banco de dados.</p>
<pre class="remontti-code"># ln -s /etc/freeradius/3.0/mods-available/sqlippool /etc/freeradius/3.0/mods-enabled/sqlippool</pre>
<p>Vou alterar (Descomentando e comentado) a chave pool_key = "<strong>%{NAS-Port}</strong>" por "<strong>%{Calling-Station-Id}</strong>", desta forma a chave será o MAC, e "allow_duplicates = no" para não termos duplicidades de IPs. Mais adiante iremos também ajustar o allocate_clear.</p>
<pre class="remontti-code"># sed -i &#039;65 {s/^/#/}&#039; /etc/freeradius/3.0/mods-available/sqlippool
# sed -i &#039;66 s/# *//&#039; /etc/freeradius/3.0/mods-available/sqlippool
# sed -i &#039;58 s/# *//&#039; /etc/freeradius/3.0/mods-available/sqlippool</pre>
<p>Precisamos adicionar o mod sqlippool no nosso arquivo default, você acrescentará sqlippool em <strong>accounting</strong> {...} e <strong>post-auth</strong> {...} logo abaixo de <strong>sql</strong>: </p>
<pre class="remontti-code"># sed -i &#039;641i\        sqlippool&#039; /etc/freeradius/3.0/sites-available/default
# sed -i &#039;734i\        sqlippool&#039; /etc/freeradius/3.0/sites-available/default</pre>
<p>Verifique com o comando abaixo se a saída do seu arquivo ficou assim:</p>
<pre class="remontti-code"># cat /etc/freeradius/3.0/sites-enabled/default |grep -v &quot;#&quot; |awk &#039;NF&gt;0&#039;</pre>
<pre class="remontti-code">server default {
listen {
        type = auth
        ipaddr = *
        port = 0
        limit {
              max_connections = 16
              lifetime = 0
              idle_timeout = 30
        }
}
listen {
        ipaddr = *
        port = 0
        type = acct
        limit {
        }
}
listen {
        type = auth
        port = 0
        limit {
              max_connections = 16
              lifetime = 0
              idle_timeout = 30
        }
}
listen {
        ipv6addr = ::
        port = 0
        type = acct
        limit {
        }
}
authorize {
        filter_username
        preprocess
        chap
        mschap
        eap {
                ok = return
        }
        sql
        expiration
        logintime
        pap
}
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        mschap
        eap
}
preacct {
        preprocess
        acct_unique
}
accounting {
        sql
        sqlippool
}
session {
        sql
}
post-auth {
        update {
                &amp;reply: += &amp;session-state:
        }
        sql
        sqlippool
        remove_reply_message_if_eap
}
pre-proxy {
}
post-proxy {
        eap
}
}
</pre>
<p>Faremos os ajustes no arquivo <strong>inner-tunnel</strong></p>
<pre class="remontti-code"># cp /etc/freeradius/3.0/sites-available/inner-tunnel /etc/freeradius/3.0/sites-available/inner-tunnel.org</pre>
<pre class="remontti-code"># sed -i &#039;/suffix/s/^/#/g&#039; /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i &#039;/files/s/^/#/g&#039; /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i &#039;/-ldap/s/^/#/g&#039; /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i &#039;s/-sql/sql/&#039; /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i &#039;s/radutmp/#radutmp/&#039; /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i &#039;269 s/# *//&#039; /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i &#039;331,356 {s/^/##/}&#039; /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i &#039;365,376 {s/^/##/}&#039; /etc/freeradius/3.0/sites-available/inner-tunnel</pre>
<p>Verifique com o comando abaixo se a saída do seu arquivo ficou assim:</p>
<pre class="remontti-code"># cat /etc/freeradius/3.0/sites-enabled/inner-tunnel |grep -v &quot;#&quot; |awk &#039;NF&gt;0&#039;</pre>
<pre class="remontti-code">server inner-tunnel {
listen {
       ipaddr = 127.0.0.1
       port = 18120
       type = auth
}
authorize {
        filter_username
        chap
        mschap
        update control {
                &amp;Proxy-To-Realm := LOCAL
        }
        eap {
                ok = return
        }
        sql
        expiration
        logintime
        pap
}
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        mschap
        eap
}
session {
        sql
}
post-auth {
        sql
}
pre-proxy {
}
post-proxy {
        eap
}</pre>
<p>Uma alteração que acho válida é para que para cada alocação de <strong>IP</strong> ela seja <strong>randômica</strong>, isso pode solucionar alguns problemas como o balanceamento dos prefixo no seu BGP, ou daqueles clientes que jogam online, fazem download e até mesmo que estão sofrendo algum ataque. Assim ao reiniciar seu equipamento o mesmo irá receber um novo endereço IP. Para que funcione desta forma iremos apenas comentar algumas linhas e descomentar outras, pois em /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf variável <strong>allocate_find</strong> já vem com o modelo pronto <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> </p>
<p>Comentar:</p>
<pre class="remontti-code"># sed -i &#039;41,50 {s/^/##/}&#039; /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf</pre>
<pre class="remontti-code-plain">##allocate_find = &quot;\
##      SELECT framedipaddress FROM ${ippool_table} \
##      WHERE pool_name = &#039;%{control:Pool-Name}&#039; \
##      AND (expiry_time &lt; NOW() OR expiry_time IS NULL) \
##      ORDER BY \
##              (username &lt;&gt; &#039;%{User-Name}&#039;), \
##              (callingstationid &lt;&gt; &#039;%{Calling-Station-Id}&#039;), \
##              expiry_time \
##      LIMIT 1 \
##      FOR UPDATE&quot;</pre>
<p>Descomentar:</p>
<pre class="remontti-code"># sed -i &#039;55,62 s/# *//&#039; /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf</pre>
<pre class="remontti-code-plain">allocate_find = &quot;\
        SELECT framedipaddress FROM ${ippool_table} \
        WHERE pool_name = &#039;%{control:Pool-Name}&#039; \
        AND expiry_time IS NULL \
        ORDER BY \
                RAND() \
        LIMIT 1 \
        FOR UPDATE&quot;</pre>
<p>Como alteramos a pool_key para Calling-Station-Id  em /etc/freeradius/3.0/mods-enabled/sqlippool vamos ajustar o <strong>allocate_clear</strong> para quando for liberar um IP use a chave pool_key e não a NAS, caso contrário ira liberar IPs indevidos que estão sendo utilizado por usuários ativos e assim evitamos que surjam IPs duplicados, para isso:</p>
<p>Comentar:</p>
<pre class="remontti-code"># sed -i &#039;26,35 {s/^/##/}&#039; /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf</pre>
<pre class="remontti-code-plain">##allocate_clear = &quot;\
##      UPDATE ${ippool_table} \
##      SET \
##              nasipaddress = &#039;&#039;, \
##              pool_key = 0, \
##              callingstationid = &#039;&#039;, \
##              username = &#039;&#039;, \
##              expiry_time = NULL \
##      WHERE expiry_time &lt;= NOW() - INTERVAL 1 SECOND \
##      AND nasipaddress = &#039;%{%{Nas-IP-Address}:-%{Nas-IPv6-Address}}&#039;&quot;</pre>
<p>Descomentar</p>
<pre class="remontti-code"># sed -i &#039;10,18 s/# *//&#039; /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf</pre>
<pre class="remontti-code-plain">allocate_clear = &quot;\
        UPDATE ${ippool_table} \
        SET \
                nasipaddress = &#039;&#039;, \
                pool_key = 0, \
                callingstationid = &#039;&#039;, \
                username = &#039;&#039;, \
                expiry_time = NULL \
        WHERE pool_key = &#039;${pool_key}&#039;&quot;</pre>
<p>É interessante você ajustar o tempo <strong>lease_duration = 3600</strong> no arquivo /etc/freeradius/3.0/mods-available/sqlippool talvez para um menor intervalo,porém sempre respeitando que o <strong>Acct-Interim-Interval</strong> seja um tempo menor, para não ter duplicidades de ips. Falo sobre isso no tutorial <a href="https://blog.remontti.com.br/4085" rel="noopener noreferrer" target="_blank">https://blog.remontti.com.br/4085</a> recomendo a leitura!</p>
<p><strong>Opcional</strong><br />
Eu particularmente não gosto da ideia da tabela radusergroup não ter um ID, em alguma programação ela pode ser útil, então para fazer isso se desejar faça:</p>
<pre class="remontti-code"># mariadb -u radius -p</pre>
<p>Entre com suasenha do usuário radius.</p>
<pre class="remontti-code">USE radius;
ALTER TABLE `radusergroup` ADD `id` INT(20) NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`) ;
ALTER TABLE `radusergroup` ADD UNIQUE(`id`);
quit;</pre>
<p>Caso você tenha uma alta demanda de requisições você pode fazer algumas alterações no radiusd.conf.<br />
Altere conforme sua necessidade, e hardware de seu servidor. Vale lembrar que fazendo essas alterações pode ser necessário alterar o limite de conexões ao MariaDB. Não abuse nessas configurações recomendo ler a documentação.</p>
<pre class="remontti-code"># vim /etc/freeradius/3.0/radiusd.conf</pre>
<p>Você pode começar dobrando os valores, ex.:</p>
<pre class="remontti-code">[...]
thread pool {
        start_servers = 10
        max_servers = 64
        min_spare_servers = 6
        max_spare_servers = 20
        max_queue_size = 131072
        max_requests_per_server = 0
        auto_limit_acct = no
}
[...]</pre>
<h3>Finalizando</h3>
<p>Habilite o freeradius para começar junto com a inicialização do sistema</p>
<pre class="remontti-code"># systemctl enable freeradius</pre>
<p>Pare o serviço e inicie em modo debug</p>
<pre class="remontti-code"># systemctl stop freeradius
# freeradius -X</pre>
<p>Se nenhum erro acontecer uma mensagem com: <strong>Ready to process requests</strong> aparecer parabéns seu freeradius está funcionando. Através do comando debug você consegue acompanhar as ações que o freeradius irá fazer, ótimo para estudos e entendimento. Para encerrar o modo debig use Crtl+c, e então inicie o serviço de forma normal.</p>
<pre class="remontti-code"># systemctl start freeradius</pre>
<p>Para <strong>integrar</strong> seu servidor freeradius para fazer autenticações PPPoE, Hotspot, Wireless PSK/EAP entre outras, você precisa aprender mais sobre as <strong>tabelas</strong> do <strong>banco de dados</strong> e quais <strong>atributos</strong> usar em cada situação sempre pensando na segurança. Você pode acessar <a href="https://blog.remontti.com.br/4085" rel="noopener noreferrer" target="_blank">https://blog.remontti.com.br/4085</a> onde irá encontra alguns modelos de autenticação que atente praticamente todos os cenários de provedores. </p>
<p>Gostou? Quer me ajudar? <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><strong>Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!</strong><br />
<a href="https://blog.remontti.com.br/doar"><img decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2019/07/quero-doar-remontti.png" /></a></p>
<p>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 <a href="https://blog.remontti.com.br/meucontato" rel="noopener noreferrer" target="_blank">clique aqui.</a></p>
<p>Participe do canal no <a href="https://t.me/blogremontti" rel="noopener noreferrer" target="_blank">telegram</a> para ficar atualizado sempre que publicar um novo tutorial. </p>
<p>Abraço!</p>
<p>Fonte:<br />
<a href="https://wiki.freeradius.org/guide/SQL-HOWTO" rel="noopener noreferrer" target="_blank">https://wiki.freeradius.org/guide/SQL-HOWTO</a><br />
<a href="https://wiki.freeradius.org/modules/Rlm_sql" rel="noopener noreferrer" target="_blank">https://wiki.freeradius.org/modules/Rlm_sql</a><br />
<a href="https://wiki.freeradius.org/modules/Rlm_sqlippool" rel="noopener noreferrer" target="_blank">https://wiki.freeradius.org/modules/Rlm_sqlippool</a></p>
<p>O post <a href="https://blog.remontti.com.br/4063">Criando um servidor de autenticação com FreeRadius no Debian 10 Buster (Extra sqlippool)</a> apareceu primeiro em <a href="https://blog.remontti.com.br">Remontti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.remontti.com.br/4063/feed</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
		<item>
		<title>Servidor FreeRadius com integração MySQL + Autenticação PPPoE &#038; Hotspot VS Mikrotik + Ubiquiti EAP/PSK [Descontinuado]</title>
		<link>https://blog.remontti.com.br/1651</link>
					<comments>https://blog.remontti.com.br/1651#comments</comments>
		
		<dc:creator><![CDATA[Rudimar Remontti]]></dc:creator>
		<pubDate>Tue, 14 Feb 2017 01:28:29 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mikrotik]]></category>
		<category><![CDATA[Outros]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[counter]]></category>
		<category><![CDATA[eap]]></category>
		<category><![CDATA[freeradius]]></category>
		<category><![CDATA[ippool]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[psk]]></category>
		<category><![CDATA[radius]]></category>
		<category><![CDATA[ubiquiti]]></category>
		<category><![CDATA[ubnt]]></category>
		<guid isPermaLink="false">http://blog.remontti.com.br/?p=1651</guid>

					<description><![CDATA[<p>Versão mais atual deste tutorial: https://blog.remontti.com.br/4063 https://blog.remontti.com.br/4085 (Descontinuado) Neste tutorial vamos configurar o FreeRadius de forma simples em um servidor linux (Debina 8), armazenando nossos usuários e atributos de configurações em uma base de&#46;&#46;&#46;</p>
<p>O post <a href="https://blog.remontti.com.br/1651">Servidor FreeRadius com integração MySQL + Autenticação PPPoE &#038; Hotspot VS Mikrotik + Ubiquiti EAP/PSK [Descontinuado]</a> apareceu primeiro em <a href="https://blog.remontti.com.br">Remontti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1><font color="red"><strong>Versão mais atual deste tutorial: </strong></font></h1>
<p><a href="https://blog.remontti.com.br/4063" rel="noopener noreferrer" target="_blank">https://blog.remontti.com.br/4063</a><br />
<a href="https://blog.remontti.com.br/4085" rel="noopener noreferrer" target="_blank">https://blog.remontti.com.br/4085</a></p>
<hr>
<p>(Descontinuado)</p>
<hr>
<p align="justify">
Neste tutorial vamos configurar o <a href="https://pt.wikipedia.org/wiki/FreeRADIUS" target="_blank" rel="noopener noreferrer">FreeRadius </a>de forma simples em um servidor linux (Debina 8), armazenando nossos usuários e atributos de configurações em uma base de dados MySQL, qual será utilizada para autenticações PPPoE ou Hotspot, no RouterOS (<a href="http://wiki.mikrotik.com/wiki/Main_Page" target="_blank" rel="noopener noreferrer">Mikrotik</a>). Vamos tratar ainda do módulos IPPOOL para armazenar nossa pool de IPs no banco de dados e o módulo COUNTER muito usado em configurações de Hotspot para controle de tempo da conexão. E por fim um extra de como configurar seu Access Point (AP)/ Station (Clientes/<a href="https://pt.wikipedia.org/wiki/Customer_Premises_Equipment" target="_blank" rel="noopener noreferrer">CPE</a>) para fazer autenticação Wireless (PSK / EAP) em seus equipamentos <a href="https://www.ubnt.com/" target="_blank" rel="noopener noreferrer">Ubiquiti</a>/Mikrotik entre outros. </p>
<p>Resumindo é um dos cenário mais encontrado em provedores de internet. Se você gostou do tutorial ou tem dúvidas deixe seu comentário. Se precisar de alguma consultoria ou trocar uma ideia pode me chamar lá no <a href="https://telegram.org/" target="_blank" rel="noopener noreferrer">Telegram</a> <a href="https://telegram.me/Remontti" target="_blank" rel="noopener noreferrer">@remontti</a> <em>(Não garanto que irei responder rápido, mas sempre tiver um tempinho&#8230;)</em>
</p>
<p><strong>REQUISITOS</strong><br />
1 – Debian 8 Jessie recomendo uma instalação limpa do Debian (<a href="https://blog.remontti.com.br/1152" target="_blank" rel="noopener noreferrer">Debian 8 Jessie / Instalação Limpa</a>)<br />
2 – Serviço Web Rodando (<a href="https://blog.remontti.com.br/1296" target="_blank" rel="noopener noreferrer">Passo-a-passo como criar um servidor web Apache2, PHP5, MySQL, PHPMyAdmin “LAMP” no Debian 8</a>)<br />
3 – Servidor Atualizado: </p>
<pre class="remontti-code"># apt update &amp;&amp; apt upgrade</pre>
<p><strong>INSTALAÇÃO</strong></p>
<pre class="remontti-code"># apt install freeradius freeradius-mysql freeradius-utils</pre>
<p><strong>Integração com MySQL</strong></p>
<p>Após instalação vamos criar nossa base de dados chamada de &#8220;radius&#8221;, e após criar nosso usuário que também se chamara &#8220;radius&#8221; para ter acesso a mesma.</p>
<pre class="remontti-code"># mysql -u root -p</pre>
<p>informe a senha do seus usuário root do MySQL.</p>
<pre class="remontti-code">CREATE DATABASE radius;
GRANT ALL PRIVILEGES ON radius.* TO &#039;radius&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;SUA-SENHA&#039;;
FLUSH PRIVILEGES;
quit;</pre>
<p>Importamos as tabelas para nosso banco de dados, a cado comando será solicitado senha so usuário mysql radius (SUA-SENHA).</p>
<pre class="remontti-code"># mysql -u radius -p radius &lt; /etc/freeradius/sql/mysql/schema.sql
# mysql -u radius -p radius &lt; /etc/freeradius/sql/mysql/nas.sql
# mysql -u radius -p radius &lt; /etc/freeradius/sql/mysql/ippool.sql
# mysql -u radius -p radius &lt; /etc/freeradius/sql/mysql/cui.sql
# mysql -u radius -p radius &lt; /etc/freeradius/sql/mysql/wimax.sql</pre>
<p>Entramos no diretório onde o FreeRadius tem seus arquivos de configuração.</p>
<pre class="remontti-code"># cd /etc/freeradius</pre>
<p>Antes de editar o radiusd.conf crie um backup do mesmo, farei o mesmo em todos os arquivos que irei editar, assim temos um backup caso cometer algum erro.</p>
<pre class="remontti-code"># cp radiusd.conf radiusd.conf.orig
# vim radiusd.conf</pre>
<p><strong>Descomente</strong></p>
<pre class="remontti-code">
[...]
  &lt;font color=&quot;blue&quot;&gt;ipv6addr = ::&lt;/font&gt;
[...]
  &lt;font color=&quot;blue&quot;&gt;$INCLUDE sql.conf&lt;/font&gt;
[...]
  &lt;font color=&quot;blue&quot;&gt;$INCLUDE sqlippool.conf&lt;/font&gt;
[...]</pre>
<p>Se deseja ter logs mais detalhados altere os valores abaixo para yes.</p>
<pre class="remontti-code">[...]
log {
    [...]
        stripped_names = &lt;font color=&quot;blue&quot;&gt;yes&lt;/font&gt;
        auth = &lt;font color=&quot;blue&quot;&gt;yes&lt;/font&gt;
        auth_badpass = &lt;font color=&quot;blue&quot;&gt;yes&lt;/font&gt;
        auth_goodpass = &lt;font color=&quot;blue&quot;&gt;yes&lt;/font&gt;
    [...]
}
[...]
</pre>
<pre class="remontti-code"> # cat radiusd.conf |grep -v &quot;#&quot; |awk &#039;NF&gt;0&#039;</pre>
<p><strong>radius.conf </strong> ficará assim:</p>
<pre class="remontti-code">prefix = /usr
exec_prefix = /usr
sysconfdir = /etc
localstatedir = /var
sbindir = ${exec_prefix}/sbin
logdir = /var/log/freeradius
raddbdir = /etc/freeradius
radacctdir = ${logdir}/radacct
name = freeradius
confdir = ${raddbdir}
run_dir = ${localstatedir}/run/${name}
db_dir = ${raddbdir}
libdir = /usr/lib/freeradius
pidfile = ${run_dir}/${name}.pid
user = freerad
group = freerad
max_request_time = 30
cleanup_delay = 5
max_requests = 1024
listen {
        type = auth
        ipaddr = *
        port = 0
}
listen {
        ipaddr = *
        port = 0
        type = acct
}
hostname_lookups = no
allow_core_dumps = no
regular_expressions     = yes
extended_expressions    = yes
log {
        destination = files
        file = ${logdir}/radius.log
        syslog_facility = daemon
        stripped_names = yes
        auth = yes
        auth_badpass = yes
        auth_goodpass = yes
}
checkrad = ${sbindir}/checkrad
security {
        max_attributes = 200
        reject_delay = 1
        status_server = yes
        allow_vulnerable_openssl = no
}
proxy_requests  = yes
$INCLUDE proxy.conf
$INCLUDE clients.conf
thread pool {
        start_servers = 5
        max_servers = 32
        min_spare_servers = 3
        max_spare_servers = 10
        max_requests_per_server = 0
}
modules {
        $INCLUDE ${confdir}/modules/
        $INCLUDE eap.conf
        $INCLUDE sql.conf
        $INCLUDE sqlippool.conf
}
instantiate {
        exec
        expr
        expiration
        logintime
}
$INCLUDE policy.conf
$INCLUDE sites-enabled/</pre>
<pre class="remontti-code"># cp sql.conf sql.conf.orig
# vim sql.conf</pre>
<p><strong>Alterar</strong><br />
<font color="blue"><em>password =</em> <strong>"SUA-SENHA"</strong></font></p>
<p><strong>Descomente</strong><br />
<font color="blue"><em>readclients = yes</em></font></p>
<pre class="remontti-code"># cat sql.conf |grep -v &quot;#&quot; |awk &#039;NF&gt;0&#039;</pre>
<p><strong>sql.conf</strong> ficará assim:</p>
<pre class="remontti-code">
sql {
        database = &quot;mysql&quot;
        driver = &quot;rlm_sql_${database}&quot;
        server = &quot;localhost&quot;
        login = &quot;radius&quot;
        password = &quot;MINHA-SENHA&quot;
        radius_db = &quot;radius&quot;
        acct_table1 = &quot;radacct&quot;
        acct_table2 = &quot;radacct&quot;
        postauth_table = &quot;radpostauth&quot;
        authcheck_table = &quot;radcheck&quot;
        authreply_table = &quot;radreply&quot;
        groupcheck_table = &quot;radgroupcheck&quot;
        groupreply_table = &quot;radgroupreply&quot;
        usergroup_table = &quot;radusergroup&quot;
        deletestalesessions = yes
        sqltrace = no
        sqltracefile = ${logdir}/sqltrace.sql
        num_sql_socks = ${thread[pool].max_servers}
        connect_failure_retry_delay = 60
        lifetime = 0
        max_queries = 0
        readclients = yes
        nas_table = &quot;nas&quot;
        $INCLUDE sql/${database}/dialup.conf
}</pre>
<pre class="remontti-code"># cd /etc/freeradius/sites-available
# cp inner-tunnel  inner-tunnel.orig
# vim inner-tunnel</pre>
<p><strong>Descomente os sql encontrado em authorize/session/post-auth </strong></p>
<pre class="remontti-code">&lt;em&gt;authorize {
        [...]
        &lt;font color=&quot;blue&quot;&gt;sql&lt;/font&gt;
        [...]
}
[...]
session {
         &lt;font color=&quot;red&quot;&gt;#radutmp&lt;/font&gt;
        &lt;font color=&quot;blue&quot;&gt;sql&lt;/font&gt;
}
post-auth {
        &lt;font color=&quot;blue&quot;&gt;sql&lt;/font&gt;
}&lt;/em&gt;</pre>
<p><strong>Comente</strong></p>
<pre class="remontti-code">&lt;em&gt;&lt;font color=&quot;red&quot;&gt;#       Post-Auth-Type REJECT {
#               # log failed authentications in SQL, too.
##              sql
#               attr_filter.access_reject
#       }&lt;/em&gt;&lt;/font&gt;</pre>
<pre class="remontti-code"># cat /etc/freeradius/sites-available/inner-tunnel  |grep -v &quot;#&quot; |awk &#039;NF&gt;0&#039;</pre>
<p><strong>inner-tunne</strong> ficará assim:</p>
<pre class="remontti-code">
server inner-tunnel {
listen {
       ipaddr = 127.0.0.1
       port = 18120
       type = auth
}
authorize {
        chap
        mschap
        suffix
        update control {
               Proxy-To-Realm := LOCAL
        }
        eap {
                ok = return
        }
        files
        sql
        expiration
        logintime
        pap
}
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        unix
        eap
}
session {
        sql
}
post-auth {
        sql
}
pre-proxy {
}
post-proxy {
        eap
}
</pre>
<pre class="remontti-code"># cp default default.orig
# vim default</pre>
<p><strong>Comente / Descomente</strong></p>
<pre class="remontti-code">&lt;em&gt;authorize {
	&lt;font color=&quot;red&quot;&gt;#digest
	#suffix
	#files&lt;/font&gt;
        &lt;font color=&quot;blue&quot;&gt;sql&lt;/font&gt;
}</pre>
<p><strong>Comente:</strong></p>
<pre class="remontti-code">authenticate {
        &lt;font color=&quot;red&quot;&gt;#digest
        #unix&lt;/font&gt;
}
preacct {
        &lt;font color=&quot;red&quot;&gt;#suffix
        #files&lt;/font&gt;
}&lt;/em&gt;</pre>
<p><strong>Comente / Descomente / inclua abaixo de sql sqlippool</strong></p>
<pre class="remontti-code">&lt;em&gt;accounting {
        &lt;font color=&quot;red&quot;&gt;#detail&lt;/font&gt;
        &lt;font color=&quot;blue&quot;&gt;sql 
        &lt;b&gt;sqlippool&lt;/b&gt;&lt;/font&gt;
        &lt;font color=&quot;red&quot;&gt;#exec
        #attr_filter.accounting_response&lt;/font&gt;
}
session {
	&lt;font color=&quot;red&quot;&gt;#radutmp&lt;/font&gt;
        &lt;font color=&quot;blue&quot;&gt;sql&lt;/font&gt;
}

post-auth {
        &lt;font color=&quot;blue&quot;&gt;sql 
        sqlippool&lt;/font&gt;
&lt;font color=&quot;red&quot;&gt;
        #exec
#       Post-Auth-Type REJECT {
#               # log failed authentications in SQL, too.
##              sql
#               attr_filter.access_reject
#       }&lt;/font&gt;
}&lt;/em&gt;</pre>
<pre class="remontti-code"># cat /etc/freeradius/sites-available/default  |grep -v &quot;#&quot; |awk &#039;NF&gt;0&#039;</pre>
<p><strong>default </strong>ficará assim:</p>
<pre class="remontti-code">
authorize {
        preprocess
        chap
        mschap
        eap {
                ok = return
        }
        sql
        expiration
        logintime
        pap
}
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        eap
}
preacct {
        preprocess
        acct_unique
}
accounting {
        sql
        sqlippool
}
session {
        sql
}
post-auth {
        sql
        sqlippool
}
pre-proxy {
}
post-proxy {
        eap
}</pre>
<p>Habilite o control-socket</p>
<pre class="remontti-code"># cd /etc/freeradius/sites-enabled
# ln -s ../sites-available/control-socket</pre>
<p><strong>SQLIPOOL</strong><br />
https://wiki.freeradius.org/modules/Rlm_sqlippool</p>
<p>Como dito este é um cenário bem tipico de provedores, então vou usar o modulo sqlipool para deixar meus blocos de IPs diretamente no banco de dados, assim temos um aproveitamento de 100% dos IPs, ainda mais com o esgotamenteo de IPv4 no mundo.<br />
IMPORTANTE: Esse formato pode gerar problemas, um deles é a duplicidade de IPs em sua rede, isso acontece se você tiver varios Servidores PPPoE/Hotspot (se bem que em hotspot eu não usaria), espalhados na sua rede, caso haja alguma interrupção entre seu PPPoE Server e o Freeradius, o Freeradius poderá liberar o IP da da tabela radippool, e assim algum outro PPPoE Sever acabar alocando o mesmo. Então tome cuidado. Eu particularmente usei um script que em caso o Servidor PPPoE perder comunicação com o Servidor Freeradius ele desconecta todos os usuários conectados, assim quando voltar a comunicação seja feito uma nova conexão aos clientes. </p>
<pre class="remontti-code"># vim /etc/freeradius/sqlippool.conf</pre>
<p>Altere<br />
<font color="red">$INCLUDE sql/postgresql/ippool.conf</font><br />
Por<br />
<font color="blue">$INCLUDE sql/mysql/ippool.conf</font></p>
<p>Este é um valor que você pode trabalhar caso tenha algum problema (eu uso o padrão)<br />
<font color="blue">## IP lease duration. (Leases expire even if Acct Stop packet is lost)<br />
lease-duration = 3600</font></p>
<p>Para evitar duplicidade uso o MAC com key (Pois as NAS-port pode se repetir quando se tem mais de um PPPoE Serv)<br />
Comente:<br />
<font color="red">#pool-key = "%{NAS-Port}"</font><br />
Descomente:<br />
<font color="blue">pool-key = "%{Calling-Station-Id}"</font></p>
<p>Como é bem possível que seu servidor não autentique apenas usuários pppoe ou hotspot, para não termos cada vez que por exemplo um autenticação wireless psk/eap aparece o log que não foi definido uma pool, eu comentei:<br />
<font color="red">#sqlippool_log_nopool = "No Pool-Name defined \<br />
# (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})"</font></p>
<pre class="remontti-code"># cat sqlippool.conf |grep -v &quot;#&quot; |awk &#039;NF&gt;0&#039;</pre>
<p><strong>sqlippool.conf</strong> ficará assim:</p>
<pre class="remontti-code">sqlippool {
 sql-instance-name = &quot;sql&quot;
 ippool_table = &quot;radippool&quot;
 lease-duration = 3600
 pool-key = &quot;%{Calling-Station-Id}&quot;
$INCLUDE sql/mysql/ippool.conf
 sqlippool_log_exists = &quot;Existing IP: %{reply:Framed-IP-Address} \
  (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})&quot;
 sqlippool_log_success = &quot;Allocated IP: %{reply:Framed-IP-Address} from %{control:Pool-Name} \
  (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})&quot;
 sqlippool_log_clear = &quot;Released IP %{Framed-IP-Address}\
 (did %{Called-Station-Id} cli %{Calling-Station-Id} user %{User-Name})&quot;
 sqlippool_log_failed = &quot;IP Allocation FAILED from %{control:Pool-Name} \
  (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})&quot;
 #sqlippool_log_nopool = &quot;No Pool-Name defined \
 # (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})&quot;
}</pre>
<p>Umas das alterações que acho interessante alterar no ippool, é para que a cada nova alocação de IP ela seja randômica, isso pode solucionar alguns problemas como o daqueles clientes que jogam online, que fazem download, que estão sendo atacados, que ao reiniciar seu equipamento o mesmo irá receber um novo IP. Para isso vamos  editar o /etc/freeradius/sql/mysql/ippool.conf</p>
<pre class="remontti-code"># vim /etc/freeradius/sql/mysql/ippool.conf</pre>
<p>Comente</p>
<pre class="remontti-code">
### The ORDER BY clause of this query tries to allocate the same IP-address
### which user had last session...
&lt;font color=&quot;red&quot;&gt;#allocate-find = &quot;SELECT framedipaddress FROM ${ippool_table} \
# WHERE pool_name = &#039;%{control:Pool-Name}&#039; AND (expiry_time &lt; NOW() OR expiry_time IS NULL) \
# ORDER BY (username &lt;&gt; &#039;%{User-Name}&#039;), \
# (callingstationid &lt;&gt; &#039;%{Calling-Station-Id}&#039;), \
# expiry_time \
# LIMIT 1 \
# FOR UPDATE&quot;&lt;/font&gt;</pre>
<p>Descomente</p>
<pre class="remontti-code">### If you prefer to allocate a random IP address every time, i
### use this query instead
&lt;font color=&quot;blue&quot;&gt;allocate-find = &quot;SELECT framedipaddress FROM ${ippool_table} \
 WHERE pool_name = &#039;%{control:Pool-Name}&#039; \
 AND expiry_time IS NULL \
 ORDER BY RAND() \
 LIMIT 1 \
 FOR UPDATE&quot;&lt;/font&gt;</pre>
<p><strong>COUNTER</strong></p>
<p>Modulo counter é legal para criar alguns cenários de hotspot, ode você deseja limitar o tempo de conexão. Exemplo limitar que um usuário tenha acesso apenas durante 2h por dia/mês/único... E com um pouco de trabalho e personalização no /etc/freeradius/sql/mysql/counter.conf você consegue personalizar para contabilizar até mesmo tráfego de dados. </p>
<p>Caso você deseje habilitar-lo faça o seguinte:</p>
<pre class="remontti-code"># vim radius.conf</pre>
<p><strong>Descomenta </strong></p>
<pre class="remontti-code">modules {
[...]
       &lt;font color=&quot;blue&quot;&gt;$INCLUDE sql/mysql/counter.conf&lt;/font&gt;
[...]
}</pre>
<p><strong>Adicione</strong></p>
<pre class="remontti-code">instantiate {
[...]&lt;font color=&quot;blue&quot;&gt;
        # Habilite o mesmo no inner-tunnel
        # Modulos em  /etc/freeradius/sql/mysql/counter.conf
        dailycounter
        monthlycounter
        noresetcounter&lt;/font&gt;
[...]
}</pre>
<pre class="remontti-code"># vim /etc/freeradius/sites-available/inner-tunnel</pre>
<p><strong>Adicione abaixo de sql</strong></p>
<pre class="remontti-code">
authorize {
[...]
        sql
&lt;font color=&quot;blue&quot;&gt;
        #Mod Counter
        noresetcounter
        dailycounter
        monthlycounter&lt;/font&gt;
[...]
}</pre>
<pre class="remontti-code"># vim /etc/freeradius/sites-available/default</pre>
<p><strong>Adicione abaixo de sql</strong></p>
<pre class="remontti-code">authorize {
[...]
        sql
&lt;font color=&quot;blue&quot;&gt;
        noresetcounter
        dailycounter
        monthlycounter&lt;/font&gt;
[...]
}</pre>
<p>Corrigindo um bug. Acerte o nome da tabela (AcctSessionTime ==> acctsessiontime)</p>
<pre class="remontti-code"># vim /etc/freeradius/sql/mysql/counter.conf</pre>
<pre class="remontti-code">&lt;strong&gt;Altere&lt;/strong&gt;
&lt;font color=&quot;red&quot;&gt;query = &quot;SELECT IFNULL(SUM(AcctSessionTime),0) FROM radacct WHERE UserName=&#039;%{%k}&#039;&quot;&lt;/font&gt;
&lt;strong&gt;Para&lt;/strong&gt;
&lt;font color=&quot;blue&quot;&gt;query = &quot;SELECT IFNULL(SUM(&lt;strong&gt;acctsessiontime&lt;/strong&gt;),0) FROM radacct WHERE username=&#039;%{%k}&#039;&quot;&lt;/font&gt;</pre>
<p><strong>ALIMENTANDO NOSSA BASE DE DADOS </strong></p>
<p>Inicialmente eu particularmente não gosto da ideia da radusergroup não ter uma ID então para alterar isso faça. (Se desejar)</p>
<pre class="remontti-code"># mysql -u radius -p</pre>
<p>Entre com SUA-SENHA do radius no MySQL.</p>
<pre class="remontti-code">
USE radius;
ALTER TABLE `radusergroup` ADD `id` INT(20) NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`) ;
ALTER TABLE `radusergroup` ADD UNIQUE(`id`);
</pre>
<p>Agora vamos inserir alguns valores na nossa base de dados com alguns exemplos que explicarei no decorrer.<br />
Se você preferir pode usar os comando mysql direto no PHPMyAdmin.</p>
<p>Primeiramente precisamos de um cenário de rede para montar nossas configurações.<br />
<strong>FreeRadius:</strong> 250.250.0.10<br />
<strong>RB/RouterOS HotSpot:</strong> 250.250.1.2<br />
<strong>RB/RouterOS PPPoE:</strong> 250.250.1.3 / 10.10.0.1<br />
<strong>UBNT AP:</strong> 10.10.0.2</p>
<p><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2017/02/remontti-freeradius-tuto.png" alt="" width="884" height="575" class="alignnone size-full wp-image-1713" srcset="https://blog.remontti.com.br/wp-content/uploads/2017/02/remontti-freeradius-tuto.png 884w, https://blog.remontti.com.br/wp-content/uploads/2017/02/remontti-freeradius-tuto-300x195.png 300w, https://blog.remontti.com.br/wp-content/uploads/2017/02/remontti-freeradius-tuto-768x500.png 768w" sizes="auto, (max-width: 884px) 100vw, 884px" /></p>
<p>Note que nosso UBNT não está na mesma classe de IPs do FreeRadius, então possivelmente sua rede deve ter configurado algum tipo roteamento como OSPF / iBGP, que faça com que seu AP vs FreeRadius consiga comunicação. Caso exista um NAT para seu AP explicarei o que munda em seguida.</p>
<p><strong>TABELAS</strong></p>
<p><strong>• nas</strong><br />
A tabela NAS contém dados sobre (radius clientes) e é uma "substituição" para o arquivo clients.conf. É muito mais fácil manter os clientes no banco de dados do que dentro do arquivo de configuração. Ou seja, sua RB/RouterOS e seu UBNT AP são clientes, são eles que irão fazer consultas em nosso servidor. Para devemos autorizá-los inserindo na tabela nas:</p>
<pre class="remontti-code">
INSERT INTO `nas` (`nasname`, `shortname`, `type`, `ports`, `secret`, `server`, `community`, `description`) VALUES
(&#039;250.250.1.2&#039;, &#039;RB-RouterOS-PPPoE&#039;, &#039;other&#039;, NULL, &#039;SEU-SECRET&#039;, NULL, NULL, &#039;RouterOS PPPoE&#039;),
(&#039;250.250.1.3&#039;, &#039;RB-RouterOS-HotSpot&#039;, &#039;other&#039;, NULL, &#039;SEU-SECRET&#039;, NULL, NULL, &#039;RouterOS HotSpot&#039;),
(&#039;10.10.0.2&#039;, &#039;UBNT-AP&#039;, &#039;other&#039;, NULL, &#039;SEU-SECRET&#039;, NULL, NULL, &#039;POP1&#039;);
</pre>
<p>Depois de adicionar, editar ou apagar dados da tabela nas é necessário reiniciar o serviço FreeRadius para atualizar os dados.</p>
<pre class="remontti-code"># /etc/init.d/freeradius restart</pre>
<p><strong>• radcheck </strong>- Armazena os registo de cada utilizador com os respectivos atributos associados;<br />
<strong>• radgroupcheck</strong> – Associa atributos a um determinado grupo de utilizadores;<br />
<strong>• radgroupreply</strong> – Armazena os atributos que são devolvidos a todos os utilizadores de um grupo;<br />
<strong>• radusergroup</strong> - Associa um utilizador a um grupo de utilizadores;<br />
<strong>• radreply</strong> – Contém lista de atributos enviados ao utilizador;<br />
<strong>• radpostauth</strong> – Armazena informações acerca das respostas enviadas para os utilizadores;<br />
<strong>• radacct</strong> - Se encontra toda a informação de contabilização (extrato);</p>
<p>Vamos criar algumas configurações padrões, "nossos planos". Lembre-se que os atributos especificados não são necessariamente os mesmos, dependendo do seu cenário, uma boa alternativa é você rodar o freeradius em modo debug (# freeradius -X), e visualizar quais os valores estão vindo, assim você pode observar o que cada autenticação esta lhe trazendo e assim configurando seu grupo de forma segura. Fique atento pois se você cadastrar apenas um atributo poderá estar deixando grandes falhas de segurança.</p>
<pre class="remontti-code">
INSERT INTO `radgroupcheck` (`groupname`, `attribute`, `op`, `value`) VALUES
(&#039;PLANO_1&#039;, &#039;Pool-Name&#039;, &#039;:=&#039;, &#039;minhapool&#039;), /* Definimos o nome da pool de IPs*/
(&#039;PLANO_1&#039;, &#039;Simultaneous-Use&#039;, &#039;:=&#039;, &#039;1&#039;), /* Permitimos apenas uma autenticação simultânea */
(&#039;PLANO_1&#039;, &#039;Framed-Protocol&#039;, &#039;:=&#039;, &#039;PPP&#039;), /* Apenas protocolo PPP então isso não server para Hotspot */
(&#039;PLANO_1&#039;, &#039;Service-Type&#039;, &#039;:=&#039;, &#039;Framed-User&#039;), /* Tipo de serviço  */
(&#039;PLANO_2&#039;, &#039;Pool-Name&#039;, &#039;:=&#039;, &#039;minhapool&#039;),
(&#039;PLANO_2&#039;, &#039;Simultaneous-Use&#039;, &#039;:=&#039;, &#039;1&#039;),
(&#039;PLANO_2&#039;, &#039;Framed-Protocol&#039;, &#039;:=&#039;, &#039;PPP&#039;),
(&#039;PLANO_2&#039;, &#039;Service-Type&#039;, &#039;:=&#039;, &#039;Framed-User&#039;),
(&#039;AVISO&#039;, &#039;Pool-Name&#039;, &#039;:=&#039;, &#039;avisoPool&#039;),
(&#039;AVISO&#039;, &#039;Simultaneous-Use&#039;, &#039;:=&#039;, &#039;1&#039;),
(&#039;AVISO&#039;, &#039;Framed-Protocol&#039;, &#039;:=&#039;, &#039;PPP&#039;),
(&#039;AVISO&#039;, &#039;Service-Type&#039;, &#039;:=&#039;, &#039;Framed-User&#039;),
(&#039;BLOQUEIO&#039;, &#039;Pool-Name&#039;, &#039;:=&#039;, &#039;bloqPool&#039;),
(&#039;BLOQUEIO&#039;, &#039;Simultaneous-Use&#039;, &#039;:=&#039;, &#039;1&#039;),
(&#039;BLOQUEIO&#039;, &#039;Framed-Protocol&#039;, &#039;:=&#039;, &#039;PPP&#039;),
(&#039;BLOQUEIO&#039;, &#039;Service-Type&#039;, &#039;:=&#039;, &#039;Framed-User&#039;),
(&#039;PLANO_HOT&#039;, &#039;NAS-Port-Type&#039;, &#039;==&#039;, &#039;Wireless-802.11&#039;),
(&#039;PLANO_HOT(naonecessariamente)&#039;, &#039;Pool-Name&#039;, &#039;:=&#039;, &#039;poolHot&#039;),
(&#039;PLANO_HOT&#039;, &#039;Simultaneous-Use&#039;, &#039;:=&#039;, &#039;1&#039;),
(&#039;30MIN-DIA&#039;, &#039;Max-Daily-Session&#039;, &#039;:=&#039;, &#039;1800&#039;), /* Modulo counter */
(&#039;30MIN-DIA&#039;, &#039;NAS-Port-Type&#039;, &#039;==&#039;, &#039;Wireless-802.11&#039;),
(&#039;30MIN-DIA&#039;, &#039;Simultaneous-Use&#039;, &#039;:=&#039;, &#039;1&#039;),
(&#039;2h-UNICO&#039;, &#039;Max-All-Session&#039;, &#039;:=&#039;, &#039;7200&#039;),
(&#039;2h-UNICO&#039;, &#039;NAS-Port-Type&#039;, &#039;==&#039;, &#039;Wireless-802.11&#039;),
(&#039;2h-UNICO&#039;, &#039;Simultaneous-Use&#039;, &#039;:=&#039;, &#039;1&#039;),
(&#039;7.5h-MES&#039;, &#039;Max-Monthly-Session&#039;, &#039;:=&#039;, &#039;27000&#039;),
(&#039;7.5h-MES&#039;, &#039;NAS-Port-Type&#039;, &#039;==&#039;, &#039;Wireless-802.11&#039;),
(&#039;7.5h-MES&#039;, &#039;Simultaneous-Use&#039;, &#039;:=&#039;, &#039;1&#039;);

INSERT INTO `radgroupreply` (`groupname`, `attribute`, `op`, `value`) VALUES
(&#039;PLANO_1&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;), /* Intervalo em seg que a radcct será atualizada */
(&#039;PLANO_1&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;1024k/2048k&#039;), /* Velocidade da queues */
(&#039;PLANO_2&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;512k/1024k 1024k/2048k 512k/1024k 600/600&#039;), /* Velocidade com Burst */
(&#039;PLANO_2&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;),
(&#039;AVISO&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;),
(&#039;AVISO&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;999K/999K&#039;),
(&#039;BLOQUEIO&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;999K/999K&#039;),
(&#039;BLOQUEIO&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;),
(&#039;PLANO_HOT&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;),
(&#039;PLANO_HOT&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;1024K/1024K&#039;),
(&#039;30MIN-DIA&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;),
(&#039;30MIN-DIA&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;1024K/1024K&#039;),
(&#039;2h-UNICO&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;),
(&#039;2h-UNICO&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;1024K/1024K&#039;),
(&#039;7.5h-MES&#039;, &#039;Acct-Interim-Interval&#039;, &#039;:=&#039;, &#039;300&#039;),
(&#039;7.5h-MES&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;1024K/1024K&#039;);
</pre>
<p>Criamos alguns planos para atribuir aos nossos usuários PPPoE e Hotspot. Vamos aos nossos usuários:</p>
<pre class="remontti-code">
INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES
/*Autenticacao de um cliente CPE UBNT WIFI WPA2 EAP */
(&#039;cliente5.8@dominio.com.br&#039;, &#039;Cleartext-Password&#039;, &#039;:=&#039;, &#039;senha&#039;),
(&#039;cliente5.8@dominio.com.br&#039;, &#039;Calling-Station-Id&#039;, &#039;==&#039;, &#039;00:11:22:33:44:55&#039;),
(&#039;cliente5.8@dominio.com.br&#039;, &#039;Service-Type&#039;, &#039;==&#039;, &#039;Framed-User&#039;),
(&#039;cliente5.8@dominio.com.br&#039;, &#039;Simultaneous-Use&#039;, &#039;:=&#039;, &#039;1&#039;),
(&#039;cliente5.8@dominio.com.br&#039;, &#039;Pool-Name&#039;, &#039;:=&#039;, &#039;minhapool&#039;),
(&#039;cliente5.8@dominio.com.br&#039;, &#039;Framed-Protocol&#039;, &#039;:=&#039;, &#039;PPP&#039;),
(&#039;001122334455&#039;, &#039;Cleartext-Password&#039;, &#039;:=&#039;, &#039;minhasenha&#039;),
(&#039;001122334455&#039;, &#039;Auth-Type&#039;, &#039;==&#039;, &#039;EAP&#039;),

/*Autenticacao de um cliente CPE UBNT 2.4 vs WIFI WPA/WPA2 PSK RouterOS */
(&#039;cliente2.4@dominio.com.br&#039;, &#039;Cleartext-Password&#039;, &#039;:=&#039;, &#039;senha&#039;),
(&#039;cliente2.4@dominio.com.br&#039;, &#039;Calling-Station-Id&#039;, &#039;==&#039;, &#039;55:44:33:22:11:00&#039;),
(&#039;cliente2.4@dominio.com.br&#039;, &#039;Service-Type&#039;, &#039;==&#039;, &#039;Framed-User&#039;),
(&#039;cliente2.4@dominio.com.br&#039;, &#039;Simultaneous-Use&#039;, &#039;:=&#039;, &#039;1&#039;),
(&#039;cliente2.4@dominio.com.br&#039;, &#039;Pool-Name&#039;, &#039;:=&#039;, &#039;minhapool&#039;),
(&#039;cliente2.4@dominio.com.br&#039;, &#039;Framed-Protocol&#039;, &#039;:=&#039;, &#039;PPP&#039;),
(&#039;55:44:33:22:11:00&#039;, &#039;Auth-Type&#039;, &#039;:=&#039;, &#039;Accept&#039;),
(&#039;55:44:33:22:11:00&#039;, &#039;NAS-Port-Type&#039;, &#039;==&#039;, &#039;Wireless-802.11&#039;);

INSERT INTO `radreply` (`username`, `attribute`, `op`, `value`) VALUES
(&#039;55:44:33:22:11:00&#039;, &#039;Mikrotik-Wireless-PSK&#039;, &#039;:=&#039;, &#039;senha-psk&#039;);
/* A senha PSK fica na radreply */
</pre>
<p>E por fim vamos alimentar nossa tabela de ippool, como nossos IPs que serão entregue. No cenário fiz 3 pool, <strong>minhapool </strong>ounde vão ficar os IPs válidos, <strong>avisoPool </strong>que receberão um bloco de ips diferenciado, por ex. para direcionar os clientes para algum tipo de aviso. E <strong>bloqPool </strong>para clientes que ficarão bloqueado. </p>
<pre class="remontti-code">
INSERT INTO `radippool` (`pool_name`, `framedipaddress`, `nasipaddress`, `calledstationid`, 
`callingstationid`, `expiry_time`, `username`, `pool_key`) VALUES
(&#039;minhapool&#039;, &#039;100.64.0.1&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;minhapool&#039;, &#039;100.64.0.2&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;minhapool&#039;, &#039;100.64.0.3&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;minhapool&#039;, &#039;100.64.0.4&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;bloqPool&#039;, &#039;172.16.0.1&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;bloqPool&#039;, &#039;172.16.0.2&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;bloqPool&#039;, &#039;172.16.0.3&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;bloqPool&#039;, &#039;172.16.0.4&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;avisoPool&#039;, &#039;172.16.1.1&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;avisoPool&#039;, &#039;172.16.1.2&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;avisoPool&#039;, &#039;172.16.1.3&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;),
(&#039;avisoPool&#039;, &#039;172.16.1.4&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, NULL, &#039;&#039;, &#039;0&#039;);
</pre>
<p>Ainda pode fixar algumas configurações especificadamente ao usuário, vamos a alguns exemplos.</p>
<pre class="remontti-code">
INSERT INTO `radreply` (`username`, `attribute`, `op`, `value`) VALUES
(&#039;usuario@dominio.com.br&#039;, &#039;Mikrotik-Rate-Limit&#039;, &#039;:=&#039;, &#039;2000k/4000k&#039;), /* Setando velocidade */
(&#039;usuario@dominio.com.br&#039;, &#039;Framed-IP-Address&#039;, &#039;:=&#039;, &#039;250.250.0.150&#039;), /* Setando IP Fixo */
(&#039;usuario@dominio.com.br&#039;, &#039;Framed-IPv6-Prefix&#039;, &#039;:=&#039;, &#039;2001:db8:A:B::/64&#039;), /* IPv6 &quot;Wan&quot; */
(&#039;usuario@dominio.com.br&#039;, &#039;Mikrotik-Delegated-IPv6-Pool&#039;, &#039;:=&#039;, &#039;2001:db8:C::/56&#039;); /* IPv6 &quot;Lan&quot; */
</pre>
<p><strong>Configuração Simples do PPPoE Server no RouterOS (Mikrotik)</strong></p>
<pre class="remontti-code">
/interface pppoe-server server
add authentication=pap,chap disabled=no interface=ether1 keepalive-timeout=30 max-mru=1480 \
 max-mtu=1480 one-session-per-host=yes service-name=PPPoE-Server

/ppp profile
set *0 change-tcp-mss=default dns-server=250.250.0.2,250.250.0.3 local-address=250.250.0.10 

/ppp aaa
set interim-update=5m use-radius=yes

/radius
add address=250.250.250.2 secret=&quot;SEU-SECRET&quot; service=ppp,hotspot,wireless

####################
### Wireless PSK ###
####################
/interface wireless security-profiles
add authentication-types=wpa2-psk management-protection=allowed mode=dynamic-keys name=WPA2 \ 
 radius-mac-authentication=yes wpa2-pre-shared-key=3n20oXOPjohONpEK

/interface wireless
set [ find default-name=wlan1 ] security-profile=WPA2
</pre>
<p><strong>Configuração UBNT AP</strong> (10.10.0.2)<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2017/02/ap-ubnt.png" data-rel="lightbox-gallery-UAEvGyn6" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2017/02/ap-ubnt-300x266.png" alt="" width="300" height="266" class="alignnone size-medium wp-image-1715" srcset="https://blog.remontti.com.br/wp-content/uploads/2017/02/ap-ubnt-300x266.png 300w, https://blog.remontti.com.br/wp-content/uploads/2017/02/ap-ubnt-768x680.png 768w, https://blog.remontti.com.br/wp-content/uploads/2017/02/ap-ubnt.png 811w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p><strong>Configuração UBNT Cliente EAP</strong> 5.8Mhz<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt2.png" data-rel="lightbox-gallery-UAEvGyn6" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt2-300x248.png" alt="" width="300" height="248" class="alignnone size-medium wp-image-1716" srcset="https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt2-300x248.png 300w, https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt2-768x634.png 768w, https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt2.png 808w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p><a href="https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt.png" data-rel="lightbox-gallery-UAEvGyn6" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt-300x294.png" alt="" width="300" height="294" class="alignnone size-medium wp-image-1717" srcset="https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt-300x294.png 300w, https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt-768x752.png 768w, https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt.png 804w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p><strong>Configuração UBNT Cliente PSK</strong> 2.4Mhz Conectando no Cartão do MK<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt3.png" data-rel="lightbox-gallery-UAEvGyn6" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt3-300x218.png" alt="" width="300" height="218" class="alignnone size-medium wp-image-1720" srcset="https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt3-300x218.png 300w, https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt3-768x558.png 768w, https://blog.remontti.com.br/wp-content/uploads/2017/02/cliente-ubnt3.png 810w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p><strong>Fontes:</strong><br />
<em>https://wiki.freeradius.org/guide/SQL-HOWTO<br />
https://wiki.freeradius.org/modules/Rlm_sql<br />
https://wiki.freeradius.org/modules/Rlm_sqlippool<br />
https://wiki.freeradius.org/modules/Rlm_sqlcounter</em><br />
https://www.draw.io/ (Gráficos)</p>
<p>O post <a href="https://blog.remontti.com.br/1651">Servidor FreeRadius com integração MySQL + Autenticação PPPoE &#038; Hotspot VS Mikrotik + Ubiquiti EAP/PSK [Descontinuado]</a> apareceu primeiro em <a href="https://blog.remontti.com.br">Remontti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.remontti.com.br/1651/feed</wfw:commentRss>
			<slash:comments>30</slash:comments>
		
		
			</item>
	</channel>
</rss>
