Instalação FreeRadius no Debian 11 Bullseye (Extra sqlippool)


Esse tutorial é ideal para provedores que desejam criar seu próprio sistema de autenticação com freeradius, fazendo autenticação do tipo PPPoE, hotspot, Wireless (PSK/EAP) entre outras.

Neste tutorial iremos instalar e configurar o FreeRadius 3.0.x.

REQUISITOS
1 – Debian 11 Bullseye – Instalação limpa
2 – WEB Apache + PHP + MariaDB + phpMyAdmin “LAMP” (Opcional)

Instalação do FreeRadius 3.0.`>21`
Tenha primeiramente o MariaDB instalado (Tutorial LAMP), então crie o banco de dados e usuário quais iremos utilizar para a integração com o Freeradius.

Abra o terminal de comando do MariaDB e crie a base e o usuario chamados de radius e defina a senha para este usuário.

# mariadb -u root -p

Altere SENHA_USER_RADIUS. Você pode gerar uma senha forte e segura em https://senhasegura.remontti.com.br

CREATE DATABASE radius;
GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost' IDENTIFIED BY 'SENHA_USER_RADIUS';
FLUSH PRIVILEGES;
quit;

Instale os pacotes do freeradius

# apt install freeradius freeradius-mysql freeradius-utils

Com o o banco de dados radius criado iremos importar as tabelas padrões do freeradius:

# mariadb -u radius -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
# mariadb -u radius -p radius < /etc/freeradius/3.0/mods-config/sql/ippool/mysql/schema.sql

Após comando será solicitado a senha do usuario radius (SENHA_USER_RADIUS).

Caso deseje logs mais detalhados (recomendo) edite o arquivo /etc/freeradius/3.0/radiusd.conf, mas antes faça um backup do mesmo.

# cp /etc/freeradius/3.0/radiusd.conf /etc/freeradius/3.0/radiusd.conf.orig
# vim /etc/freeradius/3.0/radiusd.conf

Localize as variáveis e altere para yes

[...]
log {
    [...]
        stripped_names = yes
        auth = yes
        auth_badpass = yes
        auth_goodpass = yes
    [...]
}
[...]

Ajustaremos o mod SQL para trabalhar com conexão do tipo mysql, e informamos os dados para conexão com o banco de dados. Arquivo /etc/freeradius/3.0/mods-available/sql.orig

# cp /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-available/sql.orig

Usarei o comando sed para facilitar sua vida 🙂 mas preste atenção nos comandos, se desejar pode editar o arquivo manualmente e alterar as entradas.

# sed -i 's/driver = "rlm_sql_null"/driver = "rlm_sql_mysql"/' /etc/freeradius/3.0/mods-available/sql
# sed -i 's/dialect = "sqlite"/dialect = "mysql"/' /etc/freeradius/3.0/mods-available/sql
# sed -i '/server = "localhost"/s/^#//g' /etc/freeradius/3.0/mods-available/sql
# sed -i '/port = 3306/s/^#//g' /etc/freeradius/3.0/mods-available/sql
# sed -i '/login = "radius"/s/^#//g' /etc/freeradius/3.0/mods-available/sql
# sed -i '/password = "radpass"/s/^#//g' /etc/freeradius/3.0/mods-available/sql
# sed -i '/read_clients = yes/s/^#//g' /etc/freeradius/3.0/mods-available/sql

No próximo comando altere SENHA_USER_RADIUS para a senha de conexão do usuário radius.

# sed -i 's/radpass/SENHA_USER_RADIUS/' /etc/freeradius/3.0/mods-available/sql

Habilite o mod:

# ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/sql

Desativando o TLS do Mysql

# sed -i '84,102 {s/^/##/}' /etc/freeradius/3.0/mods-available/sql
# sed -i 's/disable_tlsv1_1 = yes/disable_tlsv1_1 = no/' /etc/freeradius/3.0/mods-available/eap 
# sed -i 's/disable_tlsv1 = yes/disable_tlsv1 = no/' /etc/freeradius/3.0/mods-available/eap
# sed -i 's/tls_min_version = "1.2"/tls_min_version = "1.0"/' /etc/freeradius/3.0/mods-available/eap

Agora no arquivo /etc/freeradius/3.0/sites-enabled/default vamos comentar alguns componentes que não nos interessa (Se você entrar no arquivo e editar manualmente ele está todo comentado, auto explicativo.) e incluir alguns componentes como o SQL.

# cp /etc/freeradius/3.0/sites-available/default  /etc/freeradius/3.0/sites-available/default.org
# sed -i '/digest/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/suffix/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/files/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/ldap/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/exec/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/detail/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/unix/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/attr_filter.accounting_response/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i 's/-sql/sql/' /etc/freeradius/3.0/sites-available/default
# sed -i '689 s/# *//' /etc/freeradius/3.0/sites-available/default
# sed -i '854,874 {s/^/##/}' /etc/freeradius/3.0/sites-available/default

Habilitando o mod sqlippool
Como o mod sqlippool você poderá ter sua pool de IPs direto no banco de dados.

# ln -s /etc/freeradius/3.0/mods-available/sqlippool /etc/freeradius/3.0/mods-enabled/sqlippool

Vou alterar (Descomentando e comentado) a chave pool_key = "%{NAS-Port}" por "%{Calling-Station-Id}", desta forma a chave será o MAC, e "allow_duplicates = no" para não termos duplicidades de IPs. Mais adiante iremos também ajustar o allocate_clear.

# sed -i '74 {s/^/#/}' /etc/freeradius/3.0/mods-available/sqlippool
# sed -i '75 s/# *//' /etc/freeradius/3.0/mods-available/sqlippool
# sed -i '67 s/# *//' /etc/freeradius/3.0/mods-available/sqlippool

Precisamos adicionar o mod sqlippool no nosso arquivo default, você acrescentará sqlippool em accounting {...} e post-auth {...} logo abaixo de sql:

# sed -i '642i\    sqlippool' /etc/freeradius/3.0/sites-available/default
# sed -i '734i\    sqlippool' /etc/freeradius/3.0/sites-available/default

Verifique com o comando abaixo se a saída do seu arquivo ficou assim:

# cat /etc/freeradius/3.0/sites-enabled/default |grep -v "#" |awk 'NF>0'
server default {
listen {
        type = auth
        ipaddr = *
        port = 0
        limit {
              max_connections = 16
              lifetime = 0
              idle_timeout = 30
        }
}
listen {
        ipaddr = *
        port = 0
        type = acct
        limit {
        }
}
listen {
        type = auth
        port = 0
        limit {
              max_connections = 16
              lifetime = 0
              idle_timeout = 30
        }
}
listen {
        ipv6addr = ::
        port = 0
        type = acct
        limit {
        }
}
authorize {
        filter_username
        preprocess
        chap
        mschap
        eap {
                ok = return
        }
        sql
        expiration
        logintime
        pap
}
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        mschap
        eap
}
preacct {
        preprocess
        acct_unique
}
accounting {
    sqlippool
        sql
}
session {
        sql
}
post-auth {
        if (session-state:User-Name && reply:User-Name && request:User-Name && (reply:User-Name == request:User-Name)) {
                update reply {
                        &User-Name !* ANY
                }
        }
        update {
                &reply: += &session-state:
        }
    sqlippool
        sql
        remove_reply_message_if_eap
}
pre-proxy {
}
post-proxy {
        eap
}
}

Faremos os ajustes no arquivo inner-tunnel

# cp /etc/freeradius/3.0/sites-available/inner-tunnel /etc/freeradius/3.0/sites-available/inner-tunnel.org
# sed -i '/suffix/s/^/#/g' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i '/files/s/^/#/g' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i '/-ldap/s/^/#/g' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i 's/-sql/sql/' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i 's/radutmp/#radutmp/' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i '266 s/# *//' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i '336,361 {s/^/##/}' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i '370,381 {s/^/##/}' /etc/freeradius/3.0/sites-available/inner-tunnel

Verifique com o comando abaixo se a saída do seu arquivo ficou assim:

# cat /etc/freeradius/3.0/sites-enabled/inner-tunnel |grep -v "#" |awk 'NF>0'
server inner-tunnel {
listen {
       ipaddr = 127.0.0.1
       port = 18120
       type = auth
}
authorize {
        filter_username
        chap
        mschap
        update control {
                &Proxy-To-Realm := LOCAL
        }
        eap {
                ok = return
        }
        sql
        expiration
        logintime
        pap
}
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        mschap
        eap
}
session {
        sql
}
post-auth {
        sql
}
pre-proxy {
}
post-proxy {
        eap
}

Uma alteração que acho válida é para que para cada alocação de IP ela seja randômica, isso pode solucionar alguns problemas como o balanceamento dos prefixo no seu BGP, ou daqueles clientes que jogam online, fazem download e até mesmo que estão sofrendo algum ataque. Assim ao reiniciar seu equipamento o mesmo irá receber um novo endereço IP. Para que funcione desta forma iremos apenas comentar algumas linhas e descomentar outras, pois em /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf variável allocate_find já vem com o modelo pronto 🙂

Comentar:

# sed -i '41,53 {s/^/##/}' /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf
##allocate_find = "\
##  SELECT framedipaddress FROM ${ippool_table} \
##  WHERE pool_name = '%{control:${pool_name}}' \
##  AND ( \
##      expiry_time < NOW() OR expiry_time IS NULL OR expiry_time = 0 \
##      OR ( nasipaddress = '%{NAS-IP-Address}' AND pool_key = '${pool_key}' ) \
##  ) \
##  ORDER BY \
##      (username <> '%{User-Name}'), \
##      (callingstationid <> '%{Calling-Station-Id}'), \
##      expiry_time \
##  LIMIT 1 \
##  FOR UPDATE"

Descomentar:

# sed -i '74,81 s/# *//' /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf
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"

Como alteramos a pool_key para Calling-Station-Id em /etc/freeradius/3.0/mods-enabled/sqlippool vamos ajustar o allocate_clear para quando for liberar um IP use a chave pool_key e não a NAS, caso contrário ira liberar IPs indevidos que estão sendo utilizado por usuários ativos e assim evitamos que surjam IPs duplicados, para isso:

Comentar:

# sed -i '26,35 {s/^/##/}' /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf
##allocate_clear = "\
##      UPDATE ${ippool_table} \
##      SET \
##              nasipaddress = '', \
##              pool_key = 0, \
##              callingstationid = '', \
##              username = '', \
##              expiry_time = NULL \
##      WHERE expiry_time <= NOW() - INTERVAL 1 SECOND \
##      AND nasipaddress = '%{%{Nas-IP-Address}:-%{Nas-IPv6-Address}}'"

Descomentar

# sed -i '10,18 s/# *//' /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf
allocate_clear = "\
        UPDATE ${ippool_table} \
        SET \
                nasipaddress = '', \
                pool_key = 0, \
                callingstationid = '', \
                username = '', \
                expiry_time = NULL \
        WHERE pool_key = '${pool_key}'"

É interessante você ajustar o tempo lease_duration = 1200 no arquivo /etc/freeradius/3.0/mods-available/sqlippool talvez para um menor intervalo,porém sempre respeitando que o Acct-Interim-Interval seja um tempo menor, para não ter duplicidades de ips. Falo sobre isso no tutorial https://blog.remontti.com.br/4085 recomendo a leitura!

Caso você tenha uma alta demanda de requisições você pode fazer algumas alterações no radiusd.conf.
Altere conforme sua necessidade, e hardware de seu servidor. Vale lembrar que fazendo essas alterações pode ser necessário alterar o limite de conexões ao MariaDB. Não abuse nessas configurações recomendo ler a documentação.

# vim /etc/freeradius/3.0/radiusd.conf

Você pode começar dobrando os valores, ex.:

[...]
thread pool {
        start_servers = 10
        max_servers = 64
        min_spare_servers = 6
        max_spare_servers = 20
        max_queue_size = 131072
        max_requests_per_server = 0
        auto_limit_acct = no
}
[...]

Finalizando

Habilite o freeradius para começar junto com a inicialização do sistema

# systemctl enable freeradius

Pare o serviço e inicie em modo debug

# systemctl stop freeradius
# freeradius -X

Se nenhum erro acontecer uma mensagem com: Ready to process requests aparecer parabéns seu freeradius está funcionando. Através do comando debug você consegue acompanhar as ações que o freeradius irá fazer, ótimo para estudos e entendimento. Para encerrar o modo debig use Crtl+c, e então inicie o serviço de forma normal.

# systemctl start freeradius

Para integrar seu servidor freeradius para fazer autenticações PPPoE, Hotspot, Wireless PSK/EAP entre outras, você precisa aprender mais sobre as tabelas do banco de dados e quais atributos usar em cada situação sempre pensando na segurança. Você pode acessar https://blog.remontti.com.br/4085 onde irá encontra alguns modelos de autenticação que atente praticamente todos os cenários de provedores.

Gostou? Quer me ajudar? 🙂

Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!

Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.

Participe do canal no telegram para ficar atualizado sempre que publicar um novo tutorial.

Abraço!

Resolução de problema:

Se seu login conter @ no entanto não terminar como domínio padrão exemplo user@dom.xxx.yy user@dom.xxx, e sim apenas user@dom edite:

# vim /etc/freeradius/3.0/policy.d/filter

Altere para accept o seguinte filtro:

        if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/))  {
            update request {
                &Module-Failure-Message += 'Rejected: Realm does not have at least one dot separator'
            }
            #reject
            accept
        }

Fonte:
https://wiki.freeradius.org/guide/SQL-HOWTO
https://wiki.freeradius.org/modules/Rlm_sql
https://wiki.freeradius.org/modules/Rlm_sqlippool

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

4 Resultados

  1. victor disse:

    Job for freeradius.service failed because the control process exited with error code.
    See “systemctl status freeradius.service” and “journalctl -xeu freeradius.service” for details.

    alguem sabe me ajudar

  2. Cara você está de parabéns, seus tutoriais tem me ajudado muito!

  3. iManjate disse:

    excelente tutorial e rico em conteudo.
    fiz tudo com sucesso, apois isso criei um usuario na base de dados na tabela radcheck, porem quando faco o teste apartir do comando radtest o resultado e o seguinte:

    radtest tt tt localhost 0 123456789
    Sent Access-Request Id 250 from 0.0.0.0:43552 to 127.0.0.1:1812 length 72
    User-Name = “tt”
    User-Password = “tt”
    NAS-IP-Address = 127.0.0.1
    NAS-Port = 0
    Message-Authenticator = 0x00
    Cleartext-Password = “tt”
    Sent Access-Request Id 250 from 0.0.0.0:43552 to 127.0.0.1:1812 length 72
    User-Name = “tt”
    User-Password = “tt”
    NAS-IP-Address = 127.0.0.1
    NAS-Port = 0
    Message-Authenticator = 0x00
    Cleartext-Password = “tt”
    Sent Access-Request Id 250 from 0.0.0.0:43552 to 127.0.0.1:1812 length 72
    User-Name = “tt”
    User-Password = “tt”
    NAS-IP-Address = 127.0.0.1
    NAS-Port = 0
    Message-Authenticator = 0x00
    Cleartext-Password = “tt”
    (0) No reply from server for ID 250 socket 3

    Qual deve ser o problema?

  4. Joel Chaves disse:

    Para quando ajudar a configurar o SSH com SRA para tornar mais seguro o SSH?

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *