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!
|