Procurando uma solução que fosse ao mesmo tempo simples de ser implementada e de grande eficiência comparados aos gateways mais sofisticados que empregam bancos de dados e etc, cheguei a esta solução ideal para ser usada em provedores wireless ou a cabo. Ela ainda está em desenvolvimento e dada a sua enorme simplicidade de seu conceito pode servir de base para projetos mais elaborados.
Nosso sistema não trabalha com um "lado cliente", portanto temos que criar um recurso para que a autenticação seja desfeita caso o cliente desligue seu computador, pois se isso não for feito, algum outro usuário "esperto" poderá acessar a internet apenas clonando o MAC do cliente sem qualquer autenticação.
Vamos chamá-lo de scanner.cgi. Podemos adicioná-lo ao /etc/rc.d/rc.local sucedido de & para que ele rode em background. Ficaria assim...
# /usr/sbin/scanner.cgi &
Vamos ao script...
#!/bin/bash
while true
do
for i in `seq 10 254`
do
ipcheck=192.168.$i.10
#Converte para a variável $mac os MAC address das estações
#que estão conectadas a rede e para a variável $mac_neigh
#os MAC das estações que estiverem desconectadas oriundos
#da tabela ARP estática.
mac=`arping -c1 -D -I eth0 -s 192.168.10.1 $ipcheck | fgrep [ | cut -f2 -d[ | cut -f1 -d]`
mac_neigh=`ip neigh show dev eth0 | fgrep $ipcheck | cut -f3 -d" "`
if test $mac;then
:
else
sudo /usr/sbin/iptables -D INPUT -s $ipcheck -m mac --mac-source $mac_neigh -j ACCEPT 2> /dev/null | sudo /usr/sbin/iptables -D FORWARD -s $ipcheck -m mac --mac-source $mac_neigh -j ACCEPT 2> /dev/null
fi
done
sleep 30
done
O script envia um arping para cada uma das estações da rede, caso ela não responda ele remove a regra que habilita o INPUT e o FORWARD para aquele IP/MAC.
Não se preocupem com o tráfego de rede, pois requisições ARP são muito pequenas e em nada afetarão o desempenho da rede. Uma rede com 254 estações é inteiramente varrida em menos de 5 minutos.
[1] Comentário enviado por removido em 27/07/2007 - 15:57h
Olá Amigo,
Bom, para deixar seu artigo ainda mais rico eu gostaria de dar uma opinião! No caso de um hijack bem feito (roubo de seção), quando o cliente cai e em seguida entra o hijack seu arping vai consultar ele tranqüilamente! Concorda!? Espero que sim, pois eu já fiz testes com isso e infelizmente da certo! A solução é simples, ao invés de fazer o servidor consultar quem está de pé ou não, o que dependendo do número de estações tem um tempo elevado, eu sugiro mudar para o comando at. Como já uso o servidor Radius, foi fácil, no comando AT eu agendo uma verificação pra saber se o IP tal é do fulano de tal conectado no radius, aí sim, se não for a regra dele é derrubada! Pra substituir o uso do radius, pode-se pensar em cookie, por exemplo!
[2] Comentário enviado por capitainkurn em 27/07/2007 - 17:50h
Boa! nem havia me ocorrido o at.
Quando elaborei aquele while de arping, pensei em coloca-los isoladamente rodando sob um shell filho do mac_accept4.cgi que seria chamado em background, mas esbarrei em um problema... não entendí ainda o por que de não conseguir rodar um loop em um shell filho a partir de um CGI, mas é uma coisa que estou bolando e a sua idéia do at foi grande.
Obrigado pela dica, e espero que tenha gostado do artigo.
[4] Comentário enviado por capitainkurn em 23/04/2008 - 10:03h
É mais fácil ainda, a única razão para eu atrelar o ip ao mac address é o controle de banda, pois provedores em geral possuem planos de velocidade diferentes e se não houver vínculo entre o IP e o login e senha o usuário poderia configurar um IP manualmente e usar uma velocidade maior do que a contratada.
[5] Comentário enviado por cleibson em 03/05/2009 - 22:57h
Como o cliente será diretionado para autenticação, sendo que não há nenhuma regra redirecionando sua navegação para a porta 443 obrigando-o a autenticar antes de navegar
[7] Comentário enviado por douglassironi em 28/06/2011 - 18:38h
Sobre a questão de atrelar MAC, podemos fazer isso com PHP, no momento que o cliente se cadastra e cria seu usuario e senha, podemos tranquilamente pegar o MAC dele com a função, abaixo tem um link explicando como fazer.