FUG-BR / Grupo Brasileiro de Usuarios de FreeBSD - Servidor PPPoE + FreeRadius + MySQL
 
08.07  
Inicio arrow Artigos arrow Servidor PPPoE + FreeRadius + MySQL
Principal
Inicio
Noticias
Artigos
Regras da Lista
Assinar a Lista
Histrico da Lista
Forum
Keyserver
PC-BSD: Artigos
PC-BSD: Notcias
Galeria de Imagens
Contador Usurios FUG
FUGs Estaduais
Downloads
Enquetes
FAQ
Resumo do Site
Links
Pesquisar
Contato
Sobre a FUG-BR
RSS / Twitter
-
DOC-BR (FUG BR)
Introduo
Projeto DOC-BR
Handbook
FAQ Oficial
-
+ Noticias
Alertas de Seguranca
Alertas em Ports
BSD em Geral
DaemonNews (Ingles)
MyFreeBSD
Todas Categorias
-
Login
Nome de Usurio

Senha

Lembrar login
Esqueceu sua senha?
Sem conta? Crie uma


Servidor PPPoE + FreeRadius + MySQL PDF Imprimir E-mail
Por Thomaz ThOLOko BeLgine   
14/09/2007

Neste how-to iremos fazer um Servidor PPPoE (conexão com usuário e senha, como as conexãos de provedores ADSL) integrado com o FreeRadius se autenticando em uma base de dados MySQL. Será um servidor básico mas com alguns ajustes poderemos incrementá-lo e com uma pequena interface WEB em PHP + MySQL conseguiremos criar um sistema com total interação em nosso servidor.

Leia o artigo na integra, clique em Leia Mais!

Montando um Servidor PPPoE (PPP Over Ethernet)

Depois de instalar o FreeBSD, compilar o kernel:

# csup -g -L 2 -4 -h cvsup8.freebsd.org /usr/share/examples/cvsup/stable-supfile

# cd /sys/i386/conf/
# cp GENERIC SEUKERNEL
# ee SEUKERNEL

Onde SEUKERNEL sera um nome qualquer. Gosto de colocar o hostname da máquina.

Incluir no final do arquivo:

options         IPFIREWALL              #firewall
options         IPFIREWALL_VERBOSE      #enable logging to syslogd(8)
options         IPFIREWALL_VERBOSE_LIMIT=100    #limit verbosity
options         IPFIREWALL_DEFAULT_TO_ACCEPT    #allow everything by default
options         IPFIREWALL_FORWARD      #packet destination changes
options         IPFILTER
options         IPFILTER_LOG
options         IPDIVERT                #divert sockets
options         IPSTEALTH               #support for stealth forwarding
options         DUMMYNET
options         HZ=1000
options         ALTQ
options         ALTQ_CBQ        # Class Bases Queueing
options         ALTQ_RED        # Random Early Drop
options         ALTQ_RIO        # RED In/Out
options         ALTQ_HFSC       # Hierarchical Packet Scheduler
options         ALTQ_CDNR       # Traffic conditioner
options         ALTQ_PRIQ       # Priority Queueing
options         NETGRAPH
options         NETGRAPH_PPPOE
options         NETGRAPH_SOCKET
options         NETGRAPH_IFACE
options         BRIDGE

# config SEUKERNEL
# cd ../compile/SEUKERNEL
# make depend
# make
# make install
#reboot

Atualizar o ports antes de começar a instalar os pacotes:

# portsnap fetch
# portsnap extract

Apos a primeira atualizacao com o portsnap, utilize o comando abaixo para atualiza-lo novamente: 

Instalando o PPPoE

Edite o arquivo

# ee /etc/ppp/ppp.conf

Apague tudo e cole as configs abaixo:

########PPP.CONF########
#########BEGIN##########
default:
 set log Chat Command Phase  #Ativa o cliente logado.
 enable pap                  #Ativa a autenticação pap (password authentication protocol)
 enable chap                 #Ativa a conta chap (challenge handshake authentication protocol)
 enable echo                 #Envio de echos LCP (Verifica se o link está ativo)
 set echoperiod 5            #Tempo de envio para cada echo (Depois de 5 falhas o tun é desconectado)
 allow mode direct           #Ativa o ppp bridging
 enable proxy                #Ativa o ppp proxyarping
 disable ipv6cp              #Como não usamos IPV6, não queremos os seus erros
 set mru 1492                #Coloque o MRU abaixo de 1500
 set mtu 1492                #Coloque o MRU abaixo de 1500
 set ifaddr 192.168.1.1 192.168.1.2-192.168.1.100 # Gateway e range de ips
 set speed sync              #
 set timeout 0               #
 enable lqr                  #
 accept dns                  #Aceita DNS
 set radius /etc/radius.conf #Ativa o Radius e especifica onde está o arquivo de conexão
##########END###########
########PPP.CONF########

Edite o arquivo /etc/radius.conf (Crie este arquivo):

######RADIUS.CONF######
#########BEGIN#########
####tipo###server######senha##
     auth  localhost    senharadius
     acct  localhost    senharadius

######RADIUS.CONF######
##########END##########

Edite o /etc/rc.conf:

########RC.CONF########
#########BEGIN#########
defaultrouter="200.200.200.1"

gateway_enable="YES"
hostname="pppoe.dominio.com.br"

ifconfig_rl0="UP"

ifconfig_bge0="inet 200.200.200.200 netmask 255.255.255.0" #IP WAN

sendmail_enable="NONE"
keymap="us.iso"
linux_enable="YES"
sshd_enable="YES"
usbd_enable="YES"

#MYSQL
mysql_enable="YES"

#FREERADIUS
radiusd_enable="YES"

## SERVIDOR PPPOE
pppoed_enable="YES"
pppoed_flags="-d -P /var/run/pppoed.pid -a "server" -l "default" "
pppoed_interface="rl0"

#IPFW
firewall_enable="YES"
firewall_script="/etc/ipfw.rules"

#NAT
natd_enable="YES"
natd_flags="-config /etc/natd.conf"

##########END##########
########RC.CONF########

Edite o arquivo /etc/natd.conf:

#######NATD.CONF#######
#########BEGIN#########
use_sockets yes
alias_address IP_EXT
punch_fw 500:100
##########END##########
#######NATD.CONF#######

Edite o firewall em /etc/ipfw.rules:

#######IPFW.RULES######
#########BEGIN#########

 /sbin/ipfw -f flush
 /sbin/ipfw add divert natd via bge0
 /sbin/ipfw add pass all from any to any

###########END#########
#######IPFW.RULES######

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:

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

Agora vamos instalar o Freeradius

# cd /usr/ports/net/freeradius
# make config

Selecione as opções abaixo

[X] KERBEROS      With Kerberos support                         
[X] HEIMDAL       With Heimdal Kerberos support                 
[ ] LDAP          With LDAP database support                    
[X] MYSQL         With MySQL database support                
[ ] PGSQL         With PostgreSQL database support           
[ ] FIREBIRD      With Firebird database support (EXPERIMENTAL)
[ ] SNMP          With SNMP support                             
[ ] EDIR          With Novell eDirectory support           
[ ] NOPERL        Do not require perl (use only if necessary)   
[ ] EXPERIMENTAL  Build experimental modules             

# make install clean

Pronto, agora vamos configurar o FreeRadius:

Entre na pasta
# cd /usr/local/etc/raddb/

Editando o arquivo clients.conf:
# ee clients.conf

#####CLIENTS.CONF######
#########BEGIN#########
client 127.0.0.1 {
        secret          = senharadius
        shortname       = localhost
        nastype         = other
##########END##########
#####CLIENTS.CONF######


Como usaremos o Freeradius + MySQL não precisamos configurar o arquivo users. Colocaremos essas informações no próprio banco de dados.

Editanto o arquivo sql.conf:

Somente edite o começo do arquivo com as configurações do seu servidor:

# ee sql.conf

sql {
        # Tipo do banco de dados
        driver = "rlm_sql_mysql"

        # Informações da conexão
        server = "IP_SERVER"
        login = "USER"
        password = "SENHA_BD"

        # Nome do banco de dados
        radius_db = "radius"
...


Editando o arquivo radiusd.conf:

Procure pela linha "authorize". Segue abaixo as novas opções para sql:

authorize {
   preprocess
#    auth_log
#    attr_filter
   chap
   mschap
#    digest
#    IPASS
#    suffix
#    ntdomain
#    eap
#    files
   sql
#    etc_smbpasswd
#    ldap
#    daily
#    checkval
}

# Sessão authentication
# Responsável por conferir o tipo de autenticação usado

authenticate {
   Auth-Type PAP {
       pap
   }
   Auth-Type CHAP {
       chap
   }
   Auth-Type MS-CHAP {
       mschap
   }
#    digest
   pam
#    unix
#    Auth-Type LDAP {
#        ldap
#    }
#    eap
}

#  Sessão Pre-accounting.  Decide qual tipo de contabilidade usar

preacct {
#    preprocess
#    acct_unique
#  home server as authentication requests.
#    IPASS
#    suffix
#    ntdomain
#
#  Read the 'acct_users' file
#    files
}

# Sessao Accounting.  Registra dados de contabilidade
accounting {
#    detail
#    daily
#    unix
#    radutmp
#    sradutmp
#    main_pool
   sql
#    pgsql-voip
}

# Controle de sessao quando se faz o controle de sessao para evitar conexoes simultaneas

# (impede o nome de usuario de se conectar varias vezes de locais diferentes ao mesmo tempo com o mesmo login)

session {
#    radutmp
   sql
}

post-auth {
#    main_pool
#    reply_log
#    sql
#    Post-Auth-Type REJECT {
#        insert-module-name-here
#    }
}

pre-proxy {
#    attr_rewrite
#    pre_proxy_log
}

post-proxy {
#    post_proxy_log
#    attr_rewrite
#    attr_filter
   eap
}

Agora vamos testar essas configurações:

# radiusd -x

Caso apareça a mensagem:

# radiusd -x
Starting - reading configuration files ...
Using deprecated naslist file.  Support for this will go away soon.
There appears to be another RADIUS server running on the authentication port 1812


Pare o serviço do freeradius

# /usr/local/etc/rc.d/radiusd stop

Verifique se o arquivo rc.conf está como descrito atrás.

Execute novamente o comando:

# radiusd -x

Verifique no teste nas linhas rlm_sql se houve a conexão com o banco de dados. O teste está em modo de espera:

Initializing the thread pool...
Listening on authentication *:1812
Listening on accounting *:1813
Ready to process requests.


termine o teste, digitando Control+C :

Vamos criar um usuário teste, entre no mysql:

#mysql -p
Enter password:

mysql> INSERT INTO `radreply` VALUES (1, 'user', 'Framed-IP-Address', '==', '192.168.1.2');
mysql> INSERT INTO `radcheck` VALUES (1, 'user', 'Password', '==', 'senha');
mysql> exit

Vamos testar esse user:

# radtest user senha IP_DO_RADIUS 0 senharadius

Se autenticado será exibida a seguinte mensagem:

Sending Access-Request of id 0 to 127.0.0.1 port 1812
        User-Name = "user"
        User-Password = "senha"
        NAS-IP-Address = 255.255.255.255
        NAS-Port = 0
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=0, length=26
        Framed-IP-Address = 192.168.1.2

Conclusao 

Pronto, agora podemos conectar um PC com um cabo cross na placa rl0 e fazer uma conexão PPPoE.

Bom proveito e let's MAKE INSTALL CLEAN!Laughing

Comentrios
Por DaniLowz! em 14/09/2007 21:30:16
Grandeee Parsa!! isso ae cara, muito bom o tutorial!!  
Orgulho de trampar com algum que termina o que comea! hehe 
 
Parabns!
Distribuiao
Por Wilson em 11/10/2007 22:54:17
ETenho uma rede wirelles, atualemte uso uma distro linux BFW, router e firewall, fiquei interessado no freeBSD, 
preciso de um servidor assim com: ppoe, e-mail, proxy,firewall,radius, qos, filtor l7. etc. 
sonao encontrei umartigo sobre a interface grafica so sitema. grato
ipfw
Por Marco Carvalho em 30/12/2007 19:36:20
Sou novato em *BSD e segui seu tutorial, tudo funcionou perfeitamente at carregar as regras do ipfw: 
/sbin/ipfw -f flush 
/sbin/ipfw add divert natd via lnc0 
/sbin/ipfw add pass all from any to any 
 
Ao carregar as regras eu perco a conexo ao servidor via ssh e a mquina cliente pppoe no autentica mais. 
 
O que posso estar fazendo errado?
Usuarios conectados
Por Gelsimauro Batista dos Santos em 11/01/2008 16:51:54
Funcionou direitinho esse artigo. 
 
Mas como posso saber quais usuarios conectados no momento no meu PPPOE?
Framed-IP-Address
Por Sonio em 05/02/2008 15:57:09
Segui atentamente o tutorial acima, mas nao estou conseguidno fazer com que o usuario pegue sempre o mesmo ip, qdo seto como automatico ele nao conecta caso eu seto quaquer outro numero de ip ele conecta, mas conecta independento do que estiver no Framed IP Adress, o artigo ficou muito bom porem eu devo estar comendo bola em alguma coisa, sera que alguem poderia me ajudar a fixar o ip para um determinado usuario? 
Grato a todos
Usando passwd, sem MYSQl tem como?
Por Evaldo Silva em 04/06/2008 10:39:55
Usando passwd, sem MYSQl tem como?
Usurios simultneos
Por MCA em 31/08/2008 00:11:01
Td bem que esse tutorial funciona. Mas a pergunta ? P/ qtos clientes conectados simultneamente. Por ex: Algum aqui tem 350 clientes ou mais conectados simultneamente em um nico servidor utilizando a soluo acima?


Comente!*
Nome:
E-mail
Homepage
Ttulo:
Comentrio:

Cdigo:* Code

ltima Atualizao ( 15/09/2007 )
 
< Anterior   Prximo >
FUG-BR - Espalhando BSD
Dicas Rpidas:
O portsclean(1) é uma ferramenta que limpa todo o diretório work/ do ports(7). Além de liberar espaço em disco ele é capaz de remover arquivos antigos que não possuem referência no /usr/ports/distfiles.

#portsclean -C
Limpa o diretorio work/

#portsclean -D

Limpa o diretorio distfiles/

#portsclean -i
Modo interativo, pergunta se você quer remover o arquivo

Recomendado
#portsclean -CDi
 






Wallpapers
Sua Opiniao
Online:
Ns temos 20 visitantes online


Devil Store - Sua loja BSD
FreeBSD Brasil LTDA

FUG-BR: Desde 1999, espalhando BSD pelo Brasil.