deb

Radius Server(FreeRadius) Integrado com Mikrotik usando Mysql para gerenciar pool de ips, autenticação, restrição MAC Address e Planos.

Pessoal, publiquei no prefiro linux um vídeo muito bacana, aliás, dois vídeos sobre a configuração do Freeradius.
Bom, os vídeos fiz exclusivamente para o http://prefirolinux.com(podem ser vistos os post aqui e também o segundo aqui!), e aqui postarei os comandos, a parte textual de como se fazer essas configurações, visto que se combinados os tutoriais isso pode acabar se tornando em uma excelente ferramenta implementada na sua rede.

A estrutura é bem semelhante a da figura abaixo:

Radius

Motivos para se ter o Radius:

* Centralização de Usuários
* Criação e centralização de planos para usuários
* Criação e distribuição de pool de ips, dentre outros.

Mas então porque não fazer isso diretamente no mikotik?
Primeiro que o Mikrotik não nos da suporte a mysql, a usar um radius server profissional, pois o que o acompanha por ex não nos possibilita usar chaves WPA Enterprise e etc.

O Mikrotik nesse cenário será exclusivamente para que possamos ter um servidor pppoe rodando, e assim então passaremos a ele as informações que estarão contidas no nosso servidor FreeRadius.

 

Preparando o terreno(laboratório, etc)…:
Baixem a versão do Turnkey mysql, é uma versão linux baseada no debian 8 é bem pequena, fácil de ser instalada(na verdade até de olhos fechados se faz isso) e muito simples de se configurar.

O link para download é ESTE

Após baixar e instalar, vamos fazer alguns procedimentos básicos, primeiro rodando um update no sistema:

apt-get update

Logo após o término do download de arquivos de atualização vamos então instalar o nosso servidor FreeRadius, para isso então usamos:

apt-get instal freeradius freeradius-mysql freeradius-utils

Antes de tudo, é preciso que criemos um banco de dados, importemos alguns arquivos que acompanham o radius e dai vamos configurar o freeradius propriamente dito.
Então usamos:

mysql -uroot -psenha
mysql create database radius;
mysql grant all privileges on radius.* to radius@localhost identified by ‘password_radius’
mysql\q

Importamos toda a estrutura que será usada para montarmos nosso servidor, a começar pelo banco de dados Mysql:

mysql -uroot -ppassword_radius radius freeradius/sql/mysql/schema.sql
mysql -uroot -ppassword_radius radius freeradius/sql/mysql/nas.sql
mysql -uroot -ppassword_radius radius freeradius/sql/mysql/ippool.sql

Vamos começar então toda a sequência de configuração do nosso Radius, a começar pelo radius.conf :

cd /etc/freeradius
nano radius.conf

 

 

Iremos procurar pelas linhas que estão comentadas e descomentar (removendo da frente do modulo que o ‘#’), deixando dessa forma:

$INCLUDE sql.conf

E logo abaixo descomentaremos o seguinte:

$INCLUDE sqlippool.conf

Feito isso feche o arquivo, salve antes ein…

Vamos para nosso próximo arquivo, o sql.conf

nano sql.conf

Vamos primeiro editar os dados de acesso ao nosso banco de dados Mysql.
Onde tiver:

# Connection info:
 server = "Servidor" #Host do banco de dados
 #port = 3306 #Porta do banco de dados mysql, padrão.
 login = "Usuario" #nome do banco
 password = "SUASENHAMYSQL"

Ficará bem parecido com isso aqui:

# Connection info:
 server = "localhost"
 #port = 3306
 login = "radius"
 password = "Thiago123"

Agora vamos lá no fim do arquivo, procuramos pela seguinte ocorrência:

#readclients = yes

Descometamos ela, ficando assim:

readclients = yes

Salve, saia e vamos editar o arquivo inner-tunnel.

cd /etc/freeradius/sites-available
nano inner-tunnel

Procuraremos pela seguinte referência e faremos alterações somente nas linhas que aparecerão aqui.

Ok?

Modulo:
 authorize {
 sql
 }

 

 

Este é um exemplo, o arquivo completo com o modulo destacado e funcional pode ser baixado clicando no mome do arquivo de configuração acima (inner-tunnel).

No modulo session:

session {
 sql
 }

Depois em post-auth

post-auth {
 ...
 #
 # Post-Auth-Type REJECT {
 # # log failed authentications in SQL, too.
 # sql
 # attr_filter.access_reject
 # }
}

Pronto, salve e saia.
Vamos ao próximo arquivo, denominado DEFAULT no mesmo diretório.

Authorize {
 ...
 #digest
 #suffix
 #files
 sql
 …
 }

Em Authentication:

authenticate {
 ...
 #digest
 #unix
 …
 }

Vamos no Preacct, e deixaremos dessa forma

preacct {
 ...
 #suffix
 #files
 …
 }

Em accounting deixaremos assim:

accounting {
 #detail
 sql
 sqlippool
 #exec
 #attr_filter.accounting_response
 …
 }

Em session deixamos desta forma:

session {
 …
 #radutmp
 sql
 …
 }

E em post-auth ainda no default vamos deixá-lo desta maneira:

post-auth {
 ...
 sql
 sqlippool
 #exec
 # Post-Auth-Type REJECT {
 # # log failed authentications in SQL, too.
 # sql
 # attr_filter.access_reject
 # }
 …
 }

NOTA: Lembrem-se, apenas estão listados acima os módulos, ou acls ou regras que devem ser comentadas ou descomentadas, não é o arquivo por inteiro. Mas como sou um cara que gosta de compartilhar…. Pah, tá ai no post no nome de cada arquivo o link para cada configuração referente.

 

 

Pronto, agora vamos voltar ao que interessa, entre em ‘/etc/freeradius/sites-enable’ e rode o seguinte.

ls

irá ter dois arquivos, mas vamos linkar simbolicamente o conteúdo do diretório anterior para esse diretório em um arquivo chamado ‘control-socket’…

#ln -s ../sites-available/control-socket

Agora existem 3(três) arquivos, 😉

Bom, veja cada coisa com cuidado para não se perder, existem esses dois diretórios acima, ambos podem parecer iguais mas não são! Um refere-se aos servidores habilitados, o outro aos servidores disponíveis.. OK?

Vamos então pro próximo passo, editar o arquivo ‘sqlippol.conf’ no diretorio do radius(freeradius).

Altere o seguinte : Descomente, altere a linha onde encontrar essa ocorrência :

 

$INCLUDE sql/postgresql/ippool.conf

Deixe assim:

$INCLUDE sql/mysql/ippool.conf

E para evitar o uso de um login com vários MAC(vou explicar após o item a ser modificado) nós vamos fazer uma alteração. Isso impedirá que o nosso cliente se autentique pelo NAS, ou seja, ele não poderá usar o NAS(MIKROTIK) como base de referência para autenticação, mas será obrigatório usar o MAC Address para tal.

Onde tiver assim:

pool-key = "%{NAS-Port}"
 #pool-key = "%{Calling-Station-Id}"

Mude e deixe assim:

#pool-key = "%{NAS-Port}"
 pool-key = "%{Calling-Station-Id}"

Isso basicamente impedirá nosso usuário de usar como método de referência para autenticação o NAS onde está se conectando. Ex: Tenho duas torres, cada torre um Mikrotik e em cada uma tenho uma porção de usuários, imagine que um esperto upe uma antena e conecte na sua segunda rede, ou que faça algo similar(é possível -usuário é o terror). Então o FDM vai se autenticar 2x, tendo 2perfis de velocidades. Duas máquinas navegando usando somente um login. Mas alterando isso ele não pegará como referência o nosso Nas, mas sim o seu MAC, ai ele pode até tentar mas terá que burlar vários itens, login, mac, pool, plano, nome de usuário, enfim, ele tá na bosta…

 

 

Vamos agora pra parte chata, alterar o arquivo ‘/etc/freeradius/sql/mysql/ippool.conf
Explicação:
Imagine que você tenha um link dedicado por onde seus usuários atrás de um NAT saem para o mundão da perdição chamado internet. Então, esse carinha pode se ferrar se você tiver um ip fixo, e ele estiver em um site de download por exemplo.
Vamos supor, mega.cz.
Então ele baixa 2gb de arquivos, na próxima tentativa de download ele vai receber uma maldita mensagem de que atingiu um limite e não pode baixar e etc.
Agora imagine você com dois links, ambos com ip fixo, ou um com ip fixo e um adsl dinâmico.
O usuário vai la, baixa os arquivos mas da um erro na segunda tentativa, excedeu o limite.
Pra usuários adsl é facil, reboot no modem e sobe ip novo, mas e pra quem depende de nat e etc e etc?
Bom, se você tem dois links você pode fazer com que a cada reconexão esse usuário pegue ip de uma pool diferente, então esse método é para que ele possa receber ip de uma pool que tem no nat um ip diferente do segundo link.
De inicio fica complicado, mas se você souber fazer corretamente um load balance, ou algo que possa mudar essas regras então meu amigo, você poderá salvar aquele pornô do seu user e ter um cliente satisfeito.
Mas como eu não estou aqui para ensinar e nem abordar nada sobre LB então vamos ao config que permite a mudanças de ips, em breve resumo ele vai pegar um ip dinâmico após um reconexão, assim como os users de adsl fazerm. Isso é otimo!

Bom, se deseja fazer isso(NÃO É OBRIGATORIO) então faça o seguinte:

Comente esse trecho do arquivo de config…

## The ORDER BY clause of this query tries to allocate the same IP-address
 ## which user had last session...
 #allocate-find = "SELECT framedipaddress FROM ${ippool_table} \
 # WHERE pool_name = '%{control:Pool-Name}' AND (expiry_time < NOW() OR expiry_time IS NULL) \
 # ORDER BY (username <> '%{User-Name}'), \
 # (callingstationid <> '%{Calling-Station-Id}'), \
 # expiry_time \
 # LIMIT 1 \
 # FOR UPDATE"

Mas por favor, descomente esse se não esse cara não pega ip e você se enrola.

# ## If you prefer to allocate a random IP address every time, i
 # ## use this query instead
 allocate-find = "SELECT framedipaddress FROM ${ippool_table} \
 WHERE pool_name = '%{control:Pool-Name}' \
 AND expiry_time IS NULL \
 ORDER BY RAND() \
 LIMIT 1 \
 FOR UPDATE"

.
Pronto, salva, saia, tome um café, acenda um Carlton, olhe as estrelas, pense e volte pra terminamos. Blz?

A gente até que poderia realizar um teste, usando radtest.
Porém, por não termos nada no database ainda só teriamos decepções, erros e reject.
Então, rode pelo menos isso aqui:

freeradius -X

Possíveis saídas:

Se sair isso aqui nas ultimas duas linhas o problema é simples.

Failed binding to authentication address * port 1812: Address already in use
 /etc/freeradius/radiusd.conf[273]: Error binding to port for 0.0.0.0 port 1812

O seu freeradius está rodando em modo normal, como já tem a porta ocupada então ele retorna erro, ai basta parar o freeradius

Ai rode o #freeradius -X novamente, se sair isso aqui:

... adding new socket proxy address * port 51311
 Listening on authentication address * port 1812
 Listening on accounting address * port 1813
 Listening on command file /var/run/freeradius/freeradius.sock
 Listening on authentication address 127.0.0.1 port 18120 as server inner-tunnel
 Listening on proxy address * port 1814
 Ready to process requests.

Então tá tudo certo e você pode prosseguir para parte de banco de dados.

Contudo, caso ocorra este erro abaixo, Ex:

...
 rlm_sql (sql): Closing sqlsocket 0
 /etc/freeradius/sql.conf[22]: Instantiation failed for module "sql"
 /etc/freeradius/sites-enabled/default[177]: Failed to find "sql" in the "modules" section.
 /etc/freeradius/sites-enabled/default[69]: Errors parsing authorize section.

Cara, tem algum errinho nas config do sql.conf ou similar, tente ver a primeira linha, geralmente o erro está claramente nela e você pode ignorar as demais.
Se você não conseguir solucionar, me chama no whats, no facebook, na página da facebook eu ajudo pra caramba. Só não pode exagerar né? Hihihi

Ah, esse erro fiz de propósito, foi ocasionado pela senha do sql.conf(dados de conexão ao bd) errada.
Só observar cada pequeno item.

Feito isso, bom, ai agora meu amigo é só alimentar a base de dados.

E isso eu recomendo fortemente que vocês deem uma olhada la no prefirolinux, abaixo do video eu deixei a referência de como inserir essas informações.

Vejam aqui e só usem a partir de “ Alimentar as Tabelas :”

Então, agora é só ir adicionando usuários.
Eu cheguei a criar um programa para gerenciar o Freeradius, mas ele está em fase de testes e no momento existe uma grande possibilidade de que tenha algum bug e que possa dar algum problema.
FDS vou analisar esse prog com calma, se tiver tudo certinho eu libero aqui.

Ah, antes de alimentar as tabelas rodem isso no seu prompt do mysql.

SET NAMES utf8;
 SET foreign_key_checks = 0;
 SET time_zone = 'SYSTEM';
 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
DROP TABLE IF EXISTS `radusergroup`;
 CREATE TABLE `radusergroup` (
 `id` int(20) NOT NULL AUTO_INCREMENT,
 `username` varchar(64) NOT NULL DEFAULT '',
 `groupname` varchar(64) NOT NULL DEFAULT '',
 `priority` int(11) NOT NULL DEFAULT '1',
 PRIMARY KEY (`id`),
 UNIQUE KEY `id` (`id`),
 KEY `username` (`username`(32))
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Agora é só alimentar as tabelas:

INSERT INTO `nas` (`nasname`, `shortname`, `type`, `ports`, `secret`, `server`, `community`, `description`) VALUES ('10.1.1.1', 'MikroTik', 'MikroTik', NULL, '12345', NULL, NULL, 'Mik.router');

INSERT INTO `radippool` (`id`, `pool_name`, `framedipaddress`, `nasipaddress`, `calledstationid`, 
`callingstationid`, `expiry_time`, `username`, `pool_key`) VALUES
('NULL', 'pool', '10.1.1.1', '', '', '', NULL, '', '0'),
('NULL', 'pool', '10.2.3.110', '', '', '', NULL, '', '0'),
('NULL', 'pool', '10.2.3.111', '', '', '', NULL, '', '0'),
('NULL', 'pool', '10.2.3.112', '', '', '', NULL, '', '0'),
('NULL', 'pool', '10.2.3.113', '', '', '', NULL, '', '0')

INSERT INTO `radgroupreply` (`groupname`, `attribute`, `op`, `value`) VALUES
('PLANOX', 'Acct-Interim-Interval', ':=', '300'),
('PLANOX', 'Mikrotik-Rate-Limit', ':=', '1024k/2048k'),

INSERT INTO `radgroupcheck` (`groupname`, `attribute`, `op`, `value`) VALUES
('PLANOX', 'Pool-Name', ':=', 'pool'),
('PLANOX', 'Simultaneous-Use', ':=', '1'),
('PLANOX', 'Framed-Protocol', ':=', 'PPP'),
('PLANOX', 'Service-Type', ':=', 'Framed-User'),

INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES
('thiago@prefirolinux.com', 'User-Password', '==', '12345'),
('thiago@prefirolinux.com', 'Calling-Station-Id', '==', 'CC:EE:C8:9C:39:C7'),
('thiago@prefirolinux.com', 'Service-Type', '==', 'Framed-User'),
('thiago@prefirolinux.com', 'Simultaneous-Use', ':=', '1'),
('thiago@prefirolinux.com', 'Pool-Name', ':=', 'pool'),
('thiago@prefirolinux.com', 'Framed-Protocol', ':=', 'PPP');
('thiago@prefirolinux.com', 'Mikrotik-Rate-Limit', ':=', 'PLANOX');

INSERT INTO radreply (username, attribute, op, value) VALUES ('thiago@prefirolinux.com', 'Mikrotik-Rate-Limit', '=', 'PLANOX'),


INSERT INTO radreply ( id , UserName , Attribute , op , Value ) VALUES (NULL , 'thiago@prefirolinux.com', 'Framed-Pool', '=', 'pool')


INSERT INTO radusergroup (username, groupname, priority) VALUES('thiago@prefirolinux.com', 'PLANOX', 0);

 

 

Com isso você terá um usuario chamado “thiago@prefirolinux.com” senha “12345″ com um NAS(Mikrotik)10.1.1.1” sendo que provavelmente seu Radius atenderá por IP “10.1.1.10” e ai é só criar um Servidor PPPoE no Mikrotik.

Num proximo post eu vou mostrar como configurar o server pppoe pronto para rodar com o Freeradius(Radius) 😉

Todos os arquivos, inner-tunnel, default, sql.conf, sqlippool.com, radius.conf estão abaixo do trecho onde fiz referencia a eles aqui nesse post.
Então, ou você pode substituir, ou pode simplesmente observar as linhas citadas para ter mais segurança na edição dos arquivos.
No mais, eu devo fazer alguma correção até o domingo.
Dúvidas? 038-992243732 whats
e-mail: thiago@thiagoferreira.net
skype: esqueci
Perfil no FB : https://fb.com/tcruzf1987
Pagina do Blog :https://www.facebook.com/Thiago-Ferreira-980998021935127/
Abraços,
ThiagoFW

 
[ x ]
 

 

Tags:, , , , , , ,

  • Willian Castor

    Excelente, Muito Obrigado, consegui matar varias duvidas =D