imagen

DHCP detectar nuevos equipos en la red con BASH

07.Jan.2022 — Julio

El script empezó siendo mucho más simple y solo en bash, pero al final quería que me mandase un email cada vez que encontrase un nuevo equipo, y tuve que utilizar un programa hecho por mi en Go para mandar los emails.

Además utiliza primordialmente awk que es bastante rápido en procesar ficheros de texto.

Ya lo tenía hace muchos años hecho y funcionando perfectamente en la red de mi trabajo; estaba hecho en python para redes windows. detectar-y-avisar-nuevas-concesiones-de-ip-en-nuestra-red-dhcp.html

El script busca nuevos equipos por MACs y es sabido que ya hay formas de crear nuevas macs para cada conexión así que puede haber nuevos falsos positivos por ser el mismo equipo.

Para adaptarse a uno mismo se tendría que cambiar:

  • los interfaces a poner en arp-scan
  • la red a buscar
  • todo lo referente al envío del email

Finalmente se pone este script en el crontab para que se ejecute cada cierto tiempo y ya está.

Una vez que recibo un aviso, busco el equipo, edito el fichero dhcp.txt poniendo el nombre que quiera en la última columna y ordeno por mac (esto último porque sí).

El fichero dhcp.txt tiene esta pinta:

dhcp_txt

Solo por poner ideas.

```
#!/usr/bin/env bash
# Función: enviar email cada vez que se detecte una mac distinta conectada a la red
# Fecha creación: 29.12.2021
# Autor: Julio
# Versión: 1.0
# Detalle:
#   - se necesita instalar arp-scan
#   - se necesita mandaemail hecho por mi en Go
#   - contiene passwd
#

now=$(date +%d/%m/%Y"_"%T)

sudo arp-scan -x -I wlp59s0 192.168.0.0/24 > wdhcp_now.txt

sudo arp-scan -x -I enp58s0f1 192.168.0.0/24 >> wdhcp_now.txt

cat wdhcp_now.txt | sort -k2,2 | uniq > dhcp_now.txt

awk -F"\t" -v now="$now" '

                NR == FNR {
                    mac[$2]=$0;
                    next;
                }
{
                if (mac[$2] == "") {
                    nuevo+=1
                    printf("\n%s\tdispositivo nuevo: %s", nuevo, $0)
                    #gsub("\\:",":",rit2)
                    print $0"\t"now"\t?" >> "dhcp.txt"
                                }
}
                END {
                 if (nuevo>0) {
                     printf("\nse encontraron %s nuevos\n", nuevo)
                     print "semaforo" > "dhcp_nuevos.txt"
                 }
                else {
                     print("\ntodo ok")
                 }
}
' dhcp.txt dhcp_now.txt

if test -f "/tu_ruta/dhcp_nuevos.txt"
then
    cadena="email_emisor|tupassword|tuservidor_smtp|tu_puerto_smtp|destinatario|Nuevos_equipos_detectados_"$now"|.|dhcp.txt|"
    echo -e "\nmando email"
    mandaemail "$cadena"
    rm dhcp_nuevos.txt
fi
rm wdhcp_now.txt
rm dhcp_now.txt



```

Tags: bash, awk

Comments? Tweet