FreeBSD + FreeRadius + MySQL

Neste artigo aprenderemos a criar um servidor PPPoE em FreeBSD com autenticação no FreeRadius consultando um banco de dados em MySQL. Será uma conexão com usuário e senha como a maioria dos provedores ADSL provêem, liberando um IP inválido para cada estação.

[ Hits: 59.023 ]

Por: Thomaz Belgine em 05/10/2007


Instalando o MySQL



Vamos instalar o MySQL:

# cd /usr/ports/databases/mysql50-server/
# make install clean


Hora de rodar o mysql (confirmar o arquivo rc.conf acima):

# /usr/local/etc/rc.d/mysql-server start
# /usr/local/bin/mysql_install_db


Configurar a senha de root:

# /usr/local/bin/mysqladmin -u root password 'new-password'

Teste o mysql:

# mysql -p
Enter password:

Vamos preparar o banco de dados com suas respectivas tabelas:

mysql> create database radius;
mysql> use database;

Criando as tabelas

Criando as tabelas de autenticação (cole o conteúdo abaixo no terminal do MySQL):

CREATE TABLE radacct (
  RadAcctId bigint(21) NOT NULL auto_increment,
  AcctSessionId varchar(32) NOT NULL default '',
  AcctUniqueId varchar(32) NOT NULL default '',
  UserName varchar(64) NOT NULL default '',
  Realm varchar(64) default '',
  NASIPAddress varchar(15) NOT NULL default '',
  NASPortId varchar(15) default NULL,
  NASPortType varchar(32) default NULL,
  AcctStartTime datetime NOT NULL default '0000-00-00 00:00:00',
  AcctStopTime datetime NOT NULL default '0000-00-00 00:00:00',
  AcctSessionTime int(12) default NULL,
  AcctAuthentic varchar(32) default NULL,
  ConnectInfo_start varchar(50) default NULL,
  ConnectInfo_stop varchar(50) default NULL,
  AcctInputOctets bigint(12) default NULL,
  AcctOutputOctets bigint(12) default NULL,
  CalledStationId varchar(50) NOT NULL default '',
  CallingStationId varchar(50) NOT NULL default '',
  AcctTerminateCause varchar(32) NOT NULL default '',
  ServiceType varchar(32) default NULL,
  FramedProtocol varchar(32) default NULL,
  FramedIPAddress varchar(15) NOT NULL default '',
  AcctStartDelay int(12) default NULL,
  AcctStopDelay int(12) default NULL,
  PRIMARY KEY  (RadAcctId),
  KEY UserName (UserName),
  KEY FramedIPAddress (FramedIPAddress),
  KEY AcctSessionId (AcctSessionId),
  KEY AcctUniqueId (AcctUniqueId),
  KEY AcctStartTime (AcctStartTime),
  KEY AcctStopTime (AcctStopTime),
  KEY NASIPAddress (NASIPAddress)
) ;

CREATE TABLE radcheck (
  id int(11) unsigned NOT NULL auto_increment,
  UserName varchar(64) NOT NULL default '',
  Attribute varchar(32)  NOT NULL default '',
  op char(2) NOT NULL DEFAULT '==',
  Value varchar(253) NOT NULL default '',
  PRIMARY KEY  (id),
  KEY UserName (UserName(32))
) ;


CREATE TABLE radgroupcheck (
  id int(11) unsigned NOT NULL auto_increment,
  GroupName varchar(64) NOT NULL default '',
  Attribute varchar(32)  NOT NULL default '',
  op char(2) NOT NULL DEFAULT '==',
  Value varchar(253)  NOT NULL default '',
  PRIMARY KEY  (id),
  KEY GroupName (GroupName(32))
) ;

CREATE TABLE radgroupreply (
  id int(11) unsigned NOT NULL auto_increment,
  GroupName varchar(64) NOT NULL default '',
  Attribute varchar(32)  NOT NULL default '',
  op char(2) NOT NULL DEFAULT '=',
  Value varchar(253)  NOT NULL default '',
  PRIMARY KEY  (id),
  KEY GroupName (GroupName(32))
) ;


CREATE TABLE radreply (
  id int(11) unsigned NOT NULL auto_increment,
  UserName varchar(64) NOT NULL default '',
  Attribute varchar(32) NOT NULL default '',
  op char(2) NOT NULL DEFAULT '=',
  Value varchar(253) NOT NULL default '',
  PRIMARY KEY  (id),
  KEY UserName (UserName(32))
) ;


CREATE TABLE usergroup (
  UserName varchar(64) NOT NULL default '',
  GroupName varchar(64) NOT NULL default '',
  priority int(11) NOT NULL default '1',
  KEY UserName (UserName(32))
) ;


CREATE TABLE radpostauth (
  id int(11) NOT NULL auto_increment,
  user varchar(64) NOT NULL default '',
  pass varchar(64) NOT NULL default '',
  reply varchar(32) NOT NULL default '',
  date timestamp(14) NOT NULL,
  PRIMARY KEY  (id)
) ;


CREATE TABLE nas (
  id int(10) NOT NULL auto_increment,
  nasname varchar(128) NOT NULL,
  shortname varchar(32),
  type varchar(30) DEFAULT 'other',
  ports int(5),
  secret varchar(60) DEFAULT 'secret' NOT NULL,
  community varchar(50),
  description varchar(200) DEFAULT 'RADIUS Client',
  PRIMARY KEY (id),
  KEY nasname (nasname)
);

mysql> exit

Página anterior     Próxima página

Páginas do artigo
   1. Compilando o Kernel
   2. Atualizar o ports
   3. Instalando o MySQL
   4. Instalando o FreeRadius
   5. Testando as configurações
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Apache 2 para Debian

Site for IE: Até quando?

Acesso remoto fácil, sem necessidade de instalação de programa

Flash 9 com som OSS

Compartilhar uma conexão via rádio na rede interna

  
Comentários
[1] Comentário enviado por rodrigo.pacheco em 05/10/2007 - 13:18h

asf

[2] Comentário enviado por manfilho em 08/10/2007 - 01:16h

Me desculpe caro colega... valeu pela intenção e dedicar o seu tempo para escrever esse "artigo"... mas.. entendi o seguinte:
Artigo copiar e colar, sem muitas explicações e detalhes de informações
Você acha que eu vou fazer o que você está "mandando" sem que você me convença o porquê? em um servidor?
Tudo na vida tem uma explicação, para você mostrar que realmente conhece do assunto simplesmente não me mande copiar e colar, escrever tal linha, sem explicar o que cada coisa dessas faz
No VOL tem muito tipo de Artigo desse tipo
Não curto :)

[3] Comentário enviado por tholoko em 08/10/2007 - 07:45h

Me desculpe amigo... pelo meu "artigo"... mas tenho certeza que nenhum USER vai tentar instalar um Servidor PPPoE sem antes ter noções de alguns fatores...

Muitas vezes eh melhor ensinar alguem assim USER a pescar,,, do que lhe entregar o peixe!!! Não acha???

Se quiser posso te fazer um tutorial bem explicadinho... soh pra vc!!! Afinal... eh muito mais facil.... ler algo explicadinho do que correr atras, olhar os man e descobrir o que cada função faz... Se outro pode ler pra mim e escrever resumido... pq perder meu tempo neh??? muito boa!

Boa sorte nas pesquisas por artigos resumidos... abraços!

[4] Comentário enviado por adrianoturbo em 08/10/2007 - 14:51h

Esse artigo é ação do começo ao fim ,que pena que não está elucidado.para o bom entendedor meia palavra basta!

[5] Comentário enviado por manfilho em 08/10/2007 - 17:45h

Olá caro amigo tholoko,
Você não me entendeu bem, eu não estou pedindo um tutorial diferenciado para mim, peço para a comunidade.
Com mais explicações, riqueza de informação, uma coisa que o usuário leia, entenda o que você está recomendando o que faça.
Você está entrando em contradição quando diz:

"Muitas vezes eh melhor ensinar alguem assim USER a pescar,,, do que lhe entregar o peixe!!! Não acha???"

Eu acho que você está entregando o peixe sem ensinar como pescar, caro colega... simplesmente, digite isso, subistitua tal arquivo, reinicie, copie, cole, edite e pronto! estará pronto!
É difícil fazer? sei que não é.
Mas se mesmo assim você não entender, peço que faça um SÓ PARA MIM, que eu publico na comunidade dando todo mérito a você.
Um abraço.

[6] Comentário enviado por tholoko em 09/10/2007 - 10:48h

FalaPharoeste... Entendi onde vc quer chegar... mas entenda... nesse artigo tentei explicar o funcionamento do PPPoE... onde comento e muito bem todas as config do artigo ppp.conf... Podemos utilizar um arquivo texto ppp.secret ao inves de criar um FreeRadius se autenticando em MySQL, assim ficaria bem mais curto o artigo, mas apenas mostrei que isso eh variavel e foi o melhor metodo para o meu problema.

Sei como que foi dificil para eu chegar e montar esse Servidor e não quero entregar de mão beijada a todos... apenas ensinei a voar... mas depende dos users criar asas...

No meu server,,, criei absurdos... controle de banda com IPFw,,, bloueio de cliente com meu sistema em PHP... relatorios... etc... mas isso é segredo de estado!!! akaukauakuaka

ABraços...

[7] Comentário enviado por wpereiratecno em 03/11/2009 - 09:39h

Olá, Thomaz.

Se me permite, gostaria de acrescentar algo sobre a questão freeradius + mysql:

Antes de dizer que algo funciona ou não, nessa ou naquela distribuição, é importante considerar, além da distribuição GNU/Linux ou BSD-like usada, as versões dos programas também.

No meu cenário eu tenho:
- Debian GNU/Linux lenny x86_64 kernel 2.6.26-2-amd64 (isso tudo significa Debian 64 bits)
- Freeradius 2.0.4
- MySQL 5.0.51a


Algumas considerações:


1. Eu não criei os tipos de autenticação para a tabela radgroupcheck e mesmo assim funcionou (aliás, é altamente recomendável não usar o atributo Auth-Type);
2. Na tabela radcheck o Attribute pode ser 'Crypt-Password' (que dá uma segurança maior);
3. Edite o arquivo /etc/freeradius/sites-enabled/default e, além de descomentar as linhas de sql recomendadas pelo Thalles, descomente a linha unix (isso fará com que o freeradius autentique via MySQL e não via /etc/passwd);
4. No mesmo arquivo /etc/freeradius/sites-enabled/default comente a linha radutmp, conforme abaixo:

# Session database, used for checking Simultaneous-Use. Either the radutmp
# or rlm_sql module can handle this.
# The rlm_sql module is *much* faster
session {
# radutmp

5. Na tabela radgroupreply, a coluna Prio não estava criada, então eu precisei criar com o comando ALTER TABLE radgroupreply ADD Prio VARCHAR(1); (rodei na base de dados criada o script de schema.sql e essa coluna Prio não foi criada, por isso a criei manualmente).

6. Nas propriedades de conexão da tabela radgroupreply, o Attribute Framed-Compression aceita tanto o Value Van-Jacobsen-TCP-IP quanto Van-Jacobson-TCP-IP (mas o recomendado pela IETF na RFC 1144 é o segundo).

7. Não esquecer de descomentar a linha $INCLUDE sql.conf do arquivo /etc/freeradius/radiusd.conf


Algumas recomendações:


1. Além do usuário root da base de dados MySQL, crie um usuário adicional, com privilégio USAGE e com senha diferente da do root, pois será necessário informar esses dados no arquivo /etc/freeradius/sql.conf, na sessão # Connection info; portanto, não é muito seguro deixar a senha do root nesse arquivo. Veja a seguir:

# Connection info:
server = "localhost"
login = "usuario_adicional"
password = "senha_usuario_adicional"

2. Verifique sempre se os serviços mysql e freeradius estão rodando. Se não estiverem, faça /etc/init.d/mysql start e /etc/init.d/freeradius start (você pode preferir automatizar essa tarefa com a ferramenta update-rc.d).

3. Algumas verificações que podem ser feitas para garantir que está tudo configurado corretamente:

a. ifconfig eth0 (comando para verificar o IP da interface eth0)
b. editar o arquivo /etc/hostname (para verificar se o nome do servidor está correto)
c. editar o arquivo /etc/hosts (para verificar se o IP e o hostname estão correspondendo)


HORA DE ALEGRIA:


Após toda a instalação e configuração, teste com o radtest:
Entre na pasta /etc/freeradius
Digite: radtest {username} {password} {hostname:port} 10 {radius_secret}

Se retornar a mensagem...

Sending Access-Request of id 174 to 10.0.0.1 port 1812
User-Name = "user"
User-Password = "teste"
NAS-IP-Address = 10.0.0.1
NAS-Port = 0
rad_recv: Access-Accept packet from host 10.0.0.1 port 1812, id=174, length=44
Framed-Compression = Van-Jacobson-TCP-IP
Framed-Protocol = PPP
Service-Type = Framed-User
Framed-MTU = 1500

...então é HORA DE ALEGRIA! Vamos sorrir e cantar! Funcionou! Aproveite para ir tomar um café sossegado : )

Obs.: o IP privado 10.0.0.1 foi usado para efeito didático apenas, portanto, esse IP será o do seu servidor onde está rodando o freeradius.

Agradeço o apoio inestimável dos colegas Boni, Ettore, Tati, Roberto e Sidinei; e a confiança do parceiro Rogério Herrera, por me confiar esse desafio.

Um grande abraço a todos e sucesso!

Wagner Pereira
wpereiratecnologia@gmail.com
twitter: @wpereiratecno


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts