<?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 ubnt - Remontti</title>
	<atom:link href="https://blog.remontti.com.br/tag/ubnt/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.remontti.com.br/tag/ubnt</link>
	<description>rudimar@remontti</description>
	<lastBuildDate>Thu, 12 Mar 2020 17:58:12 +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 ubnt - Remontti</title>
	<link>https://blog.remontti.com.br/tag/ubnt</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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 fetchpriority="high" 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="(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-XzSgFiFi" data-rl_title="" data-rl_caption="" title=""><img 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="(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>
		<item>
		<title>Servidor FreeRadius com integração MySQL + Autenticação PPPoE &#038; Hotspot VS Mikrotik + Ubiquiti EAP/PSK [Descontinuado]</title>
		<link>https://blog.remontti.com.br/1651</link>
					<comments>https://blog.remontti.com.br/1651#comments</comments>
		
		<dc:creator><![CDATA[Rudimar Remontti]]></dc:creator>
		<pubDate>Tue, 14 Feb 2017 01:28:29 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mikrotik]]></category>
		<category><![CDATA[Outros]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[counter]]></category>
		<category><![CDATA[eap]]></category>
		<category><![CDATA[freeradius]]></category>
		<category><![CDATA[ippool]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[psk]]></category>
		<category><![CDATA[radius]]></category>
		<category><![CDATA[ubiquiti]]></category>
		<category><![CDATA[ubnt]]></category>
		<guid isPermaLink="false">http://blog.remontti.com.br/?p=1651</guid>

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