Bloquear o DHCP de dispositivos móveis

Publicado por Vinicius Mathias (última atualização em 22/02/2017)

[ Hits: 3.395 ]

Homepage: https://www.linkedin.com/in/mathiasvinicius/

Download listaDispositivos.sh




Este script que desenvolvi tem o intuito de bloquear no DHCPD de modo que dispositivos não cadastrados em uma lista obtenham endereço IP.

Neste script um usuário de celular ou tablet consegue obter na primeira vez o IP. E com isso o MAC dele entra para uma lista que assim que o mesmo se desconectar não vai conseguir mais uma conexão.  

Este script foi montado usando partes de códigos  encontrados aqui no Viva o Linux  e outras fontes na internet.  Devem existir melhores formas de melhorar este script, porém foi a forma como eu conseguir fazer.

Na pasta que colocar o script, crie o arquivo chamado: dispositivosLiberados.txt

E coloque no formato:

#Nome
macliberado;

  



Esconder código-fonte

#!/bin/bash
#Desenvolvido por Vinicius Mathias
#Incluir no  vi /etc/sysconfig/dhcpd o "/scripts/dispositivos.txt"
DIR="/scripts/Proxy/dispositivos/";
NOMES="android|blackberry|iphone|pad|windows-phone|redmi";
LISTDISP="/var/lib/dhcp/db/dhcpd.leases";
DHCPCONF="/etc/dhcpd.conf";

#Preparacao 
#Cria os arquivos temporarios de original, para preservar os macs antigos.
cp "$DIR"dispositivosMoveis.log  "$DIR"dispositivosMoveis.tmp;
cp "$DIR"dispositivosDiversos.log "$DIR"dispositivosDiversos.tmp; 

awk '
/lease/{IP=$2};
/hardware/{MAC=substr($3,0,length($3)-1)}
/hostname/{HOST=substr($2,2,length($2)-3);
printf("%s %s \n",HOST,MAC)};
' $LISTDISP > "$DIR"dispositivos.tmp;

while read LINHA; do
   HOST=$(echo $LINHA | awk '{print $1}');
   MAC=$(echo $LINHA | awk '{print $2}');
   MAC2=$(sed -e 's/://g' <<< $MAC); #Remove os dois pontos.
   if echo "$HOST" | egrep -iE $NOMES >/dev/null;then  #Verifica se um dispositivo listado.
   {    
       if echo "$HOST" | egrep -iE "android" >/dev/null;then #Se for Android remove ID
         {
           echo "host android-$MAC2{hardware ethernet $MAC; deny booting;}" >>  "$DIR"dispositivosMoveis.tmp; #Cria o arquivo no formato de bloqueio.
         }
   else #Para outros dispositivos listados.
     { 
      echo "host $HOST-$MAC2{hardware ethernet $MAC; deny booting;}" >> "$DIR"dispositivosMoveis.tmp; #Cria o arquivo no formato de bloqueio.
     }
     fi
  }      
   else 
   echo "Dispositivo:$HOST MAC:$MAC" >> "$DIR"dispositivosDiversos.tmp; # Apenas faz uma listagem dos outros dispositivos.
   fi      


done < "$DIR"dispositivos.tmp

sort "$DIR"dispositivosMoveis.tmp  | uniq > "$DIR"dispositivosMoveis.log; #Organiza o arquivo por ordem alfabeta e remove linhas duplicadas.
sort "$DIR"dispositivosDiversos.tmp  | uniq > "$DIR"dispositivosDiversos.log; #Organiza o arquivo por ordem alfabeta e remove linhas duplicadas.

if [ "$1" == "blo" ]; then
# Limpa os dados de bloqueio antigo.
grep -vE "(deny booting)" $DHCPCONF > "$DIR"dhcpd.tmp #Remove do DHCPD as linhas que contem deny booting.
cp "$DIR"dhcpd.tmp $DHCPCONF

# Inicia o bloqueio.
cat "$DIR"dispositivosLiberados.txt|grep -v "^#" |sed 's/;/|/g' |sed ':a;N;s/\n//g;ta' > "$DIR"dispositivosLiberados.tmp;
# ^ O grep remove linhas comentadas, o primeiro SED substitui o ; por | para varios macs, e segundo SED remove quebra de linha e espacos
DIS_LIBERADOS=$(egrep -v "(^#|^$)" "$DIR"dispositivosLiberados.tmp)"fim;"; # Recebe a lista de dispositivos liberados e acionad o fim para remover do loop.
#Envia para o DHCPD
cat "$DIR"dispositivosMoveis.log |grep -viE $DIS_LIBERADOS >> $DHCPCONF # Envia para o fim do dhcpd.conf os dispositivos nao liberados

service dhcpd restart #Reinicia o dhcpd. (No meu caso opensuse.
fi

if [ "$1" == "lib" ]; then
#Envia para o DHCPD
grep -vE "(deny booting)" $DHCPCONF > "$DIR"dhcpd.tmp  #Remove do DHCPD as linhas que contem deny booting.
cp "$DIR"dhcpd.tmp $DHCPCONF
service dhcpd restart #Reinicia o dhcpd. No meu caso opensuse.
fi

rm "$DIR"*.tmp #Remove os arquivos temporarios.

Scripts recomendados

Download do banco de dados NCBI NR (DNA)

Retra de iptables para DMZ na porta 80

Sincronizar arquivos com rsync

Montador de Compartilhamentos

Network_test


  

Comentários
[1] Comentário enviado por patrickpcs em 20/07/2017 - 10:31h

Parabéns pelo esforço empenhado :)

Se eu não me engano o DHCPD além da função de restrição/liberação por MAC, também tem uma usando o parâmetro hostname.
Pelo que entendi no seu script, você usa o hostname informado ao DHCPD pelo dispositivo que inicia o D.O.R.A. Será que não teria como bloquear diretamente no DHCPD os hostnames conhecidos pelas fabricantes de dispositivos moveis e deixando a exceção para os que você desejar?

Dessa forma eles não conseguiriam se quer obter uma vez o IP oferecido pelo seu servidor....
Vou dar uma googlada :P

No antigo ambiente corporativo que eu trabalhava, eu usava esse artifício para criar pools de ips de acordo com o hostname, no caso o hostname das estações de trabalho eram baseados no setor. Assim ficava bacana pois sabia mais ou menos quais IPs estavam em cada setor (bom para diagnósticos na rede). Bem, pra não fugir do assunto, eu tinha usado para criar pools, não exatamente restrição, mas qualquer PC que não se encaixava na descrição dos hostnames não obtiam IPs pois eu tinha ocupado todo o range com as pools criadas, o que era ótimo contra os funcionários que traziam tanqueiras de casa e tentavam ligar na rede.


http://goo.gl/g6NiFp


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts