PPPoE Server with FreeeRadius

From Pruonckk.org

Conteúdo

Prefacio


Hoje utilizo em minha rede alguns servidores com RouterOS, um sistema baseado em linux focado em atividade de ISP.

Este me permite a criação de um servidor pppoe atrelado com um servidor radius externo, porém por uma necessidade especial, precisei implementar um servidor linux (debian) com pppoe e radius, abaixo a descrição da instalação


Dependencias

Para instalar as dependencias no debian lenny execute o comando abaixo

apt-get install mysql-server freeradius radiusclient1 ppp 

RP-PPPoE

O servidor que utilizei para o pppoe foi o rp-pppoe [ http://www.roaringpenguin.com/products/pppoe ], baixe o aplicativo no diretório /usr/src apenas para manter as referecia para o tutorial.

Compilando o rp-pppoe

cd /usr/src/
tar -xzvf rp-pppoe-3.10.tar.gz
cd rp-pppoe-3.10
cd src
./configure

Não havendo erros no ./configure execute:

make
make install

Configurando o PPPoE

Arquivo: /etc/ppp/pppoe-server-options

require-chap
ms-dns 8.8.8.8
ms-dns 8.8.4.4
lcp-echo-interval 10
lcp-echo-failure 2
plugin radius.so
radius-config-file /etc/radiusclient/radiusclient.conf
plugin radattr.so
debug
kdebug 1


Configurando o radiusclient

Arquivo: /etc/radiusclient/radiusclient.conf

Altere os valores referente a cofniguraçao do radius

authserver      localhost:1812
acctserver      localhost:1813

Arquivo: /etc/readiusclient/servers

# IP DO SERVIDOR PPPoE - SENHA DO SERVIDOR PPPoE
127.0.0.1 senha

Configurando o freeradius (servidor)

Arquivo: /etc/freeradius/radiusd.conf

Localize no arquivo a entrada #$INCLUDE sql.conf e remova a cerquilha do inicio da linha


Arquivo: /etc/freeradius/modules/ippool

Localize a opção main_pool , e altere os valores de range-start e range-stop para os valores que você deseja liberar para sua rede


Altere os valores de session-db e ip-index conforme abaixo.

                session-db = /var/run/freeradius/db.ippool
                ip-index = /var/run/freeradius/db.ipindex

Crie o diretorio /var/run/freeradius e de permissão no mesmo

mkdir -p /var/run/freeradius
chmod 777 /var/run/freeradius



Arquivo: /etc/freeradius/sites-enabled/default


na seção authorize localize a opção sql e descomente
na seção accounting localize a opção sql e descomente
na seção post-auth localize a opção sql e descomente
na seção accounting localize a opção main_pool e descomente
na seção post-auth localize a opção main_pool e descomente

Arquivo: /etc/freeradius/sql.conf

Verifique os dados de comunicação com o banco e atualize de acordo com sua necessidade

Descomente a opção read_groups = yes


No diretório /etc/freeradius/sql/mysql/ existem alguns arquivos .sql , é necessário que você execute estes arquivos em seu mysql para criar a estrutura necessária para o radius.

cd /etc/freeradius/sql/mysql
mysqladmin -uroot -p createdatabase radius
mysql -uroot -p radius < admin.sql
mysql -uroot -p radius < ippool.sql
mysql -uroot -p radius < schema.sql
mysql -uroot -p radius < nas.sql


Arquivo: /etc/freeradius/clients.conf

# Neste arquivo você adiciona os equipamentos que irão enviar a requisição para radius
# no nosso caso é apenas o proprio servidor, mas se você montar mais um servidor pppoe 
# então você vai colocar a autenticação dele aqui.

client 127.0.0.1 {
        secret = SENHA
        shortname = PPPoE01
        nastype = other
}

Arquivo: /etc/freeradius/dictionary.roaringpenguin Crie o arquivo informado a cima com o seguinte conteudo.

# -*- text -*-
##############################################################################
#
#       Roaring Penguin attributes
#
#       $Id: dictionary.roaringpenguin,v 1.3 2007/02/26 09:57:41 aland Exp $
#
##############################################################################

VENDOR          Roaring-Penguin                 10055

BEGIN-VENDOR    Roaring-Penguin

# Upstream speed limit in kb/s
ATTRIBUTE       RP-Upstream-Speed-Limit                 1       integer Roaring-Penguin
 # Downstream speed limit in kb/s
ATTRIBUTE       RP-Downstream-Speed-Limit               2       integer Roaring-Penguin  

# Send a HURL
ATTRIBUTE       RP-HURL                                 3       string Roaring-Penguin

# Send a MOTM
ATTRIBUTE       RP-MOTM                                 4       string Roaring-Penguin

# Maximum sessions per user
ATTRIBUTE       RP-Max-Sessions-Per-User                5       integer Roaring-Penguin

# BANDA ULTRANET
ATTRIBUTE       RP-Up-Down-Stream                       6       string Roaring-Penguin

END-VENDOR      Roaring-Penguin



Adicione a seu arquivo /etc/radiusclient/dictionary as seguintes entradas

ATTRIBUTE       Acct-Interim-Interval                   85      integer
INCLUDE        /etc/radiusclient/dictionary.roaringpenguin

Iniciando o radius em DEBUG

Para testar as configurações do radius utilize:

/etc/init.d/freeradius stop
freeradius -X

se ele tiver com algo errado irá parar a execução no meio do processo de inicialização.

Depois você pode pressionar Ctrl+C para parar e iniciar novamente com /etc/init.d/freeradius start

Iniciando o pppoe-server no boot

Para o pppoe-server vamos criar um arquivo de inicialização.

Arquivo: /etc/init.d/pppoe-server

#!/bin/bash

# IP Base para o PPPoE
BASEIP="XXX.XXX.XXX.XXX"

# IP inicial para os clientes
#CLIENTIPS="XXX.xXX.XXX.XXX"

# Interfaces que o serviço vai rodar
PPPOEIFACE="eth0"

# Timeout para conexaoes
TIMEOUT="300"

# Nome do servidor
NASNAME="PPPoE01"

# Quantidade de conexoes (deve ser um total que voce tenha ips disponivesi0
#MAXCON="250"

# Quantidade maxima de conexoes por MAC
MACSESSION="1"

start(){
        #/usr/sbin/pppoe-server -L $BASEIP -R $CLIENTIPS -I $PPPOEIFACE -C $NASNAME -S $NASNAME -N $MAXCON -x $MACSESSION
        /usr/sbin/pppoe-server -L $BASEIP -I $PPPOEIFACE -C $NASNAME -S $NASNAME -x $MACSESSION
}

stop(){
        PID=$(pidof pppoe-server)
        kill -9 $PID
}

case $1 in 
        start)
                start
        ;;
        stop)
                stop
        ;;
        restart)
                stop
                start
        ;;
        *)
        echo "Utilize stop | start | restart"
        ;;
esac

Altere a permissão para execução

chmod +x /etc/init.d/pppoe-server

Crie o link para inicialização

ln -s /etc/init.d/pppoe-server /etc/rc2.d/pppoe-server

Não esqueça de colocar a interface que voce definiu para iniciar no boot

Exemplo:

 no arquivo interfaces sua interface principal é a eth0 que esta com um ip X, ai voce vai usar a eth1 para o pppoe
 então voce coloca ao fim da configuração da eth0 no arquivo /etc/network/interfaces

 post-up ifconfig eth1 up

Liberando Forward de pacotes

Arquivo: /etc/sysctl.conf

Localize a entrada net.ipv4.ip_forward=1 e remova a # do começo da linha


Implmentado um controle de banda por usuário

O pppoe após fechar a conexão ele executa o script ip-up do ppp, este script permite que você crie dentro do direotrio ip-up.d e ip-down.d script para serem executados, oque faremos nada mais é doque acrescentar um script para que para cada conexão pppoe ele inicie um controle de banda

Crie o arquivo: /etc/ppp/ip-up.d/bandwidth

#!/bin/bash
# Variaveis informadas pelo PPPD
#PPP_IFACE PPP_TTY PPP_SPEED PPP_LOCAL PPP_REMOTE PPP_IPPARAM

# Lendo valores para download e upload informado pelo radius
UPLOAD=$(cat /var/run/radattr.$PPP_IFACE | grep -i RP-Upstream-Speed-Limit | awk '{print $2}')
DOWNLOAD=$(cat /var/run/radattr.$PPP_IFACE | grep -i RP-Downstream-Speed-Limit | awk '{print $2}')

# Definindo banda para download
/sbin/tc qdisc add dev $PPP_IFACE root tbf rate ${DOWNLOAD}kbit latency 10ms burst $[$DOWNLOAD*128]


# Definindo banda para upload
/sbin/tc qdisc add dev $PPP_IFACE handle ffff: ingress 
/sbin/tc filter add dev $PPP_IFACE parent ffff: protocol ip prio 10 u32 match ip src 0.0.0.0/0 police rate ${UPLOAD}kbit burst $[$DOWNLOAD*128] mtu 9k drop flowid :1

Crie o arquivo: /etc/ppp/ip-down.d/bandwidth

#!/bin/bash

/sbin/tc del dev $PPP_IFACE root 


chmod +x /etc/pppt/ip-down.d/bandwidth
chmod +x /etc/pppt/ip-up.d/bandwidth

Criando um Usuario

Execute no mysql os seguintes comandos.

INSERT INTO radcheck VALUES (NULL,'usuario@dominio','Cleartext-Password',':=','s3nh4');
INSERT INTO radcheck VALUES (NULL,'usuario@dominio','Auth-Type',':=','Accept');
INSERT INTO radreply VALUES (NULL,'usuario@dominio','RP-Downstream-Speed-Limit','=','256');
INSERT INTO radreply VALUES (NULL,'usuario@dominio','RP-Upstream-Speed-Limit','=','128');
INSERT INTO radreply VALUES (NULL,'usuario@dominio','Acct-Interim-Interval','=','300');
INSERT INTO radreply VALUES (NULL,'usuario@dominio','Acct-Status-Type','=','Interim-Update');

Com isso você criou um usuário com download de 256 e upload de 128.

Ferramentas pessoais
Inutilidades