Vou dar minha contribuição tmb
uso hotspot com ip fixo e radius...
amarro o MAC x Login X IP sem problemas
vamos lá...
1º
Configurar o mysql na Tabela radgroupreply para acessar o arquivo perl:
------------------------------------------------------------------------------
GroupName: nome_do_grupo_dos_seus_usuários (ex: radio)
Attribute: Exec-Program-Wait
op: ==
Value: /etc/raddb/lib3.pl %u %i %C %n %{request:Framed-IP-Address}
PS.: acima temos o caminho do arquivo...é a unica coisa q tem q mudar
--------------------------------------------------------------------------------------------
2º
criar o arquivo lib3.pl (ou o nome que vcs derem acima no caminho passado)
#touch /etc/raddb/lib3.pl
3º
editar o arquivo criado acima
#pico /etc/raddb/lib3.pl (o texto abaixo vai dentro desse arquivo)
---------------------- recorte aqui --------------------------
#!/usr/bin/perl
use POSIX qw(strftime);
use Unix::Syslog qw(:macros :subs);
use DBI;
my $servidor = "localhost";
my $servidor_porta = "3306";
my $servidor_usuario = "usuario_BD";
my $servidor_senha = "senha_BD";
my $servidor_db = "medianeira";
my $servidor_db_radius = "radius";
my $tabela_login = "radcheck";
my $tabela_cont = "contratos";
my $tabela_multi = "contratos_users_radius";
my $tabela_mac = "contratos_macs";
my $tabela_mac_intruso = "contratos_macs_erros";
my $tabela_ip_intruso = "contratos_ips_erros";
my $codigo_erro = "1";
my $codigo_erro_mac = "1";
my $codigo_erro_ip = "1";
sub erro_permitido()
{
openlog(Pemitidos, LOG_PID, LOG_INFO);
syslog(LOG_INFO, "Login=$ARGV[0] MAC=$ARGV[1] IP=$ARGV[4]\n");
closelog;
}
sub erro_bloqueado()
{
openlog(Bloqueados, LOG_PID, LOG_INFO);
syslog(LOG_INFO, "Login=$ARGV[0] MAC PC=$ARGV[1] IP PC=$ARGV[4]\n");
closelog;
}
if (($ARGV[2] eq 'Mikrotik132') || ($ARGV[2] eq 'Mikrotik145') || ($ARGV[2] eq 'Mikrotik194'))
{
# Conecta banco medianeira para verificar mac na tabela contratos_macs
$dbh = DBI->connect("DBI:mysql:database=$servidor_db;host=$servidor;port=$servidor_porta", $servidor_usuario, $servidor_senha);
$pega_mac = $dbh->prepare("SELECT mac FROM $tabela_mac WHERE UserName=\"$ARGV[0]\" LIMIT 1");
$pega_mac->execute;
if(@row = $pega_mac->fetchrow_array)
{
$pega_mac->finish;
$dbh->disconnect;
if ($row[0] =~ /$ARGV[1]/)
{
$codigo_erro_mac = "0";
# Conecta banco medianeira para verificar ip na tabela contratos
$dbh = DBI->connect("DBI:mysql:database=$servidor_db;host=$servidor;port=$servidor_porta", $servidor_usuario, $servidor_senha);
$pega_ip = $dbh->prepare("SELECT c.ip,c.id FROM $tabela_cont c,$tabela_multi m WHERE ((c.login_radio=\"$ARGV[0]\") OR (c.multi_users=1 AND m.login_radius=\"$ARGV[0]\" AND m.idContrato=c.id)) LIMIT 1");
$pega_ip->execute;
if(@row = $pega_ip->fetchrow_array)
{
$pega_ip->finish;
$dbh->disconnect;
# Comparar ip passado com o do banco
if ($row[0] =~ /$ARGV[4]/)
{
$codigo_erro_ip = "0";
}
else
{
$ip_selecionado = $row[0];
if($ip_selecionado == "0" || $ip_selecionado == "")
{
# Conecta banco medianeira e insere ip na tabela de erros
$dbh = DBI->connect("DBI:mysql:database=$servidor_db;host=$servidor;port=$servidor_porta", $servidor_usuario, $servidor_senha);
$grava = $dbh->prepare("UPDATE $tabela_cont SET ip=\"$ARGV[4]\" WHERE id=\"$row[1]\" ");
$grava->execute;
$grava->finish;
$dbh->disconnect;
$codigo_erro_ip = "0";
}
else
{
# Conecta banco medianeira e insere ip na tabela de erros
$dbh = DBI->connect("DBI:mysql:database=$servidor_db;host=$servidor;port=$servidor_porta", $servidor_usuario, $servidor_senha);
$grava = $dbh->prepare("INSERT INTO $tabela_ip_intruso (UserName,ip_pc,ip_banco,data) VALUES (\"$ARGV[0]\",\"$ARGV[4]\",\"$ip_selecionado\",SYSDATE())");
$grava->execute;
$grava->finish;
$dbh->disconnect;
$codigo_erro_ip = "1";
}
}
}
}
else
{
$mac_selecionado = $row[0];
# Conecta banco medianeira e insere mac na tabela de erros
$dbh = DBI->connect("DBI:mysql:database=$servidor_db;host=$servidor;port=$servidor_porta", $servidor_usuario, $servidor_senha);
$grava = $dbh->prepare("INSERT INTO $tabela_mac_intruso (UserName,mac_pc,mac_banco,data) VALUES (\"$ARGV[0]\",\"$ARGV[1]\",\"$mac_selecionado\",SYSDATE())");
$grava->execute;
$grava->finish;
$dbh->disconnect;
$codigo_erro_mac = "1";
}
}
else
{
$pega_mac->finish;
$dbh->disconnect;
# Conecta banco medianeira para verificar mac na tabela contratos_macs
$dbh = DBI->connect("DBI:mysql:database=$servidor_db;host=$servidor;port=$servidor_porta", $servidor_usuario, $servidor_senha);
$grava = $dbh->prepare("INSERT INTO $tabela_mac VALUES (\"\",\"$ARGV[0]\",\"$ARGV[1]\")");
$grava->execute;
$grava->finish;
$dbh->disconnect;
#Possibilidade se inserção ou verificação de IP
$codigo_erro_mac = "0";
$codigo_erro_ip = "0";
}
}
if ($codigo_erro_mac != "0" || $codigo_erro_ip != "0")
{
$mensagem_erro = "MAC ou IP inválidos";
erro_bloqueado();
}
else
{
erro_permitido();
}
if ($codigo_erro_mac == "0" && $codigo_erro_ip == "0")
{
$codigo_erro = "0";
}
exit($codigo_erro);
--------------------- recorte aqui --------------------------
my $tabela_login = "radcheck";
-> padrão dos radius
my $tabela_cont = "contratos";´
-> contem vários campos com dados, os mais importantes são:
-----> login_radio
-----> ip
my $tabela_multi = "contratos_users_radius";
-> campos:
----->id
----->idContrato
----->login_radius
----->senha_radius
my $tabela_mac = "contratos_macs";
-> campos:
----->id
----->UserName
----->mac - formato: xx:xx:xx:xx:xx:xx
my $tabela_mac_intruso = "contratos_macs_erros";
-> campos:
----->id
----->UserName
----->mac_pc
----->mac_banco
----->data
my $tabela_ip_intruso = "contratos_ips_erros";
-> campos:
----->id
----->UserName
----->ip_pc
----->ip_banco
----->data
Algumas observações:
- Se o login ex: testelogin, quando for logar nao for localizado um mac, na tabela 'contratos_mac', o script cadastra automaticamente no banco o mac, pois supoe-se que o primeiro login é feito no cliente com a prescença do técnico do provedor (pelo menos aqui é assim, fica a critério de cada).
- A verificação de login X mac X ip, só é feita após o login ter ocorrido, entao nao estamos verificando o login e senha, q está no banco radius, provável na tabela radcheck, supomos que isto já esteja sendo usado e em funcionamento.
- Bug: Se um ip fizer login e vier pro script pra verificação, e for ele ex: 192.168.1.111, e no banco de dados estiver 192.168.1.1, é provável que deixa passar, (pois ele usa if ($row[0] =~ /$ARGV[4]/) que é como se fosse um like do mysql, mas em perl) é um erro q já estou vendo pra trocar, fica a critério de cada um mexer no script, e tmb por conta próprio o uso ou nao do script, nao me responsabilizo por nda...
- existe tmb uma forma de amarrar via banco de dados, preferi usar script pois tenho logs de tudo, no syslog do linux e tmb no banco de dados.
Existe uma forma de amarrar tal login pra ele sempre pegar o mesmo ip pra quem usa dhcp e controla os usuários no radius, segue:
na tabela radcheck:
UserName: logindocliente (ex: joaodossantos)
Attribute: Framed-IP-Address
op: ==
Value: ipdocliente (ex: 192.168.50.50)
toda vez que o cliente joaodossantos logar ele pegara esse ip cadastrado acima...
Bom, me desculpe por tantas linhas, mas é presciso, desculpe os erros, e estamos ae pra dicas e críticas...espero ter ajudado alguém, assim como tantos me ajudaram já...
Obrigado e passar bem...