Gateway autenticado com Apache, Iptables e CGI em shell
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.
Parte 8: O script para desfazer a autenticação
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...
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.
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
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.
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!
T+