<?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 pppoe - Remontti</title>
	<atom:link href="https://blog.remontti.com.br/tag/pppoe/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.remontti.com.br/tag/pppoe</link>
	<description>rudimar@remontti</description>
	<lastBuildDate>Tue, 10 Dec 2024 18:00:24 +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 pppoe - Remontti</title>
	<link>https://blog.remontti.com.br/tag/pppoe</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Solução PPPoE de Baixo Custo e Muito Desempenho</title>
		<link>https://blog.remontti.com.br/4414</link>
					<comments>https://blog.remontti.com.br/4414#comments</comments>
		
		<dc:creator><![CDATA[Jr Decezere]]></dc:creator>
		<pubDate>Tue, 02 Jun 2020 23:26:21 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[accel]]></category>
		<category><![CDATA[accel-ppp]]></category>
		<category><![CDATA[debia]]></category>
		<category><![CDATA[debian 10]]></category>
		<category><![CDATA[pppoe]]></category>
		<guid isPermaLink="false">https://blog.remontti.com.br/?p=4414</guid>

					<description><![CDATA[<p>Com a popularização da fibra óptica nos últimos anos, chegaram os super planos de velocidade, 100 mega 300 mega 500 mega entregues ao cliente final, e com isso muitos provedores começaram a enfrentar problemas&#46;&#46;&#46;</p>
<p>O post <a href="https://blog.remontti.com.br/4414">Solução PPPoE de Baixo Custo e Muito Desempenho</a> apareceu primeiro em <a href="https://blog.remontti.com.br">Remontti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Com a popularização da fibra óptica nos últimos anos, chegaram os super planos de velocidade, 100 mega 300 mega 500 mega entregues ao cliente final, e com isso muitos provedores começaram a enfrentar problemas para conseguir entregar uma internet de qualidade. Provedores que utilizam MikroTik em seus concentradores PPPoE sofrem com problemas de alto processamento, desempenho e travamentos em seus equipamentos.</p>
<p>No tutorial de hoje vamos apresentar uma solução PPPoE para mais de 3 mil usuários custando menos que uma Routerboard CCR 1036.</p>
<p>O SOFTWARE:<br />
Neste tutorial vamos utilizar o Accel-PPP, um software open-source que roda em ambiente Linux.</p>
<p>LINUX SUPORTADO:<br />
O Accel-PPP tem suporte a CentOS, Debian e Ubuntu, para o tutorial vamos utilizar o Debian10.</p>
<p>Servidor referência para comparar desempenho:<br />
Dell R410 2 Xeon L5520, 16gb ram, 1 placa intel X520-DA2 (Encontrado por até R$ 5.000,00 com placa de Intel X520-DA2)<br />
Nos testes com Accel-PPP com o R410 autenticamos cerca de 3200 mil usuários com processamento na casa dos 30% e passando 4.7 Gbps.</p>
<p><a href="https://blog.remontti.com.br/2966">Instalação Debian 10 Buster LIMPA Passo-a-passo</a></p>
<p>Para instalar o Accel-PPP siga os seguintes passos abaixo:</p>
<p>Atualizar Debian e instalar dependências necessárias</p>
<pre class="remontti-code"># apt update &amp;&amp; apt upgrade
# apt install -y build-essential cmake gcc linux-headers-`uname -r` git libpcre3-dev libssl-dev liblua5.1-0-dev</pre>
<p>Copiar o código fonte do Accel-PPP do repositório oficial</p>
<pre class="remontti-code"># git clone https://github.com/xebd/accel-ppp.git /opt/accel-ppp-code</pre>
<p>Criar e acessar a pasta aonde vamos preparar o código para iniciar a instalação</p>
<pre class="remontti-code"># mkdir /opt/accel-ppp-code/build
# cd /opt/accel-ppp-code/build/</pre>
<p>Compilar e instalar o Accel-PPP </p>
<pre class="remontti-code"># cmake -DCMAKE_INSTALL_PREFIX=/usr -DCPACK_TYPE=Debian10 ..
# make
# cpack -G DEB
# apt install ./accel-ppp.deb</pre>
<p>Ative o Accel-PPP na inicialização do Debian</p>
<pre class="remontti-code"># systemctl enable accel-ppp</pre>
<p>Crie o arquivo aonde vamos configurar o accel para autenticar nosso primeiro usuário</p>
<pre class="remontti-code"># vi /etc/accel-ppp.conf</pre>
<p>Dentro do arquivo, cole o seguinte código:<br />
obs: troque ens192 pela placa de rede que o cliente vai autenticar, e troque 192.168.10.25 pelo ip da wan do debian</p>
<pre class="remontti-code">[modules]
log_file
pppoe
auth_pap
chap-secrets
ippool
shaper

[core]
log-error=/var/log/accel-ppp/core.log
thread-count=4

[ppp]
verbose=1
min-mtu=1280
mtu=1480
mru=1480
ipv4=require
ipv6=deny
lcp-echo-interval=20
lcp-echo-timeout=120

[pppoe]
verbose=1
ip-pool=pool_pppoe
interface=ens192

[dns]
dns1=8.8.8.8
dns2=1.1.1.1

[ip-pool]
gw-ip-address=192.168.10.25
100.64.0.0/24,name=pool_pppoe

[log]
log-file=/var/log/accel-ppp/accel-ppp.log
log-emerg=/var/log/accel-ppp/emerg.log
log-fail-file=/var/log/accel-ppp/auth-fail.log
copy=1
level=3

[chap-secrets]
gw-ip-address=192.168.10.25
chap-secrets=/etc/chap-secrets

[shaper]
up-limiter=police
down-limiter=tbf
verbose=1

[cli]
verbose=1
telnet=127.0.0.1:2000
tcp=127.0.0.1:2001</pre>
<p>Próximo passo é criar o arquivo aonde vai ficar os dados do usuário:</p>
<pre class="remontti-code">vi /etc/chap-secrets</pre>
<p>Dentro do arquivo vamos colar o seguinte:</p>
<pre class="remontti-code">#usuario    server      senha       ip-address      velocidade
teste       *           teste       *               20480/10240</pre>
<p>Agora com tudo configurado, vamos reiniciar o serviço do Accel-PPP para aplicar as configurações:</p>
<pre class="remontti-code">/etc/init.d/accel-ppp restart</pre>
<p>Se você seguiu o tutorial até aqui corretamente, coloque um roteador para discar e vamos ver o resultado, o usuário que configuramos no arquivo /etc/chap-secrets foi usuário: <strong>teste</strong> senha: <strong>teste</strong></p>
<p>Com o roteador conectado, vamos digitar o seguinte no terminal do Debian10:</p>
<pre class="remontti-code">accel-cmd show sessions</pre>
<p>com este comando vamos ver o nosso primeiro usuário conectado:</p>
<pre class="remontti-code">root@accel-deb10:/etc# accel-cmd show sessions
 ifname | username |    calling-sid    |     ip     | rate-limit  | type  | comp | state  |  uptime
--------+----------+-------------------+------------+-------------+-------+------+--------+----------
 ppp0   | teste    | 64:d1:54:17:76:c7 | 100.64.0.0 | 20480/10240 | pppoe |      | active | 00:02:03</pre>
<p>Último passo para o cliente navegar é ativar o IP FORWARD no Debian, e fazer o NAT.</p>
<pre class="remontti-code">
echo &quot;net.ipv4.ip_forward = 1&quot; &gt;&gt; /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

/sbin/iptables -t nat -A POSTROUTING -s 100.64.0.0/24 -j MASQUERADE
</pre>
<p>Chegando até aqui, você já consegue autenticar um usuário e fazer ele navegar a partir do Servidor PPPoE, para autenticar usamos um método de autenticação local, com usuário, senha e plano configurados dentro do Debian, mas o Accel-PPP é compatível com muitos sistemas de gerencia de provedores  ex: (MkAuth, SGP, IXC, TOPSAPP, MkSolutions, HubSoft dentre outros ).</p>
<p>Autor: Júnior Decezere <a href="http://t.me/jrdecezere">http://t.me/jrdecezere</a></p>
<p>Grupo do Telegram para trocas de informações sobre o Accel-PPP <a href="https://t.me/braccelppp">https://t.me/braccelppp</a></p>
<p><strong>Link Curso Accel-PPP do ZERO ao AVANÇADO</strong> <a href="http://www.cursoaccelppp.com.br/" target="_blank" rel="noopener noreferrer">http://www.cursoaccelppp.com.br/</a><br />
Pagando o curso <a href="https://www.mercadopago.com.br/checkout/v1/redirect?pref_id=194129618-0bc7971b-2c13-4f53-b1c7-f25f166b8e11" rel="noopener noreferrer" target="_blank">por esse link</a>, você reverte uma % para o remontti.com.br</p>
<p><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>O post <a href="https://blog.remontti.com.br/4414">Solução PPPoE de Baixo Custo e Muito Desempenho</a> apareceu primeiro em <a href="https://blog.remontti.com.br">Remontti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.remontti.com.br/4414/feed</wfw:commentRss>
			<slash:comments>24</slash:comments>
		
		
			</item>
		<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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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-ZYBBdbmY" 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>Como entregar IPv6+IPv4 no Mikrotik/RouterOS através de PPPoE/DHCPv6 PD e registrando os logs em um banco de dados</title>
		<link>https://blog.remontti.com.br/3931</link>
					<comments>https://blog.remontti.com.br/3931#comments</comments>
		
		<dc:creator><![CDATA[Rudimar Remontti]]></dc:creator>
		<pubDate>Wed, 22 Jan 2020 02:28:36 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mikrotik]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[debian 10]]></category>
		<category><![CDATA[Delegated-IPv6-Prefix]]></category>
		<category><![CDATA[ipv6]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[ppp]]></category>
		<category><![CDATA[pppoe]]></category>
		<category><![CDATA[Prefix-Delegated]]></category>
		<category><![CDATA[routeos]]></category>
		<guid isPermaLink="false">https://blog.remontti.com.br/?p=3931</guid>

					<description><![CDATA[<p>Neste tutorial vamos aprender como entregar IPv6 para clientes finais utilizando RouterOS/Mikrotik (Concentrador PPPoE) e registrar os logs dos prefixos IPv6 entregue na WAN (Remote IPv6 Prefix Pool) e na LAN (DHCPv6 PD Pool).&#46;&#46;&#46;</p>
<p>O post <a href="https://blog.remontti.com.br/3931">Como entregar IPv6+IPv4 no Mikrotik/RouterOS através de PPPoE/DHCPv6 PD e registrando os logs em um banco de dados</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/01/banner_ipv6_log_mk.jpg" alt="" width="720" height="340" class="alignnone size-full wp-image-3950" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/banner_ipv6_log_mk.jpg 720w, https://blog.remontti.com.br/wp-content/uploads/2020/01/banner_ipv6_log_mk-300x142.jpg 300w, https://blog.remontti.com.br/wp-content/uploads/2020/01/banner_ipv6_log_mk-520x245.jpg 520w" sizes="auto, (max-width: 720px) 100vw, 720px" /><br />
Neste tutorial vamos aprender como entregar IPv6 para clientes finais utilizando RouterOS/Mikrotik (Concentrador PPPoE) e registrar os logs dos prefixos IPv6 entregue na WAN (Remote IPv6 Prefix Pool) e na LAN (DHCPv6 PD Pool).</p>
<p>Ainda hoje encontramos alguns bugs no Mikrotik, e um dos maiores motivos de buscar essa solução foi que freeradius não registra os logs de IPv6 PD (Mikrotik), o IPv6 que vai se configurar na LAN cliente (o mais importante a ser guardado), seria muito mais fácil para muitos sistemas se implementassem o Delegated-IPv6-Prefix, mas já faz 6 anos (jan/2020) que é motivo de discussão lá no <a href="https://forum.mikrotik.com/viewtopic.php?t=89443" rel="noopener noreferrer" target="_blank">forum</a>. E para variar a solução é dar aquele jeitinho&#8230;. (Popular gambiarra) <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>
<p>Para montar esse servidor de logs você precisa apenas de um serviço WEB (Apache/NGINX) PHP7+ e um banco de dados MySQL/MariaDB.</p>
<p><strong>Requisito para montar um servidor do zero</strong>:<br />
<a href="https://blog.remontti.com.br/2966" rel="noopener noreferrer" target="_blank">&#8211; Debian 10 Stretch / Instalação Limpa</a><br />
<a href="https://blog.remontti.com.br/3006" rel="noopener noreferrer" target="_blank">&#8211; Como criar um servidor WEB Apache + PHP + MariaDB + phpMyAdmin no Debian 10 Buster “LAMP”</a></p>
<p>Você precisa ter um pouquinho de conhecimento em IPv6 e saber dividir as subclasses. Recomendo dar uma olhadinha no <a href="http://ipv6.nic.br/" rel="noopener noreferrer" target="_blank">http://ipv6.nic.br/</a> lá irá encontrar cursos do NIC.BR.</p>
<p>Recomendo você instalar uma calculadora de IPv6. Aqui vai uma calculador muito boa que uso no dia a dia.<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/01/ip6calc.png" data-rel="lightbox-gallery-D14eXyB7" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/01/ip6calc.png" alt="" width="1680" height="1008" class="alignnone size-full wp-image-3933" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/ip6calc.png 1680w, https://blog.remontti.com.br/wp-content/uploads/2020/01/ip6calc-300x180.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/01/ip6calc-1024x614.png 1024w, https://blog.remontti.com.br/wp-content/uploads/2020/01/ip6calc-768x461.png 768w, https://blog.remontti.com.br/wp-content/uploads/2020/01/ip6calc-1536x922.png 1536w" sizes="auto, (max-width: 1680px) 100vw, 1680px" /></a></p>
<pre class="remontti-code"># apt install wget python-ipaddr
# wget https://blog.remontti.com.br/arquivos/Home/ip6calc -O /bin/ip6calc
# chmod +x /bin/ip6calc</pre>
<p>Para fazer o calculo use ex.:</p>
<pre class="remontti-code"># ip6calc 2001:db8:abcd::/48</pre>
<p>Para esse projeto desenvolvi em PHP alguns arquivos onde fica &#8220;ouvido&#8221; os logs que o Mikrotik irá enviar e uma telinha simples para fazer buscas dos IPs nesse banco de dados. Já disponibilizei ele lá no <a href="https://github.com/remontti/LogIPv6RouterOS" rel="noopener noreferrer" target="_blank">github</a>.</p>
<p>Com seu servidor web configurado, <a href="https://blog.remontti.com.br/3464" rel="noopener noreferrer" target="_blank">seria bacana criar um host no seu dns e configurar nesse seu servdor web um domínio virtual</a> ex.: log6.seudominio.com.br onde você irá jogar os arquivos do projeto. Mas como muitos não tem essa facilidade vou tentar deixar aqui a forma mais simples, que é jogar os arquivos no diretório padrão do apache &#8220;/var/www/html&#8221;, assim qualquer um consegue montar <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>Acessamos o diretório base então</p>
<pre class="remontti-code"># cd /var/www/html
# wget https://github.com/remontti/LogIPv6RouterOS/archive/master.zip
# apt install unzip
# unzip master.zip 
# mv LogIPv6RouterOS-master logs6
# cd logs6</pre>
<p>Por segurança crie/edite um .htaccess para proteger que apenas determinados IPs tenham acesso. (apensar de ter um token)</p>
<pre class="remontti-code"># vim .htaccess</pre>
<p>Altere pelo IPs que você deseja que tenham acesso. (Seus router e seu NOC)</p>
<pre class="remontti-code">Options -Indexes
&lt;RequireAll&gt;
    &lt;RequireAny&gt;
        Require ip 200.200.200.0/24
        Require ip 192.168.0.0/26
        Require ip 2001:db8::/32
    &lt;/RequireAny&gt;
&lt;/RequireAll&gt;</pre>
<p>Precisaremos criar um banco de dados e nossa tabela. Para gerar suas senhas/token recomendo <a href="https://senhasegura.remontti.com.br/" rel="noopener noreferrer" target="_blank">https://senhasegura.remontti.com.br/</a> e gerar algo aleatório.</p>
<pre class="remontti-code"># mariadb -p</pre>
<p>Crie o banco de dados, não esqueça de alterar a senha (SUA_SENHA_DA_CONEXAO)</p>
<pre class="remontti-code">CREATE DATABASE logs6;
GRANT ALL PRIVILEGES ON logs6.* TO &#039;logs6&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;SUA_SENHA_DA_CONEXAO&#039;;
FLUSH PRIVILEGES;
quit;</pre>
<p>Importe a tabela utilizando a senha criada anteriormente</p>
<pre class="remontti-code"># mariadb -u logs6 logs6 &lt; logs6_mikrotik.sql -p</pre>
<p>Agora altere no arquivo <strong>config.php</strong> o <strong>token</strong> para validar seu envio de dados e acessar o interface simples que desenvolvi para buscas, e a senha de conexão com banco (db_password).</p>
<pre class="remontti-code">
?php
/* Your security token  */
$token = &#039;xxxxxxxxxxxxx&#039;;

/* Set langage */
// Portugês Brasil: pt-br
// English:  en
$lang = &#039;pt-br&#039;;

/* Db conect */
$db_host = &#039;localhost&#039;;
$db_user = &#039;logs6&#039;;
$db_password = &#039;SUA_SENHA_DA_CONEXAO&#039;;
$db_name = &#039;logs6&#039;;
</pre>
<p>Agora acesse sua <strong>http(s)://URL/logs6/</strong>. Você deve receber a seguinte tela.<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/01/mikrotik_logs_ipv6.png" data-rel="lightbox-gallery-D14eXyB7" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/01/mikrotik_logs_ipv6.png" alt="" width="965" height="243" class="alignnone size-full wp-image-3971" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/mikrotik_logs_ipv6.png 965w, https://blog.remontti.com.br/wp-content/uploads/2020/01/mikrotik_logs_ipv6-300x76.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/01/mikrotik_logs_ipv6-768x193.png 768w" sizes="auto, (max-width: 965px) 100vw, 965px" /></a></p>
<p>Já pode autenticar com seu token (ainda não terá logs, então não adianta querer fazer buscas rsrsrs)<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/01/mikrotik_logs_ipv6_search.png" data-rel="lightbox-gallery-D14eXyB7" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/01/mikrotik_logs_ipv6_search.png" alt="" width="991" height="253" class="alignnone size-full wp-image-3974" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/mikrotik_logs_ipv6_search.png 991w, https://blog.remontti.com.br/wp-content/uploads/2020/01/mikrotik_logs_ipv6_search-300x77.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/01/mikrotik_logs_ipv6_search-768x196.png 768w" sizes="auto, (max-width: 991px) 100vw, 991px" /></a></p>
<p>Se alguém tiver ideias melhores/criticas todas são bem vindas, sinta-se a vontade para criar forks do projeto. </p>
<p>Para entregar IPv6 em seu Mk é claro que  precisa ter conectividade v6 em seu concentrador PPPoE (Não vou entrar em detalhes nessa parte pois entraria na questão roteamento da sua rede, mas se vale de ajuda como dica um iBGP/OSPF resolve fácil)</p>
<p>Servidor preparado para receber os logs vamos ao routerOS/Mikrotik. Você precisará criar duas Pool, uma para <strong>WAN</strong> outra para a <strong>LAN</strong>, como recomendação do nic.br para LAN do cliente devemos enviar um prefixo /56 (mas isso não é uma regra). A calcular pode ajudar muito nessa parte. No meu exemplo vou reservar um <strong>prefixo /48</strong> para entregar <strong>prefixos /64 na WAN</strong> (65.536 prefixos/64), e um <strong>prefixo /45</strong> entregando <strong>prefixos /56</strong> oque daria 2.048 prefixos (clientes).</p>
<p>Ex 2001:db8:1000::/48 (WAN)<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/01/calc1.png" data-rel="lightbox-gallery-D14eXyB7" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/01/calc1.png" alt="" width="1568" height="814" class="alignnone size-full wp-image-3939" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/calc1.png 1568w, https://blog.remontti.com.br/wp-content/uploads/2020/01/calc1-300x156.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/01/calc1-1024x532.png 1024w, https://blog.remontti.com.br/wp-content/uploads/2020/01/calc1-768x399.png 768w, https://blog.remontti.com.br/wp-content/uploads/2020/01/calc1-1536x797.png 1536w" sizes="auto, (max-width: 1568px) 100vw, 1568px" /></a></p>
<p>Ex 2001:db8:2000::/45 (LAN)<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/01/calc2.png" data-rel="lightbox-gallery-D14eXyB7" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/01/calc2.png" alt="" width="1571" height="831" class="alignnone size-full wp-image-3940" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/calc2.png 1571w, https://blog.remontti.com.br/wp-content/uploads/2020/01/calc2-300x159.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/01/calc2-1024x542.png 1024w, https://blog.remontti.com.br/wp-content/uploads/2020/01/calc2-768x406.png 768w, https://blog.remontti.com.br/wp-content/uploads/2020/01/calc2-1536x812.png 1536w" sizes="auto, (max-width: 1571px) 100vw, 1571px" /></a></p>
<p><strong>IPv6 -> Pool</strong><br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/01/pool_v6.png" data-rel="lightbox-gallery-D14eXyB7" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/01/pool_v6.png" alt="" width="538" height="182" class="alignnone size-full wp-image-3942" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/pool_v6.png 538w, https://blog.remontti.com.br/wp-content/uploads/2020/01/pool_v6-300x101.png 300w" sizes="auto, (max-width: 538px) 100vw, 538px" /></a></p>
<p>Alteramos no profile. Menu PPP aba Profiles.<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_1.png" data-rel="lightbox-gallery-D14eXyB7" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_1.png" alt="" width="1138" height="658" class="alignnone size-full wp-image-3943" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_1.png 1138w, https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_1-300x173.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_1-1024x592.png 1024w, https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_1-768x444.png 768w" sizes="auto, (max-width: 1138px) 100vw, 1138px" /></a><br />
<strong>Remote IPv6 Prefix Pool</strong> selecione sua <strong>pool_wan</strong> e <strong>DHCPv6 PD Pool </strong>sua <strong>pool_lan</strong></p>
<p><a href="https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_2.png" data-rel="lightbox-gallery-D14eXyB7" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_2.png" alt="" width="546" height="250" class="alignnone size-full wp-image-3944" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_2.png 546w, https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_2-300x137.png 300w" sizes="auto, (max-width: 546px) 100vw, 546px" /></a><br />
Na abra Protocol, Use IPv6 selecione yes.</p>
<p>Vamos ao pulo do gato na aba <strong>Scripts</strong>. A ideia aqui é toda vez que um  PPPoE conectar ou desconectar ele execute um script. Vai ser necessário que você altere o TOKEN que você configurou lá no <strong>config.php</strong>, informe a URL (URLUP) correta que encontrará seu arquivo log6.php e em <strong>checkconnection</strong> informe o IP do seu servidor (explico o motivo a seguir).</p>
<pre class="remontti-code">:global TOKEN &quot;xxxxxxxxxxxxxxxx&quot;;
:global URLUP &quot;http://logs6.remontti.com.br/log6.php&quot;;
:global checkconnection &quot;200.200.200.200&quot;;</pre>
<p>A lógica é: Antes de tentar enviar as informações/valores (via post ao log6.php) fazer uma verificação se a conexão exite com o servidor de log, isso foi necessário ao simular uma "queda de energia", as vezes ele pode autenticar antes de conseguir uma conexão (se seu o usuários estiver no routerOS e ai perdemos todos os logs) nesse caso ele fica aguardando por até 5 min na tentativa (ping ao ip checkconnection) antes prosseguir, caso exista uma conexão (checkconnection) então prossegue com o script coletando as informações. </p>
<p>Eu aproveitei coletar IPv4 como <strong>localAddr</strong> (NAS), <strong>remoteAddr</strong> (IPv4 entregue ao cliente) isso vai facilitar também em uma analise se você quiser bater com os dados do freeradius (radacct), já aproveitei também para capturar o <strong>callerId</strong> (MAC), serviço PPP <strong>calledId</strong>. Acredito que com essas informações podem ser uteis para outros fins. Seguindo o script todo o PPPoE que subir ele vai criar um prefixo (WAN) <strong>RemoteIPv6</strong> e em seguida precisei fazer um while que setei 60 seg para que a cada segundo ele tente identificar em <strong>/ipv6 dhcp-server binding</strong> se o cliente solicitou o prefixo que ele vai auto se configurar em sua LAN, passando por esses requisitos ele irai gerar um LOG (<a href="https://blog.remontti.com.br/2674" rel="noopener noreferrer" target="_blank">que você também pode estar salvando em um servidor de log remoto</a>) e finalizando fará um fetch com os dados do binding caso ele consiga ou enviará null para a URL e assim o servidor salva-lo no banco de dados. Você verá dois logs na tela de logs, um azul quando uma conexão subir e um vermelho quando desconectar, se você desejar não ter esses logs é só remover as linha "<em>log warning message=..... / :log error message=.....</em>"</p>
<p>Acesse PPP vá até a aba profile e configure os script do profile. Não esqueça de alterar as variáveis globais.<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_ipv6_mikrotik_script.png" data-rel="lightbox-gallery-D14eXyB7" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_ipv6_mikrotik_script-300x171.png" alt="" width="300" height="171" class="alignnone size-medium wp-image-3935" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_ipv6_mikrotik_script-300x171.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_ipv6_mikrotik_script-768x439.png 768w, https://blog.remontti.com.br/wp-content/uploads/2020/01/profile_ipv6_mikrotik_script.png 814w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><br />
<strong>On UP</strong></p>
<pre class="remontti-code">{
  :global TOKEN &quot;xxxxxxxxxxxxxxxx&quot;;
  :global URLUP &quot;http://________________/logs6/log6.php&quot;;
  :global checkconnection &quot;200.200.200.200&quot;;
  :local ii 0;
  :local tt 300; # Aguarda até 5min para tentar 
  while ( $ii &lt; $tt &#038;&#038; ([/ping $checkconnection count=1]=0) ) do={
    :put $ii
    :set $ii ($ii + 1)
    :delay delay-time=1s
    :log error &quot;Awaiting connection ... $checkconnection&quot;;
  }
  :local localAddr $&quot;local-address&quot;
  :local remoteAddr $&quot;remote-address&quot;
  :local callerId $&quot;caller-id&quot;
  :local calledId $&quot;called-id&quot;
  :local interfaceName [/interface get $interface name]
  :local RemoteIPv6 [/ipv6 nd prefix get value-name=prefix [find interface=$interfaceName]]
  :local i 0;
  :local x 1;  
  :local t 60; # Segundos aguardando ipv6 ser configurado no cliente
  while ($i &lt; $t &#038;&#038; [ :len [/ipv6 dhcp-server binding find server=$interfaceName] ] &lt; $x) do={
    :put $i
    :set $i ($i + 1)
    :delay delay-time=1s
  }
  if ($i = $t) do={
    :log warning message=&quot;UP: $user | $callerId | $calledId | $remoteAddr | $localAddr | $RemoteIPv6 | NULL&quot;
    /tool fetch url=&quot;$URLUP&quot; http-data=&quot;action=i&#038;token=$TOKEN&#038;user=$user&#038;mac=$callerId&#038;nas=$localAddr&#038;service=$calledId&#038;ipv4=$remoteAddr&#038;remoteipv6=$RemoteIPv6&quot; http-method=post
  } else={
    :local DHCPv6PD [/ipv6 dhcp-server binding get value-name=address [find server=$interfaceName]]
    :log warning message=&quot;UP: $user | $callerId | $calledId | $remoteAddr | $localAddr | $RemoteIPv6 | $DHCPv6PD&quot;
    /tool fetch url=&quot;$URLUP&quot; http-data=&quot;action=i&#038;token=$TOKEN&#038;user=$user&#038;mac=$callerId&#038;nas=$localAddr&#038;service=$calledId&#038;ipv4=$remoteAddr&#038;remoteipv6=$RemoteIPv6&#038;dhcpv6pd=$DHCPv6PD&quot; http-method=post
  }
  file remove log6.php
}</pre>
<p>E ao desconectar vamos enviar ao servidor que o mesmo descontou.<br />
<strong>On Down</strong></p>
<pre class="remontti-code">{
  :global TOKEN &quot;xxxxxxxxxxxxxxxx&quot;
  :global URLDOWN &quot;http://________________/logs6/log6.php&quot;
  :local localAddr $&quot;local-address&quot;
  :local callerId $&quot;caller-id&quot;
  /tool fetch url=&quot;$URLDOWN&quot; http-data=&quot;action=u&amp;token=$TOKEN&amp;user=$user&amp;mac=$callerId&amp;nas=$localAddr&quot; http-method=post
  :log warning message=&quot;DOWN: $user | $callerId | $localAddr&quot;
  file remove log6.php
}</pre>
<p>Para concluir em IPv6 -> ND<br />
<img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/01/ipv6_nd.png" alt="" width="668" height="472" class="alignnone size-full wp-image-3957" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/ipv6_nd.png 668w, https://blog.remontti.com.br/wp-content/uploads/2020/01/ipv6_nd-300x212.png 300w" sizes="auto, (max-width: 668px) 100vw, 668px" /><br />
Marque todas as opções.</p>
<p>No menu <strong>IP -> DNS </strong>também informe os DNS IPv6. Só assim o cliente irá aprender um DNSv6 (<em>Advertise DNS</em>)</p>
<p>Agora todo PPPoE que autenticar um log será registrado, o legal aqui é que se alguém não utiliza Radius poderá também ter um log <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>No arquivo log6.php que recebe os logs sempre que um usuário conectar ele irá verificar se não existe uma conexão em aberta, pois em casos de quedas de energia não vai existir tempo para ele informar que o pppoe desconectou, então ele fecha a conexão com a hora da nova conexão, logo esse IP pode ter sido utilizado por algum outro usuário, neste caso ele registra a hora que fechou a conexão com "falha" (<strong>failure</strong>), para no caso de uma investigação você observar se o mesmo ip não teve algum outro usuário que usou na horário solicitado.<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/01/logs_ipv6_remontti.png" data-rel="lightbox-gallery-D14eXyB7" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/01/logs_ipv6_remontti.png" alt="" width="1661" height="398" class="alignnone size-full wp-image-3946" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/logs_ipv6_remontti.png 1661w, https://blog.remontti.com.br/wp-content/uploads/2020/01/logs_ipv6_remontti-300x72.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/01/logs_ipv6_remontti-1024x245.png 1024w, https://blog.remontti.com.br/wp-content/uploads/2020/01/logs_ipv6_remontti-768x184.png 768w, https://blog.remontti.com.br/wp-content/uploads/2020/01/logs_ipv6_remontti-1536x368.png 1536w" sizes="auto, (max-width: 1661px) 100vw, 1661px" /></a></p>
<p>Pelo phpMyAdmin também fica muito fácil de fazer buscas.<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/01/phpmyadmin_log_ipv6.png" data-rel="lightbox-gallery-D14eXyB7" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/01/phpmyadmin_log_ipv6-300x178.png" alt="" width="300" height="178" class="alignnone size-medium wp-image-3959" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/phpmyadmin_log_ipv6-300x178.png 300w, https://blog.remontti.com.br/wp-content/uploads/2020/01/phpmyadmin_log_ipv6-1024x607.png 1024w, https://blog.remontti.com.br/wp-content/uploads/2020/01/phpmyadmin_log_ipv6-768x455.png 768w, https://blog.remontti.com.br/wp-content/uploads/2020/01/phpmyadmin_log_ipv6.png 1408w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Para quem deseja bloquear um cliente IPv6, uma solução é no Router criar outra Pool6 com uma classe "invalida" por exemplo 2001:db8:6666::/48, e no freeradius usar o attibute <strong>Mikrotik-Delegated-IPv6-Pool</strong>, pode ser na tabela radreply (dizendo para qual usuário) ou para um  grupo de configurações (radgroupreply) "plano".</p>
<p>Mikrotik:<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2020/01/drop_ipv6.png" data-rel="lightbox-gallery-D14eXyB7" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2020/01/drop_ipv6.png" alt="" width="544" height="292" class="alignnone size-full wp-image-3963" srcset="https://blog.remontti.com.br/wp-content/uploads/2020/01/drop_ipv6.png 544w, https://blog.remontti.com.br/wp-content/uploads/2020/01/drop_ipv6-300x161.png 300w" sizes="auto, (max-width: 544px) 100vw, 544px" /></a></p>
<p>Freeradius<br />
Ex.: <strong>radreply </strong></p>
<pre class="remontti-code">INSERT INTO `radreply` (`username`, `attribute`, `op`, `value`) VALUES
(&#039;nome_user&#039;, &#039;Mikrotik-Delegated-IPv6-Pool&#039;, &#039;=&#039;, &#039;ipv6_drop&#039;);</pre>
<p>Ex.: <strong>radgroupreply</strong></p>
<pre class="remontti-code">INSERT INTO `radgroupreply` (`groupname`, `attribute`, `op`, `value`) VALUES
(&#039;PLANO_BLOQUEADO&#039;, &#039;Mikrotik-Delegated-IPv6-Pool&#039;, &#039;=&#039;, &#039;ipv6_drop&#039;);</pre>
<p>Desta forma o routerOS interpretará o nome da pool pelo atriburo Mikrotik-Delegated-IPv6-Pool, e assim que o cliente logar ele não pegará do bloco válido. <em>Até poderia usar uma válido e bloquear no firewall (mas isso é coisa de sistema amador #ficadica).</em>  </p>
<p>Se seu freradius é antigo (v2.x) precisará ter o <a href="https://wiki.mikrotik.com/wiki/Manual:RADIUS_Client/vendor_dictionary" rel="noopener noreferrer" target="_blank">dictionary</a> atualizado.</p>
<p>Vou deixar um exemplo de como configurar um pppoe cliente em um mikrotik, já que percebi um bug quando ele precisa renovar seu IPv6.</p>
<pre class="remontti-code">/interface pppoe-client
add add-default-route=yes disabled=no interface=ether1 name=pppoe-out1 password=SENHA use-peer-dns=yes user=SENHA

/ipv6 dhcp-client
add interface=pppoe-out1 pool-name=DHCPv6PD pool-prefix-length=56 request=prefix

/ipv6 address
add advertise=yes from-pool=DHCPv6PD interface=INTERFACE_LAN

/ppp profile
set *0 on-up=&quot;{\r\
    \n  /delay delay-time=5s\r\
    \n  /ipv6 dhcp-client renew numbers=0\r\
    \n  /delay delay-time=2s\r\
    \n  /ipv6 dhcp-client renew numbers=0\r\
    \n}&quot;
/ipv6 firewall mangle
add action=change-mss chain=forward new-mss=clamp-to-pmtu passthrough=yes \
    protocol=tcp tcp-flags=syn
</pre>
<p>Gambiarazinha no profile para renovar o IP sem dor de cabeça toda vez que ele autenticar (bugs)</p>
<pre class="remontti-code">{
  /delay delay-time=5s
  /ipv6 dhcp-client renew numbers=0
  /delay delay-time=2s
  /ipv6 dhcp-client renew numbers=0
}</pre>
<p>Gostou? Espero que você consiga implementar seu IPv6 e esteja seguro com os logs armazenado! </p>
<p>Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!<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>Abraço!</p>
<h3> RouterOS v7</h3>
<p>Descomente os <strong># :log warning "DEBUG>...."</strong> se precisar debugar o script, ou remova para deixar mais enxuto o script.</p>
<p><strong>UP</strong></p>
<pre class="remontti-code-blue">
{
  # :log warning &quot;DEBUG&gt; UP: Iniciando o script logs6&quot;;
  :global TOKEN &quot;xxxxxxxxxxxxxxxx&quot;;
  :global URLUP &quot;http://logs6.remontti.com.br/log6.php&quot;;
  :global checkconnection &quot;10.0.0.1&quot;;
  :local ii 0;
  :local tt 60;
  while ( $ii &lt; $tt &#038;&#038; ([/ping $checkconnection count=1]=0) ) do={
    :put $ii
    :set $ii ($ii + 1)
    :delay delay-time=1s
    :log error &quot;Aguardando conexao com servidor... $checkconnection&quot;;
  }
  :local localAddr $&quot;local-address&quot;
  # :log warning &quot;DEBUG&gt; localAddr = $localAddr&quot;;
  :local remoteAddr $&quot;remote-address&quot;
  # :log warning &quot;DEBUG&gt; remoteAddr = $remoteAddr&quot;;
  :local callerId $&quot;caller-id&quot;
  # :log warning &quot;DEBUG&gt; callerId = $callerId&quot;;
  :local calledId $&quot;called-id&quot;
  # :log warning &quot;DEBUG&gt; calledId = $calledId&quot;;
  :local userName $&quot;user&quot;
  # :log warning &quot;DEBUG&gt; userName = $userName&quot;;
  :local interfaceID $&quot;interface&quot;
  # :log warning &quot;DEBUG&gt; interfaceID = $interfaceID&quot;;
  :local interfaceName [/interface get $interfaceID name]  
  # :log warning &quot;DEBUG&gt; interfaceName = $interfaceName&quot;;
  :local RemoteIPv6 [/ipv6 nd prefix get value-name=prefix [find interface=$interfaceName]]
  # :log warning &quot;DEBUG&gt; RemoteIPv6 = $RemoteIPv6&quot;;
  :local i 0;
  :local x 1;  
  :local t 60;
  while ($i &lt; $t &#038;&#038; [ :len [/ipv6 dhcp-server binding find server=$interfaceName] ] &lt; $x) do={    
    :put $i    
    :set $i ($i + 1)
    :delay delay-time=1s
    # :log warning &quot;DEBUG&gt; Aguardando IPv6 da LAN de $userName ($i)s&quot;;
  }
  :local file [/file find name=&quot;log6.php&quot;]
  :if ([:len $file] &gt; 0) do={
      /file remove log6.php
  }  
  if ($i = $t) do={
    # :log warning &quot;DEBUG&gt; IPv6 LAN: não descoberto descoberto&quot;;
    :log warning message=&quot;UP: $user | $callerId | $calledId | $remoteAddr | $localAddr | $RemoteIPv6 | NULL&quot;
    # :log warning &quot;DEBUG&gt; Executando fetch UP: $URLUP http-data=action=i&amp;token=$TOKEN&amp;user=$user&amp;mac=$callerId&amp;nas=$localAddr&amp;service=$calledId&amp;ipv4=$remoteAddr&amp;remoteipv6=$RemoteIPv6 http-method=post&quot;
    /tool/fetch url=&quot;$URLUP&quot; http-data=&quot;action=i&amp;token=$TOKEN&amp;user=$user&amp;mac=$callerId&amp;nas=$localAddr&amp;service=$calledId&amp;ipv4=$remoteAddr&amp;remoteipv6=$RemoteIPv6&quot; http-method=post
  } else={    
    :local DHCPv6PD [/ipv6 dhcp-server binding get value-name=address [find server=$interfaceName]]
    # :log warning &quot;DEBUG&gt; IPv6 LAN: Descoberto descoberto $DHCPv6PD&quot;;
    :log warning message=&quot;UP: $user | $callerId | $calledId | $remoteAddr | $localAddr | $RemoteIPv6 | $DHCPv6PD&quot;
    # :log warning &quot;DEBUG&gt; Executando fetch UP: $URLUP http-data=action=i&amp;token=$TOKEN&amp;user=$user&amp;mac=$callerId&amp;nas=$localAddr&amp;service=$calledId&amp;ipv4=$remoteAddr&amp;remoteipv6=$RemoteIPv6&amp;dhcpv6pd=$DHCPv6PD http-method=post&quot;;
    /tool/fetch url=&quot;$URLUP&quot; http-data=&quot;action=i&amp;token=$TOKEN&amp;user=$user&amp;mac=$callerId&amp;nas=$localAddr&amp;service=$calledId&amp;ipv4=$remoteAddr&amp;remoteipv6=$RemoteIPv6&amp;dhcpv6pd=$DHCPv6PD&quot; http-method=post
  }
  :delay delay-time=1s
  # :log warning &quot;DEBUG&gt; Removendo arquivo log6.php&quot;;
  :local file [/file find name=&quot;log6.php&quot;]
  :if ([:len $file] &gt; 0) do={
      /file remove log6.php
  }
  # :log warning &quot;DEBUG&gt; Script concluído.&quot;
}
</pre>
<p><strong>DOWN</strong></p>
<pre class="remontti-code-blue">
{
  # :log warning &quot;DEBUG&gt; DOWN: Iniciando o script logs6&quot;;
  :global TOKEN &quot;xxxxxxxxxxxxxxxx&quot;
  :global URLDOWN &quot;http://logs6.remontti.com.br/log6.php&quot;
  :local localAddr $&quot;local-address&quot;
  # :log warning &quot;DEBUG&gt; localAddr = $localAddr&quot;;
  :local callerId $&quot;caller-id&quot;
  # :log warning &quot;DEBUG&gt; calledId = $calledId&quot;;
  :local file [/file find name=&quot;log6.php&quot;]
  :if ([:len $file] &gt; 0) do={
      /file remove log6.php
  }  
  # :log warning &quot;DEBUG&gt; Executando fetch DOWN: $URLDOWN http-data=action=u&amp;token=$TOKEN&amp;user=$user&amp;mac=$callerId&amp;nas=$localAddr http-method=post&quot;;
  /tool/fetch url=&quot;$URLDOWN&quot; http-data=&quot;action=u&amp;token=$TOKEN&amp;user=$user&amp;mac=$callerId&amp;nas=$localAddr&quot; http-method=post
  :log warning message=&quot;DOWN: $user | $callerId | $localAddr&quot;
  :delay delay-time=1s
  # :log warning &quot;DEBUG&gt; Removendo arquivo log6.php&quot;;
  :local file [/file find name=&quot;log6.php&quot;]
  :if ([:len $file] &gt; 0) do={
      /file remove $file
  }
  # :log warning &quot;DEBUG&gt; Script concluído.&quot;
}
</pre>
<p>O post <a href="https://blog.remontti.com.br/3931">Como entregar IPv6+IPv4 no Mikrotik/RouterOS através de PPPoE/DHCPv6 PD e registrando os logs em um banco de dados</a> apareceu primeiro em <a href="https://blog.remontti.com.br">Remontti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.remontti.com.br/3931/feed</wfw:commentRss>
			<slash:comments>42</slash:comments>
		
		
			</item>
		<item>
		<title>Como instalar o Accel-PPP no Debian 10 Buster</title>
		<link>https://blog.remontti.com.br/3494</link>
					<comments>https://blog.remontti.com.br/3494#comments</comments>
		
		<dc:creator><![CDATA[Rudimar Remontti]]></dc:creator>
		<pubDate>Tue, 16 Jul 2019 01:59:15 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[accel]]></category>
		<category><![CDATA[accel-ppp]]></category>
		<category><![CDATA[compilar]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[debian 10]]></category>
		<category><![CDATA[debian buster]]></category>
		<category><![CDATA[pppoe]]></category>
		<guid isPermaLink="false">https://blog.remontti.com.br/?p=3494</guid>

					<description><![CDATA[<p>Este tutorial é praticamente uma tradução da documentação oficial, com alguns detalhes a mais. A principal ideia deste tutorial é ser requisito de próximos tutorias que pretendo fazer ensinado como subir um PPPoE Server&#46;&#46;&#46;</p>
<p>O post <a href="https://blog.remontti.com.br/3494">Como instalar o Accel-PPP no Debian 10 Buster</a> apareceu primeiro em <a href="https://blog.remontti.com.br">Remontti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Este tutorial é praticamente uma tradução da <a href="https://accel-ppp.org/wiki/doku.php?id=compilation_debian" rel="noopener noreferrer" target="_blank">documentação oficial</a>, com alguns detalhes a mais.</p>
<p><em>A principal ideia deste tutorial é ser requisito de próximos tutorias que pretendo fazer ensinado como subir um PPPoE Server com accel + Quagga iBGP para trocar a tabela de rotas.</em> </p>
<p>O projeto ACCEL-PPP de código aberto tem como objetivo montar em um único servidor vários serviços VPN &#8220;all-in-one&#8221; com uma ótima performance. </p>
<h3>Suas características:</h3>
<p>Arquitetura modular extensível<br />
&#8211; Multi-threaded de alto desempenho.<br />
&#8211; PPTP, PPPoE, L2TPv2, SSTP e IPoE (DHCPv4)<br />
&#8211; Autenticação Radius.<br />
&#8211; Autenticações suportadas: PAP, CHAP (md5), extensões do Microsoft CHAP (incluindo versão 2), sem suporte &#8211; EAP<br />
MPPE suportado.<br />
&#8211; Suporte para IPv6 incluindo o Neighborin Discovery e o DHCPv6 integrados.<br />
&#8211; Controle de banda.<br />
-Entre outros.</p>
<h3>INSTALAÇÃO</h3>
<p>Distribuição linux: <a href="https://blog.remontti.com.br/2966" rel="noopener noreferrer" target="_blank">Debian 10 Buster &#8211; Instalação de forma limpa</a></p>
<p>Instale os pacotes necessários para a compilação do accel-ppp:</p>
<pre class="remontti-code"># apt install git libsnmp-dev build-essential cmake gcc linux-headers-`uname -r` git libpcre3-dev libssl-dev liblua5.1-0-dev</pre>
<p>Criaremos as pastas accel e build em /usr/local/src. A pasta <strong>accel</strong> onde vamos baixar o projeto através do github e dentro dela vamos criar a <strong>build</strong> onde vamos preparar os arquivos para serem compilados.</p>
<pre class="remontti-code"># mkdir -p /usr/local/src/accel/build
# cd /usr/local/src/accel
# git clone https://github.com/xebd/accel-ppp.git
# cd /usr/local/src/accel/build</pre>
<p>Você pode personalizar o projeto para ativar ou desativar alguns recursos. <a href="https://accel-ppp.org/wiki/doku.php?id=compilation" rel="noopener noreferrer" target="_blank">(*)</a> Vamos utilizar os principais, como radius, ipoe, vlanmon Todas essas opções são opcionais.</p>
<pre class="remontti-code"># cmake \
-DCPACK_TYPE=Debian10 \
-DBUILD_IPOE_DRIVER=TRUE \
-DBUILD_VLAN_MON_DRIVER=TRUE \
-DRADIUS=TRUE \
-DNETSNMP=TRUE \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_INSTALL_PREFIX=/usr \
-DKDIR=/usr/src/linux-headers-$(uname -r) \
../accel-ppp</pre>
<p>Vamos a compilação</p>
<pre class="remontti-code"># make</pre>
<p><a href="https://blog.remontti.com.br/wp-content/uploads/2019/08/accel-make.png" data-rel="lightbox-gallery-tY95GDKZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2019/08/accel-make-300x154.png" alt="" width="300" height="154" class="alignnone size-medium wp-image-3502" srcset="https://blog.remontti.com.br/wp-content/uploads/2019/08/accel-make-300x154.png 300w, https://blog.remontti.com.br/wp-content/uploads/2019/08/accel-make-768x394.png 768w, https://blog.remontti.com.br/wp-content/uploads/2019/08/accel-make-1024x526.png 1024w, https://blog.remontti.com.br/wp-content/uploads/2019/08/accel-make.png 1587w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Copie os módulos do kernel ipoe e vlan_mon e após carregue os mesmo</p>
<pre class="remontti-code"># cp drivers/ipoe/driver/ipoe.ko /lib/modules/$(uname -r)
# cp drivers/vlan_mon/driver/vlan_mon.ko /lib/modules/$(uname -r)
# depmod -a
# modprobe  vlan_mon
# modprobe  ipoe</pre>
<p>Vamos adicionar os módulos para iniciar durante o boot. </p>
<pre class="remontti-code"># echo &quot;vlan_mon&quot; &gt;&gt; /etc/modules
# echo &quot;ipoe&quot; &gt;&gt; /etc/modules</pre>
<p>Agora vamos criar nosso pacote .DEB e instalá-lo</p>
<pre class="remontti-code"># cpack -G DEB
# apt install ./accel-ppp.deb</pre>
<p>Bingo!!! <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;" /> Seu a accel-ppp foi instalado!</p>
<p>Habilitamos o serviço accel-ppp para iniciar com o sistema</p>
<pre class="remontti-code"># systemctl enable accel-ppp</pre>
<p>Um arquivo de modelo do accel-ppp vem como exemplo em /etc/accel-ppp.conf.dist, faça uma copia para /etc/accel-ppp.conf para que o accel comece a interpreta-lo.</p>
<pre class="remontti-code"># cp /etc/accel-ppp.conf.dist  /etc/accel-ppp.conf</pre>
<p>Agora edite o a arquivo de configuração /etc/accel-ppp.conf de acordo com suas necessidades.</p>
<p>Lembre-se de restartar o serviço após alteração no arquivo de configuração.</p>
<pre class="remontti-code"># systemctl restart accel-ppp
# systemctl status accel-ppp</pre>
<p><a href="https://blog.remontti.com.br/wp-content/uploads/2019/08/accel-ppp-status-1.png" data-rel="lightbox-gallery-tY95GDKZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2019/08/accel-ppp-status-1-300x54.png" alt="" width="300" height="54" class="alignnone size-medium wp-image-3507" srcset="https://blog.remontti.com.br/wp-content/uploads/2019/08/accel-ppp-status-1-300x54.png 300w, https://blog.remontti.com.br/wp-content/uploads/2019/08/accel-ppp-status-1-768x139.png 768w, https://blog.remontti.com.br/wp-content/uploads/2019/08/accel-ppp-status-1-1024x186.png 1024w, https://blog.remontti.com.br/wp-content/uploads/2019/08/accel-ppp-status-1.png 1318w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Grupo do telegram: <a href="https://t.me/braccelppp" rel="noopener noreferrer" target="_blank">https://t.me/braccelppp</a></p>
<p>Gostou? Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!<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>Abraço!</p>
<p>Fonte: <a href="https://accel-ppp.org/wiki/doku.php?id=compilation_debian" rel="noopener noreferrer" target="_blank">https://accel-ppp.org/wiki/doku.php?id=compilation_debian</a></p>
<p>O post <a href="https://blog.remontti.com.br/3494">Como instalar o Accel-PPP no Debian 10 Buster</a> apareceu primeiro em <a href="https://blog.remontti.com.br">Remontti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.remontti.com.br/3494/feed</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
		<item>
		<title>Instalando Accel-PPP (PPTP/L2TP/SSTP/PPPoE/IPoE) no Debian 9</title>
		<link>https://blog.remontti.com.br/2538</link>
					<comments>https://blog.remontti.com.br/2538#comments</comments>
		
		<dc:creator><![CDATA[Rudimar Remontti]]></dc:creator>
		<pubDate>Wed, 16 May 2018 01:50:33 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[accel-ppp]]></category>
		<category><![CDATA[ipeo]]></category>
		<category><![CDATA[ipv6]]></category>
		<category><![CDATA[l2tp]]></category>
		<category><![CDATA[pppoe]]></category>
		<category><![CDATA[pptp]]></category>
		<category><![CDATA[radius]]></category>
		<category><![CDATA[vlanmon]]></category>
		<guid isPermaLink="false">https://blog.remontti.com.br/?p=2538</guid>

					<description><![CDATA[<p>O projeto ACCEL-PPP de código aberto tem como objetivo montar em um único servidor vários serviços VPN &#8220;all-in-one&#8221; com uma ótima performance. Suas características: Arquitetura modular extensível &#8211; Multi-threaded de alto desempenho. &#8211; PPTP,&#46;&#46;&#46;</p>
<p>O post <a href="https://blog.remontti.com.br/2538">Instalando Accel-PPP (PPTP/L2TP/SSTP/PPPoE/IPoE) no Debian 9</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/2018/05/accel-ppp-remontti.com_.br_.jpg" alt="" width="850" height="381" class="aligncenter size-full wp-image-2547" srcset="https://blog.remontti.com.br/wp-content/uploads/2018/05/accel-ppp-remontti.com_.br_.jpg 850w, https://blog.remontti.com.br/wp-content/uploads/2018/05/accel-ppp-remontti.com_.br_-300x134.jpg 300w, https://blog.remontti.com.br/wp-content/uploads/2018/05/accel-ppp-remontti.com_.br_-768x344.jpg 768w" sizes="auto, (max-width: 850px) 100vw, 850px" /><br />
O projeto ACCEL-PPP de código aberto tem como objetivo montar em um único servidor vários serviços VPN &#8220;all-in-one&#8221; com uma ótima performance. </p>
<p>Suas características:<br />
Arquitetura modular extensível<br />
&#8211; Multi-threaded de alto desempenho.<br />
&#8211; PPTP, PPPoE, L2TPv2, SSTP e IPoE (DHCPv4)<br />
&#8211; Autenticação Radius.<br />
&#8211; Tipos de autenticação suportados: PAP, CHAP (md5), extensões do Microsoft CHAP (incluindo versão 2), sem suporte &#8211; EAP<br />
MPPE suportado.<br />
&#8211; Suporte para IPv6 incluindo o Neighborin Discovery e o DHCPv6 integrados.<br />
&#8211; Controle de banda.<br />
-Entre outros.</p>
<p><strong>INSTALAÇÃO</strong><br />
Distribuição linux: Debian 9 (<a href="https://blog.remontti.com.br/1152" rel="noopener noreferrer" target="_blank">Instalação de forma limpa</a>)<br />
<a href="https://blog.remontti.com.br/3494" rel="noopener noreferrer" target="_blank"><strong>Para o Debian 10 use o tutorial mais recente</strong></a></p>
<p>Instale os pacotes necessários para a compilação do accel-ppp.</p>
<pre class="remontti-code"># apt install git build-essential cmake libsnmp-dev linux-headers-amd64 libpcre3-dev libssl-dev liblua5.1-0-dev</pre>
<p>Vamos duas pastas em em /usr/local/src/: A pasta <strong>accel</strong> onde vamos baixar o projeto através do github e dentro dela vamos criar a <strong>build</strong> onde vamos preparar os arquivos para serem compilados.</p>
<pre class="remontti-code"># mkdir -p /usr/local/src/accel/build
# cd /usr/local/src/accel
# git clone https://github.com/xebd/accel-ppp.git
# cd /usr/local/src/accel/build</pre>
<p>Você pode personalizar o projeto para ativar ou desativar alguns recursos. <a href="https://accel-ppp.org/wiki/doku.php?id=compilation" rel="noopener noreferrer" target="_blank">(*)</a> Vamos utilizar os principais, como radius, ipoe, vlanmon Todas essas opções são opcionais.</p>
<pre class="remontti-code"># cmake \
-DCPACK_TYPE=Debian9 \
-DBUILD_IPOE_DRIVER=TRUE \
-DBUILD_VLAN_MON_DRIVER=TRUE \
-DRADIUS=TRUE \
-DNETSNMP=TRUE \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_INSTALL_PREFIX=/usr \
-DKDIR=/usr/src/linux-headers-$(uname -r) \
../accel-ppp</pre>
<p>Vamos a compilação</p>
<pre class="remontti-code"># make</pre>
<p>Copie os módulos do kernel ipoe e vlan_mon e após carregue os mesmo</p>
<pre class="remontti-code"># cp drivers/ipoe/driver/ipoe.ko /lib/modules/$(uname -r)
# cp drivers/vlan_mon/driver/vlan_mon.ko /lib/modules/$(uname -r)
# depmod -a
# modprobe  vlan_mon
# modprobe  ipoe</pre>
<p>Vamos adicionar os módulos para iniciar durante o boot. </p>
<pre class="remontti-code"># echo &quot;vlan_mon&quot; &gt;&gt; /etc/modules
# echo &quot;ipoe&quot; &gt;&gt; /etc/modules</pre>
<p>Agora vamos criar nosso pacote .DEB e instalá-lo</p>
<pre class="remontti-code"># cpack -G DEB
# apt install ./accel-ppp.deb</pre>
<p>Bingo!!! <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;" /> Seu a accel-ppp foi instalado!</p>
<p>Habilitamos o serviço accel-ppp para iniciar com o sistema</p>
<pre class="remontti-code"># systemctl enable accel-ppp</pre>
<p>Um arquivo de modelo do accel-ppp vem como exemplo em /etc/accel-ppp.conf.dist, faça uma copia para /etc/accel-ppp.conf</p>
<pre class="remontti-code"># cp /etc/accel-ppp.conf.dist  /etc/accel-ppp.conf</pre>
<p>Agora edite o a arquivo de configuração /etc/accel-ppp.conf de acordo com suas necessidades.</p>
<p>Lembre-se de restartar o serviço após alteração no arquivo de configuração.</p>
<pre class="remontti-code">/etc/init.d/accel-ppp restart</pre>
<hr />
<p>Criei um script de auto instalação <a href="https://blog.remontti.com.br/scripts/accel-ppp-auto-install-debian9.sh" rel="noopener noreferrer" target="_blank"><strong>accel-ppp-auto-install-debian9.sh</strong></a><br />
Para usar siga os passos abaixo:</p>
<pre class="remontti-code"># wget https://blog.remontti.com.br/scripts/accel-ppp-auto-install-debian9.sh 
# chmod +x accel-ppp-auto-install-debian9.sh
# sh accel-ppp-auto-install-debian9.sh</pre>
<p>Grupo do telegram: <a href="https://t.me/braccelppp" rel="noopener noreferrer" target="_blank">https://t.me/braccelppp</a></p>
<p>FONTE: <a href="https://accel-ppp.org/" rel="noopener noreferrer" target="_blank">https://accel-ppp.org/</a></p>
<p>O post <a href="https://blog.remontti.com.br/2538">Instalando Accel-PPP (PPTP/L2TP/SSTP/PPPoE/IPoE) no Debian 9</a> apareceu primeiro em <a href="https://blog.remontti.com.br">Remontti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.remontti.com.br/2538/feed</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>Instalando FreeRadius 3.0.X com integração MySQL ou MariaDB no Debian 9 Stretch</title>
		<link>https://blog.remontti.com.br/2066</link>
					<comments>https://blog.remontti.com.br/2066#comments</comments>
		
		<dc:creator><![CDATA[Rudimar Remontti]]></dc:creator>
		<pubDate>Mon, 03 Jul 2017 14:32:32 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[pppoe]]></category>
		<category><![CDATA[provedor]]></category>
		<category><![CDATA[Stretch]]></category>
		<category><![CDATA[ubiquiti]]></category>
		<category><![CDATA[ubnt]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">http://blog.remontti.com.br/?p=2066</guid>

					<description><![CDATA[<p>Neste tutorial vamos configurar o FreeRadius 3 em nosso servidor Debina 9, com integração dos usuários/atributos de configurações em uma base de dados MySQL/MariaDB com o módulo SQL, e ainda o módulos SQLIPPOOL para&#46;&#46;&#46;</p>
<p>O post <a href="https://blog.remontti.com.br/2066">Instalando FreeRadius 3.0.X com integração MySQL ou MariaDB no Debian 9 Stretch</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/2017/07/freeradius-3.0-debian9.jpg" alt="" width="900" height="428" class="alignnone size-full wp-image-2091" srcset="https://blog.remontti.com.br/wp-content/uploads/2017/07/freeradius-3.0-debian9.jpg 900w, https://blog.remontti.com.br/wp-content/uploads/2017/07/freeradius-3.0-debian9-300x143.jpg 300w, https://blog.remontti.com.br/wp-content/uploads/2017/07/freeradius-3.0-debian9-768x365.jpg 768w" sizes="auto, (max-width: 900px) 100vw, 900px" /></p>
<p>Neste tutorial vamos configurar o FreeRadius 3 em nosso servidor Debina 9, com integração dos usuários/atributos de configurações em uma base de dados MySQL/MariaDB com o módulo SQL, e ainda o módulos SQLIPPOOL para armazenar nossa pool de IPs na base de dados.<br />
Esse tutorial é ideal para provedores fazerem autenticação PPPoE, autenticação Wireless PSK e EAP. </p>
<p>Se você gostou do tutorial ou tem dúvidas deixe seu comentário. Se precisar de alguma ajuda ou trocar uma ideia pode me chamar lá no Telegram @remontti</p>
<p>REQUISITOS<br />
1 – Debian 9 Stretch recomendo uma <a href="https://blog.remontti.com.br/1152" target="_blank" rel="noopener noreferrer">instalação limpa do Debian</a><br />
2 – Servidor Atualizado:</p>
<pre class="remontti-code"># apt update</pre>
<p>Mãos à obra!<br />
Primeiramente escolha qual banco de dados você irá instalar:<br />
<strong>MySQL ou MariaDB? </strong><br />
Com o lançamento do Debian 9 ao solicitar a instalação do mysql-server, você irá se deparar com a instalação do MariaDB automaticamente.<br />
MariaDB é um banco de dados que surgiu como fork do MySQL, criado pelo próprio fundador do projeto após sua aquisição pela Oracle. Para saber mais acesse <a href="https://pt.wikipedia.org/wiki/MariaDB" target="_blank" rel="noopener noreferrer">https://pt.wikipedia.org/wiki/MariaDB</a></p>
<p><strong>Para MySQL</strong><br />
A equipe do MySQL Release Engineering fornece repositórios apt para usar com a maioria do software, incluindo o servidor e muitos de seus utilitários. Para instalação com o Mysql então será necessário adicionar em seus repositórios.</p>
<pre class="remontti-code">
# echo -e &quot;deb http://repo.mysql.com/apt/debian/ stretch mysql-5.7\ndeb-src http://repo.mysql.com/apt/debian/ stretch mysql-5.7&quot; &gt; /etc/apt/sources.list.d/mysql.list
# wget -O /tmp/RPM-GPG-KEY-mysql https://repo.mysql.com/RPM-GPG-KEY-mysql --no-check-certificate
# apt-key add /tmp/RPM-GPG-KEY-mysql
# apt update</pre>
<pre class="remontti-code"># apt install mysql-server</pre>
<p><strong>Para MariaDB</strong><br />
Não será necessário alterar nada em seus repositórios.<br />
<em><font color="blue">Note que na instalação do MariaDB ele não irá pedir senha do usuário root como acontece no mysql, por padrão o mesmo vem sem senha com permissão de logar apenas via shell.</font></em></p>
<pre class="remontti-code"># apt install mariadb-client mariadb-server</pre>
<p>Agora que já temos nosso bando de dados instalado MySQL ou MariaDB, vamos instalar uma servidor web junto com o PHPMyAdmin para facilitar nossa vida. </p>
<pre class="remontti-code"># apt install apache2 libapache2-mod-php7.0 php7.0 phpmyadmin</pre>
<p>Após instalar acesse <strong>http://SEU-IP/phpmyadmin</strong> para ver  se tudo esta ok!<br />
<a href="https://blog.remontti.com.br/wp-content/uploads/2017/06/Screenshot_20170619_150017.png" data-rel="lightbox-gallery-tekjDCX8" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" src="https://blog.remontti.com.br/wp-content/uploads/2017/06/Screenshot_20170619_150017-300x157.png" alt="" width="300" height="157" class="alignnone size-medium wp-image-2036" srcset="https://blog.remontti.com.br/wp-content/uploads/2017/06/Screenshot_20170619_150017-300x157.png 300w, https://blog.remontti.com.br/wp-content/uploads/2017/06/Screenshot_20170619_150017-768x402.png 768w, https://blog.remontti.com.br/wp-content/uploads/2017/06/Screenshot_20170619_150017-1024x536.png 1024w, https://blog.remontti.com.br/wp-content/uploads/2017/06/Screenshot_20170619_150017.png 1680w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p><strong>Instalação do FreeRadius</strong></p>
<pre class="remontti-code"># apt install freeradius freeradius-mysql freeradius-utils</pre>
<p>Crie um banco de dados e usuário e conceda permissões para acessar sua base.</p>
<p>No MariaDB use o comando:</p>
<pre class="remontti-code"># mariadb -u root</pre>
<p>* Vale lembrar que MariaDB seu usuário root vem sem senha, para setar uma senha faça:</p>
<pre class="remontti-code">USE mysql;
UPDATE user SET password=PASSWORD(&#039;SUA-SENHA-USER-ROOT&#039;) WHERE User=&#039;root&#039;;
UPDATE user SET plugin=&quot;mysql_native_password&quot;;
FLUSH PRIVILEGES;
</pre>
<p>Acesse via linha de comando seu banco de dados, e crie uma base chamada de radius e usuário também chamado de radius, para configurarmos nossa aplicação freeradius.</p>
<pre class="remontti-code">
CREATE DATABASE radius;
GRANT ALL PRIVILEGES ON radius.* TO &#039;radius&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;SENHA-DO-USER-RADIUS&#039;;
FLUSH PRIVILEGES;
quit;</pre>
<p>Agora vamos criar nossas tableas</p>
<p>No MariaDB use o comando:</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>No MySQL use o comando:</p>
<pre class="remontti-code"># mysql -u radius -p radius &lt; /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
# mysql -u radius -p radius &lt; /etc/freeradius/3.0/mods-config/sql/ippool/mysql/schema.sql</pre>
<p>Após cada comando será solicitado a senha (SENHA-DO-USER-RADIUS)</p>
<p>Caso deseje logs mais detalhados edite radiusd.conf</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>Vamos habilitar nosso mod SQL, mas antes precisamos fazer algumas alterações no arquivo</p>
<pre class="remontti-code"># cp /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-available/sql.orig
# vim /etc/freeradius/3.0/mods-available/sql</pre>
<p>Altere:</p>
<pre class="remontti-code">
driver = &quot;rlm_sql_null&quot; por driver = &quot;rlm_sql_mysql&quot;
dialect = &quot;sqlite&quot; por dialect = &quot;mysql&quot;
</pre>
<p>Descemente as linhas e altere a senha:</p>
<pre class="remontti-code">server = &quot;localhost&quot;
port = 3306
login = &quot;radius&quot;
password = &quot;SENHA-DO-USER-RADIUS&quot;</pre>
<p>Descomente:<br />
<strong>read_clients = yes</strong></p>
<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 valores e descomentar outros:</p>
<pre class="remontti-code"># cp /etc/freeradius/3.0/sites-available/default  /etc/freeradius/3.0/sites-available/default.org
# vim /etc/freeradius/3.0/sites-enabled/default</pre>
<pre class="remontti-code">
  authorize {
      #digest
      #suffix
      #files
      sql
      #-ldap
  }

  authenticate {
      #digest
  }

  preacct {
      #suffix
      #files
  }

  accounting {
      sql
      #exec
      #attr_filter.accounting_response
  }
  session {
    # Se você deseja usar o atributo Simultaneous-Use, descomente sql e comente radutmp&lt;/em&gt; 
    #radutmp
    sql
  }

  post-auth {
          sql
          #exec

#        Post-Auth-Type REJECT {
#                # log failed authentications in SQL, too.
#                -sql
#                attr_filter.access_reject
#                # Insert EAP-Failure message if the request was
#                # rejected by policy instead of because of an
#                # authentication failure
#                eap
#
#                #  Remove reply message if the response contains an EAP-Message
#                remove_reply_message_if_eap
#        }
</pre>
<p>Faça o mesmo com inner-tunnel</p>
<pre class="remontti-code"># cp /etc/freeradius/3.0/sites-available/inner-tunnel /etc/freeradius/3.0/sites-available/inner-tunnel.org
# vim /etc/freeradius/3.0/sites-enabled/inner-tunnel</pre>
<pre class="remontti-code">
authorize {
    #suffix
    #files
    sql
    #-ldap
}

authenticate {

}

session { 
    # Se você deseja usar o atributo Simultaneous-Use, descomente sql e comente radutmp
    #radutmp
    sql
}
post-auth {
    sql

#  Post-Auth-Type REJECT {
#      # log failed authentications in SQL, too.
#      -sql
#      attr_filter.access_reject
#
#      #
#      #  Let the outer session know which module failed, and why.
#      #
#      update outer.session-state {
#              &amp;Module-Failure-Message := &amp;request:Module-Failure-Message
#      }
#  }

}</pre>
<p><strong>Habilita mod sqlippool</strong></p>
<pre class="remontti-code"># ln -s /etc/freeradius/3.0/mods-available/sqlippool /etc/freeradius/3.0/mods-enabled/sqlippool
# vim /etc/freeradius/3.0/mods-enabled/sqlippool</pre>
<pre class="remontti-code"># Comente:
# pool_key = &quot;%{NAS-Port}&quot;
# Descomente
pool_key = &quot;%{Calling-Station-Id}&quot;</pre>
<p>Precisamos adicionar o mod sqlippool no nosso arquivo default, você acrescentará sqlippool em accounting e post-auth logo abaixo de sql: </p>
<pre class="remontti-code"># vim /etc/freeradius/3.0/sites-enabled/default</pre>
<pre class="remontti-code">
accounting {
        sql
        sqlippool
}
session {
        sql
}
post-auth {
        sql
        sqlippool
}
</pre>
<p>Uma alteraçõe que acho interessante é 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 /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf </p>
<p># vim /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf</p>
<pre class="remontti-code">
#
#  The ORDER BY clause of this query tries to allocate the same IP-address
#  which user had last session...
#COMENTE:
#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;

#
#  If you prefer to allocate a random IP address every time, use this query instead.
#DESCOMENTE
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><strong>Opcional</strong></p>
<p>Inicialmente eu particularmente não gosto da ideia da tabela radusergroup não ter um ID então para alterar isso faça. (Se desejar)</p>
<pre class="remontti-code"># mysql/mariadb -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>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 será necessário alterar as configurações do MySQL/MariaDB para permitir uma maior número de conexões.<br />
Ex carga de cerca de 1000 Access-Request por segundo:</p>
<pre class="remontti-code"># vim /etc/freeradius/3.0/radiusd.conf</pre>
<pre class="remontti-code">
#...
thread pool {
    start_servers = 256
    max_servers = 512
    min_spare_servers = 256
    max_spare_servers = 512
    max_queue_size = 1048576
    max_requests_per_server = 0
    auto_limit_acct = no
}
#...</pre>
<p>Para conhecer os atributos que você pode usar em sua base recomendo a leitura do tutorial: "ALIMENTANDO NOSSA BASE DE DADOS" em diante.<br />
<strong><a href="https://blog.remontti.com.br/1651">Servidor FreeRadius com integração MySQL + Autenticação PPPoE & Hotspot VS Mikrotik + Ubiquiti EAP/PSK</a></strong></p>
<p>Sugestões ou criticas envie para Telegram: @remontti</p>
<p>Espero ter ajudado!  <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h3>ARQUIVOS EDITADOS:</h3>
<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 {
        detail
        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>
<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>
<pre class="remontti-code"># cat /etc/freeradius/3.0/mods-enabled/sql |grep -v &quot;#&quot; |awk &#039;NF&gt;0&#039;</pre>
<pre class="remontti-code">
sql {
        driver = &quot;rlm_sql_mysql&quot;
        dialect = &quot;mysql&quot;
        server = &quot;localhost&quot;
        port = 3306
        login = &quot;radius&quot;
        password = &quot;SENHA-USUARIO-RADIUS&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;
        groupcheck_table = &quot;radgroupcheck&quot;
        authreply_table = &quot;radreply&quot;
        groupreply_table = &quot;radgroupreply&quot;
        usergroup_table = &quot;radusergroup&quot;
        delete_stale_sessions = yes
        pool {
                start = ${thread[pool].start_servers}
                min = ${thread[pool].min_spare_servers}
                max = ${thread[pool].max_servers}
                spare = ${thread[pool].max_spare_servers}
                uses = 0
                retry_delay = 30
                lifetime = 0
                idle_timeout = 60
        }
        read_clients = yes
        client_table = &quot;nas&quot;
        group_attribute = &quot;SQL-Group&quot;
        $INCLUDE ${modconfdir}/${.:name}/main/${dialect}/queries.conf
}
</pre>
<pre class="remontti-code"># cat /etc/freeradius/3.0/mods-enabled/sqlippool |grep -v &quot;#&quot; |awk &#039;NF&gt;0&#039;</pre>
<pre class="remontti-code">
sqlippool {
        sql_module_instance = &quot;sql&quot;
        dialect = &quot;mysql&quot;
        ippool_table = &quot;radippool&quot;
        lease_duration = 3600
        pool_key = &quot;%{Calling-Station-Id}&quot;
        messages {
                exists = &quot;Existing IP: %{reply:Framed-IP-Address} (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})&quot;
                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;
                clear = &quot;Released IP %{Framed-IP-Address} (did %{Called-Station-Id} cli %{Calling-Station-Id} user %{User-Name})&quot;
                failed = &quot;IP Allocation FAILED from %{control:Pool-Name} (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})&quot;
                nopool = &quot;No Pool-Name defined (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})&quot;
        }
        $INCLUDE ${modconfdir}/sql/ippool/${dialect}/queries.conf
}
</pre>
<pre class="remontti-code"># cat /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf |grep -v &quot;#&quot; |awk &#039;NF&gt;0&#039;</pre>
<pre class="remontti-code">
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}&#039;&quot;
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;
pool_check = &quot;\
        SELECT id \
        FROM ${ippool_table} \
        WHERE pool_name=&#039;%{control:Pool-Name}&#039; \
        LIMIT 1&quot;
allocate_update = &quot;\
        UPDATE ${ippool_table} \
        SET \
                nasipaddress = &#039;%{NAS-IP-Address}&#039;, pool_key = &#039;${pool_key}&#039;, \
                callingstationid = &#039;%{Calling-Station-Id}&#039;, \
                username = &#039;%{User-Name}&#039;, expiry_time = NOW() + INTERVAL ${lease_duration} SECOND \
        WHERE framedipaddress = &#039;%I&#039; \
        AND expiry_time IS NULL&quot;
start_update = &quot;\
        UPDATE ${ippool_table} \
        SET \
                expiry_time = NOW() + INTERVAL ${lease_duration} SECOND \
        WHERE nasipaddress = &#039;%{NAS-IP-Address}&#039; \
        AND pool_key = &#039;${pool_key}&#039; \
        AND username = &#039;%{User-Name}&#039; \
        AND callingstationid = &#039;%{Calling-Station-Id}&#039; \
        AND framedipaddress = &#039;%{Framed-IP-Address}&#039;&quot;
stop_clear = &quot;\
        UPDATE ${ippool_table} \
        SET \
                nasipaddress = &#039;&#039;, \
                pool_key = 0, \
                callingstationid = &#039;&#039;, \
                username = &#039;&#039;, \
                expiry_time = NULL \
        WHERE nasipaddress = &#039;%{Nas-IP-Address}&#039; \
        AND pool_key = &#039;${pool_key}&#039; \
        AND username = &#039;%{User-Name}&#039; \
        AND callingstationid = &#039;%{Calling-Station-Id}&#039; \
        AND framedipaddress = &#039;%{Framed-IP-Address}&#039;&quot;
alive_update = &quot;\
        UPDATE ${ippool_table} \
        SET \
                expiry_time = NOW() + INTERVAL ${lease_duration} SECOND \
        WHERE nasipaddress = &#039;%{Nas-IP-Address}&#039; \
        AND pool_key = &#039;${pool_key}&#039; \
        AND username = &#039;%{User-Name}&#039; \
        AND callingstationid = &#039;%{Calling-Station-Id}&#039; \
        AND framedipaddress = &#039;%{Framed-IP-Address}&#039;&quot;
on_clear = &quot;\
        UPDATE ${ippool_table} \
        SET \
                nasipaddress = &#039;&#039;, \
                pool_key = 0, \
                callingstationid = &#039;&#039;, \
                username = &#039;&#039;, \
                expiry_time = NULL \
        WHERE nasipaddress = &#039;%{Nas-IP-Address}&#039;&quot;
off_clear = &quot;\
        UPDATE ${ippool_table} \
        SET \
                nasipaddress = &#039;&#039;, \
                pool_key = 0, \
                callingstationid = &#039;&#039;, \
                username = &#039;&#039;, \
                expiry_time = NULL \
        WHERE nasipaddress = &#039;%{Nas-IP-Address}&#039;&quot;
</pre>
<p>O post <a href="https://blog.remontti.com.br/2066">Instalando FreeRadius 3.0.X com integração MySQL ou MariaDB no Debian 9 Stretch</a> apareceu primeiro em <a href="https://blog.remontti.com.br">Remontti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.remontti.com.br/2066/feed</wfw:commentRss>
			<slash:comments>60</slash:comments>
		
		
			</item>
	</channel>
</rss>
