Instalação FreeRadius no Debian 12 Bookworm (Extra sqlippool)


Este tutorial é especialmente útil para provedores de serviços que desejam estabelecer seu próprio sistema de autenticação usando o FreeRADIUS. Ele abrange uma ampla gama de autenticação, incluindo PPPoE, hotspot, e autenticação sem fio (PSK/EAP), entre outras opções.

REQUISITOS
1 – Debian 12 Bookworm – Instalação limpa

Acesse seu bash e vire root com o comando su – para evitar comandos “que não existem”, e antes de mais nada tenha seu repositório atualizado.

# su -
# apt update
# apt upgrade

Se o seu sistema Debian acabou de ser instalado e está em sua configuração inicial, aqui está o meu comando secreto que eu uso em todos os servidores após a instalação. Esse comando tem o objetivo de aprimorar a produtividade do shell (bash) no Debian e instalar alguns pacotes essenciais. É basicamente um script que inclui a maior parte das etapas descritas no tutorial: Como melhorar a produtividade no seu Debian após instalação

# apt install wget -y; wget remontti.com.br/debian; bash debian
# su - 

O serviço web não é necessário, mas normalmente juntamente do Freeradius acabo instalando um phpmyadmin por exemplo para poder fazer uma administração fácil do banco de dados entre outros. Se desejar pular esta etapa ela é opcional.

Instalação do Serviço Web+PHP

Vamos instalar os pacotes necessários

# apt install apache2 apache2-utils libapache2-mod-php\
  php php-mysql php-cli php-pear php-gmp php-gd php-bcmath\
  php-mbstring php-curl php-xml php-zip -y

Ajuste fino, quiser saber mais clique aqui.

# a2enmod rewrite ; a2enmod headers
# sed -i 's/ServerTokens OS/ServerTokens Prod/' /etc/apache2/conf-available/security.conf
# sed -i 's/ServerSignature On/ServerSignature Off/' /etc/apache2/conf-available/security.conf
# systemctl restart apache2

Instalação do MariaDB & phpMyAdmin

# apt install mariadb-server mariadb-client phpmyadmin

Por padrão o pacote MaraiDB no Debian usa unix_socket para autenticar o login do usuário, o que basicamente significa que você pode usar o nome de usuário e a senha do sistema operacional para efetuar login no console do MariaDB. Assim, você pode logar diretamente sem fornecer a senha root do MariaDB. Mais a frente vou ensinar como definir uma senha, não farei agora pois se você alterar nesse momento ao instalar o phpMyAdmin terá um erro.

Selecione Apache2

Responda Sim

Informe a senha para o banco de dados do phpmyadmin. http://senhasegura.remontti.com.br/

Repita a senha

Para acessar o phpmyadmin:http://[SERVER_IP]/phpmyadmin/

Para aumentar a seguraça vamos definir uma senha para o usuário root do MariDB, não esqueça de alterar ALTERE_3ST4_SENHA pela sua senha.

# mariadb -u root
USE mysql;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'ALTERE_3ST4_SENHA';
FLUSH PRIVILEGES;
EXIT;

Apague seus rastros, em /root/.mysql_history temos um histórico com todos os comandos dado no terminal do MariaDB, então não é legal deixar lá em texto puro a senha que setamos!

# > /root/.mysql_history

Instalação do FreeRadius

Abra o terminal de comando do MariaDB e crie a base e o usuário 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 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

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

Vamos fazer backups primeiramente dos arquivos que iremos alterar.

# cp /etc/freeradius/3.0/radiusd.conf /etc/freeradius/3.0/radiusd.conf.orig
# cp /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-available/sql.orig
# cp /etc/freeradius/3.0/mods-available/eap /etc/freeradius/3.0/mods-available/eap.orig
# cp /etc/freeradius/3.0/sites-available/default  /etc/freeradius/3.0/sites-available/default.org
# cp /etc/freeradius/3.0/mods-available/sqlippool /etc/freeradius/3.0/mods-available/sqlippool.orig

Irei abusar do comando sed de agora em diante com o intuito de entrar nos arquivos para editar, se não souber o que cada comando representa recomendo utilizar o chat GPT, cola lá e pergunta que ele explica rsrs (estou ficando velho)

# sed -i '/^\s*stripped_names = no/s/^\(\s*stripped_names =\) no/\1 yes/g' /etc/freeradius/3.0/radiusd.conf
# sed -i '/^\s*auth = no/s/^\(\s*auth =\) no/\1 yes/g' /etc/freeradius/3.0/radiusd.conf
# sed -i '/^\s*auth_badpass = no/s/^\(\s*auth_badpass =\) no/\1 yes/g' /etc/freeradius/3.0/radiusd.conf
# sed -i '/^\s*auth_goodpass = no/s/^\(\s*auth_goodpass =\) no/\1 yes/g' /etc/freeradius/3.0/radiusd.conf

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

# 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 os mods sql e sqlippool:

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

Desativando o TLS do Mysql

# sed -i '84,102 {s/^/##/}' /etc/freeradius/3.0/mods-available/sql
# sed -i 's/disable_tlsv1_2 = yes/disable_tlsv1_2 = no/' /etc/freeradius/3.0/mods-available/eap 
# 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 '/disable_tlsv1/s/^#//g' /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.

# sed -i '/^[[:space:]]*digest/s/^/## /' /etc/freeradius/3.0/sites-available/default
# sed -i '/^[[:space:]]*suffix/s/^/## /' /etc/freeradius/3.0/sites-available/default
# sed -i '/^[[:space:]]*files/s/^/## /' /etc/freeradius/3.0/sites-available/default
# sed -i '/^[[:space:]]*-ldap/s/^/## /' /etc/freeradius/3.0/sites-available/default
# sed -i '/^[[:space:]]*exec/s/^/## /' /etc/freeradius/3.0/sites-available/default
# sed -i '/^[[:space:]]*detail/s/^/## /' /etc/freeradius/3.0/sites-available/default
# sed -i '/^[[:space:]]*unix/s/^/## /' /etc/freeradius/3.0/sites-available/default
# sed -i '/^[[:space:]]*attr_filter.accounting_response/s/^/## /' /etc/freeradius/3.0/sites-available/default
# sed -i '/^[[:space:]]*-ldap/s/^/## /' /etc/freeradius/3.0/sites-available/default
# sed -i 's/-sql/sql/' /etc/freeradius/3.0/sites-available/default
# sed -i '741 s/# *//' /etc/freeradius/3.0/sites-available/default
# sed -i '958,970 {s/^/##/}' /etc/freeradius/3.0/sites-available/default
# sed -i '76 {s/^/#/}' /etc/freeradius/3.0/mods-available/sqlippool
# sed -i '77 s/# *//' /etc/freeradius/3.0/mods-available/sqlippool
# sed -i '66 s/# *//' /etc/freeradius/3.0/mods-available/sqlippool
# sed -i '/^[[:space:]]*#.*sqlippool/s/^#//' /etc/freeradius/3.0/sites-available/default

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 '/^[[:space:]]*suffix/s/^/## /' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i '/^[[:space:]]*files/s/^/## /' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i '/^[[:space:]]*-ldap/s/^/## /' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i 's/-sql/sql/' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i '/^[[:space:]]*radutmp/s/^/## /' /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 dos seus arquivos 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
	Autz-Type New-TLS-Connection {
		  ok
	}
}
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
	Post-Auth-Type Challenge {
	}
	Post-Auth-Type Client-Lost {
	}
	if (EAP-Key-Name && &reply:EAP-Session-Id) {
		update reply {
			&EAP-Key-Name := &reply:EAP-Session-Id
		}
	}
}
pre-proxy {
}
post-proxy {
	eap
}
}
# 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
}

SQLIPPOOL

Para muitos o o maior pesadelo 👻 DUPLICIDADE DE IPs 👻
No Debian 12 temos a versão 3.2.1 do freeradius sendo rodada, nessa versão alguma melhorias já foram aplicadas, mas eu ainda acho falha para maioria dos IPs, então vou deixar aqui algumas alterações que tenho aplicado para uma realidade provedores que acredito que irá atender sem dores de cabeça.

Importe o banco de dados e aplique as regras de procedure.

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

Crie uma cópia do arquivo original, nunca se saber quando iremos precisar.

# cp /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf.orig

Para debugs e até mesmo algum script que visa buscar por falhas ou entendimento irei criar a coluna action na tabela radippool, nela estarei gravando qual a ação/query que ele executou do queries.conf.

# mysql -u radius -p -D radius -e 'ALTER TABLE radippool ADD COLUMN \`action\` VARCHAR(20) NULL AFTER pool_key;'

Vamos pagar tudo que tem em queries.conf e criar todas as entradas.

# > /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf
# vim /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf

Deixei nos comentários o macimo de explicação

#
# TODOS OS IPS NA RADIPPOOL. AS POLÍTICAS SERÃO AS SEGUINTES:
# 
#  1 - Quando um novo login tentar selecionar um endereço IP pela primeira vez na "radippool", o sistema verificará 
#      se esse login já utilizou um endereço com Pool-Name que esta solicitado.
#  2 - Se o login não tiver usado nenhum endereço da Pool-Name solicitada, será atribuído aleatoriamente um novo endereço, 
#      desde que o "expiry_time" seja menor que a data e hora atual.
#  3 - Se todos os endereços IPs dentro da Pool-Name solicitada já sendo utilizado ou estiverem em estado aguardando ("waiting"), 
#      a query "allocate_find" irá verificando se o "expiry_time" é menor que a data e hora atual e assim utilizando um dos IPs 
#      em "waiting" com o "expiry_time" mais antigo. Isso é comum por exemplo quando um cliente cancela sua assinatura.
#  3 - Se todos os endereços IPs dentro da Pool-Name solicitada já estiverem sendo utilizados ou estiverem em estado de espera ("waiting"), 
#      nossa query "allocate_find" irá verificar se o "expiry_time" é menor que a data e hora atual e, assim, utilizará um dos IPs
#      em estado de espera com o "expiry_time" mais antigo. Isso é comum, por exemplo, quando um cliente cancela sua assinatura.
#  4 - Se todos os IPs da Pool-Name estiverem em uso e o "expiry_time" for maior que a data atual informada pelo lease_duration, 
#      significa que essa pool-name acabou, nesse a query "allocate_find" buscará na Pool-Name definida na variável "pool_next". 
#      Por exemplo, ao esgotar os IPs da Pool-Name "publicos", serão entregues IPs da Pool-Name "cgant".
#  5 - Se a Pool-Name solicitada e a Pool-Name definida em "pool_next" não tiverem mais endereços disponíveis, 
#      ou não forem encontradas, a responsabilidade de entregar os IPs ficará a cargo do roteador.
#
#  OBS: Escolher um IP randomicamente é mais interessante para balanceamento de carga.
#
#  Autor: Rudimar Remontti 
#


#  Usar SKIP LOCKED acelera as consultas de seleção
#  No entanto, requer MySQL >= 8.0.1 ou MariaDB >= 10.6.
#
#skip_locked = ""
skip_locked = "SKIP LOCKED"


#
#  Por padrão, ao utilizar todos os endereços IPs de uma pool, 
#  o módulo sqlippool do FreeRADIUS permite que seu roteador (NAS) 
#  distribua a pool configurada por ele.
#  Porém estarei aqui fazendo uma alteração na função "allocate_find"
#
pool_next = "cgnat"


#
#  Alocar um endereço IP já utilizado.
#
#  Se um usuário já utilizou um determinado IP, entregue 
#  para ele o mesmo endereco com "expiry_time" mais recente.
#
allocate_existing = "\
	SELECT framedipaddress FROM ${ippool_table} \
	WHERE pool_name = '%{control:${pool_name}}' \
	AND username = '%{User-Name}' \
	ORDER BY expiry_time DESC \
	LIMIT 1 \
	FOR UPDATE ${skip_locked}"


#
# Encontre um endereço IP livre no Pool-Name solicitado 
# ou no Pool-Name especificado na variável pool_next. 
# A explicação está no início deste arquivo.
#
#  Nota: Isso pode se tonar lento se você tiver mais de 30 mil IPs livres, 
#        é rerecomendo fazer um tuning no seu MariaDB/MySQL.
#
allocate_find = "\
	SELECT framedipaddress \
	FROM ${ippool_table} \
	WHERE ( \
	    CASE \
	        WHEN ( \
	            SELECT COUNT(framedipaddress) \
	            FROM radippool \
	            WHERE pool_name = '%{control:Pool-Name}' AND expiry_time < NOW() \
	            LIMIT 1 \
	        ) > 0 THEN \
	            (pool_name = '%{control:Pool-Name}' AND expiry_time < NOW()) \
	        ELSE \
	            CASE \
	                WHEN ( \
	                    SELECT COUNT(framedipaddress) \
	                    FROM radippool \
	                    WHERE pool_name = '${pool_next}' AND username = '%{User-Name}' \
	                    LIMIT 1 \
	                ) > 0 THEN \
	                    (pool_name = '${pool_next}' AND username = '%{User-Name}') \
	                ELSE \
	                    (pool_name = '${pool_next}' AND expiry_time < NOW()) \
	            END \
	    END \
	) \
	ORDER BY expiry_time ASC, RAND() \
	LIMIT 1 \
	FOR UPDATE ${skip_locked}"

#
#  Se um IP não puder ser alocado, verifique se o pool existe ou não. 
#  Isso permite que o módulo diferencie entre um pool cheio e nenhum pool.
#  Nota: Se você não estiver executando módulos de pool redundantes, esta consulta pode 
#  ser comentada para evitar executar esta consulta toda vez que um IP não for alocado.
#
pool_check = "\
	SELECT id \
	FROM ${ippool_table} \
	WHERE pool_name='%{control:${pool_name}}' \
	LIMIT 1"

#
#  Atualização dos IPs já alocado.
#
allocate_update = "\
	UPDATE ${ippool_table} \
	SET \
		nasipaddress = '%{NAS-IP-Address}', pool_key = '${pool_key}', \
		callingstationid = '%{Calling-Station-Id}', \
		username = '%{User-Name}', expiry_time = NOW() + INTERVAL ${lease_duration} SECOND, \
		action = 'allocate_update' \
	WHERE framedipaddress = '%I'"

#
#  Esta série de consultas libera um número de IP quando um registro de INÍCIO de contabilidade chega.
#
start_update = "\
	UPDATE ${ippool_table} \
	SET \
		expiry_time = NOW() + INTERVAL ${lease_duration} SECOND, \
		action = 'start_update' \
	WHERE nasipaddress = '%{NAS-IP-Address}' \
	AND pool_key = '${pool_key}' \
	AND username = '%{User-Name}' \
	AND callingstationid = '%{Calling-Station-Id}' \
	AND framedipaddress = '%{${attribute_name}}'"

#
#  Essa consulta expira um número de IP quando um registro de PARADA de contabilidade chega.
#
stop_clear = "\
	UPDATE ${ippool_table} \
	SET \
	    nasipaddress = '', \
	    pool_key = 'waiting', \
	    callingstationid = '', \
		expiry_time = NOW() - INTERVAL 2 SECOND, \
		action = 'stop_clear' \
	WHERE nasipaddress = '%{%{Nas-IP-Address}:-%{Nas-IPv6-Address}}' \
	AND pool_key = '${pool_key}' \
	AND username = '%{User-Name}' \
	AND callingstationid = '%{Calling-Station-Id}' \
	AND framedipaddress = '%{${attribute_name}}'"

#
#  Atualização do IP quando está em utilização, a atualização é feita 
#  a cada x tempo (interim-update/Acct-Interim-Interval) aumenta o tempo definido em "lease_duration"
#
alive_update = "\
	UPDATE ${ippool_table} \
	SET \
		expiry_time = NOW() + INTERVAL ${lease_duration} SECOND, \
		action = 'alive_update' \
	WHERE nasipaddress = '%{%{Nas-IP-Address}:-%{Nas-IPv6-Address}}' \
	AND pool_key = '${pool_key}' \
	AND username = '%{User-Name}' \
	AND callingstationid = '%{Calling-Station-Id}' \
	AND framedipaddress = '%{${attribute_name}}'"


#
#  Libera todos os endereços IP alocados a um NAS quando este é ligado ou reiniciado. 
#  Exemplo que uma falha de energia.
#  
on_clear = "\
	UPDATE ${ippool_table} \
	SET \
		expiry_time = NOW() + INTERVAL ${lease_duration} SECOND, \
		action = 'on_clear' \
	WHERE nasipaddress = '%{%{Nas-IP-Address}:-%{Nas-IPv6-Address}}'"


#
#  Libera todos os endereços IP alocados a um NAS quando este é desligado ou fica offline.
#
off_clear = "\
	UPDATE ${ippool_table} \
	SET \
		expiry_time = NOW(), \
		action = 'off_clear' \
	WHERE nasipaddress = '%{%{Nas-IP-Address}:-%{Nas-IPv6-Address}}'"

É interessante você ajustar o tempo lease_duration = 3600 que por padrão é de 1h no arquivo /etc/freeradius/3.0/mods-available/sqlippool, para mim obtive resultados melhores com 30min, porém sempre respeitando o tempo de Acct-Interim-Interval que deve ser um tempo menor, entre 5 a 10 minutos, para evitar duplicidades de IPs.
Falo sobre isso no tutorial https://blog.remontti.com.br/4085 recomendo a leitura!

# sed -i 's/lease_duration = 3600/lease_duration = 1200/' /etc/freeradius/3.0/mods-available/sqlippool
# systemctl  restart freeradius

Caso você tenha uma alta demanda de requisições você deve 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
}
[...]

Em grande escalas é importante que você também realize um tuning no MariaDB. Recomendo:
- https://github.com/major/MySQLTuner-perl
- https://github.com/BMDan/tuning-primer.sh

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

2 Resultados

  1. Thiago Lima disse:

    Fala, blz?
    Tem alguma versão ensinando instalar com PostgreSQL?

    Vlw

  2. Seu blog me salva há tempos! Obrigado por compartilhar seu conhecimento!

    Eu estou começando a usar o freeRADIUS em um projeto pessoal de hotspot, conseguir fazer funcionar, mas ai estou tentando implementar o TLS na comunicação do Mikrotik com o freeRADIUS, mas não estou tendo sucesso. Ele consegue fazer as checagens do certificados mas não está autenticando o usuário no hotspot. Se eu desabilito o TLS, funciona de boa.

    A documentação do freeRADIUS é muito difícil e ruim, nem me atrevo a perguntar nada na mail list pois o Alan DeKok é muito rude com a galera. Acho que ele está tentando tomar o lugar do Torvalds! Hahaha

Deixe um comentário

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