Revisión 451
Añadido por Antonio J. Abasolo Sierra hace más de 12 años
dhcp-server-denegar/trunk/dhcp-server-denegar | ||
---|---|---|
#!/bin/bash
|
||
# ***********************************************************************************************************
|
||
# Antonio J. Abasolo Sierra (Dic-2012)
|
||
#
|
||
# Controla el acceso al sistema, filtrando los equipos a los que el servidor dhcp del centro ofrecerá ip,
|
||
# y por lo tanto podrán navegar.
|
||
# Se base en el sistema de lista blanca (mantenida por el usuario),
|
||
# y lista negra (obtenida por filtrado de entradas del fichero del servidor dhcp: dhcpd.leases)
|
||
#
|
||
# La Lista_Blanca de equipos que dejamos conectarse la mantenemos nosotros, y debe tener este formato:
|
||
# MAC,EQUIPO[,IP][,NOMBRE]
|
||
# EQUIPO --> nombre personal para conocer al equipo.
|
||
# [,IP] --> Se rellenará automáticamente por el script.
|
||
# [,NOMBRE] --> Se rellenará automáticamente por el script (si lo tiene).
|
||
#
|
||
# Para dejarlo operativo colocaremos un crontab que ejecute este script cada 5 min. (por ej.)
|
||
# ***********************************************************************************************************
|
||
|
||
FILE_CONF=/etc/dhcp/dhcpd.conf
|
||
FILE_LEASES=/var/lib/dhcp/dhcpd.leases
|
||
LISTA_NEGRA=/etc/dhcp/hosts.deny
|
||
LISTA_BLANCA=/etc/dhcp/hosts.accept
|
||
SERVICIO=isc-dhcp-server
|
||
|
||
Crear_BaseConf() {
|
||
if [ ! -f $FILE_CONF.base ]; then
|
||
cat $FILE_CONF > $FILE_CONF.base
|
||
fi
|
||
}
|
||
|
||
Configuracion_Base() {
|
||
Crear_BaseConf
|
||
if [ -f $FILE_CONF.base ]; then
|
||
cat $FILE_CONF.base > $FILE_CONF
|
||
fi
|
||
}
|
||
|
||
Configuracion_Base2() {
|
||
echo "
|
||
# ------------------------------------------------
|
||
ldap-server "ldap";
|
||
ldap-port 389;
|
||
ldap-base-dn "dc=instituto,dc=extremadura,dc=es";
|
||
ldap-dhcp-server-cn "ldap";
|
||
ldap-method dynamic;
|
||
#ldap-method static;
|
||
ddns-update-style none;
|
||
# ------------------------------------------------
|
||
" > $FILE_CONF
|
||
}
|
||
|
||
Obtener_Leases() {
|
||
# Creamos un fichero de leases con una entrada por línea: MAC,IP,NOMBRE
|
||
echo " - Obtenemos 'pcs.leases': equipos conectados vía dhcp-server ..."
|
||
cat $FILE_LEASES | grep -v '#' > pcs.leases
|
||
rm -f pcs 2>/dev/null ; touch pcs
|
||
cat pcs.leases | while read linea ; do
|
||
KEY=`echo $linea | awk '{print $1}'`
|
||
case "$KEY" in
|
||
lease) IpPC=`echo $linea | awk '{print $2}'`
|
||
;;
|
||
hardware) MacPC=`echo $linea | awk '{print $3}' | cut -f1 -d';' | tr A-Z a-z`
|
||
;;
|
||
client-hostname) NombrePC=`echo $linea | awk -F'"' '{print $2}'`
|
||
;;
|
||
*)
|
||
if [ $MacPC ]; then
|
||
esta=`grep -i $MacPC pcs` 2>/dev/null
|
||
if [ ! $esta ]; then
|
||
echo "$MacPC,$IpPC,$NombrePC" >> pcs
|
||
NombrePc=""
|
||
fi
|
||
fi
|
||
;;
|
||
"")
|
||
;;
|
||
esac
|
||
done
|
||
cat pcs | uniq | sort -t, -u -k2 > pcs.leases
|
||
rm -f pcs
|
||
}
|
||
|
||
Obtener_ListaNegra() {
|
||
# Recorremos el fichero de leases obtenido, y lo filtramos con la lista-blanca
|
||
echo " - Creamos $LISTA_NEGRA: lista de equipos a denegar (lista negra)"
|
||
rm -f $LISTA_NEGRA 2>/dev/null ; touch $LISTA_NEGRA
|
||
cat pcs.leases | while read linea; do
|
||
MAC=`echo $linea | cut -f1 -d,`
|
||
IP=`echo $linea | cut -f2 -d,`
|
||
PC=`echo $linea | cut -f3 -d,`
|
||
|
||
ESTA=`grep -i $MAC $LISTA_BLANCA` 2>/dev/null
|
||
if [ ! $ESTA ]; then
|
||
echo "$MAC,$PC,$IP" >> $LISTA_NEGRA
|
||
else
|
||
EQUIPO=`grep ^$MAC $LISTA_BLANCA | cut -f1-2 -d,`
|
||
grep -v ^$MAC $LISTA_BLANCA > tmp
|
||
mv tmp $LISTA_BLANCA
|
||
echo "$EQUIPO,$IP,$PC" >> $LISTA_BLANCA
|
||
fi
|
||
done
|
||
}
|
||
|
||
Crear_Configuracion() {
|
||
echo " - Creamos $FILE_CONF: fichero de configuración de dhcp-server"
|
||
Configuracion_Base
|
||
NUMPC=0
|
||
echo "" >> $FILE_CONF
|
||
echo "# Equipos con entrada denegada:" >> $FILE_CONF
|
||
echo "# -----------------------------" >> $FILE_CONF
|
||
cat $LISTA_NEGRA | while read linea; do
|
||
NUMPC=`expr $NUMPC + 1`
|
||
MAC=`echo $linea | cut -f1 -d,`
|
||
PC=`echo $linea | cut -f2 -d, | tr '-' '_'`
|
||
if [ $PC ]; then
|
||
ESTA=`grep -w $PC $FILE_CONF` 2>/dev/null
|
||
if [ "$ESTA" ]; then PC=Equipo_$NUMPC; fi
|
||
else
|
||
PC=Equipo_$NUMPC
|
||
fi
|
||
echo "host $PC {
|
||
hardware ethernet $MAC;
|
||
deny booting;
|
||
}" >> $FILE_CONF
|
||
done
|
||
}
|
||
|
||
Reiniciar_Servicio() {
|
||
echo " - Reiniciamos el servicio $SERVICIO:"
|
||
#/etc/init.d/$SERVICIO restart
|
||
/etc/init.d/$SERVICIO stop > /dev/null
|
||
/etc/init.d/$SERVICIO start > /dev/null
|
||
if [ $? -ne 0 ]; then
|
||
echo " * Error al iniciar el servicio."
|
||
echo " * Comprueba el fichero de configuración creado: $FILE_CONF"
|
||
else
|
||
echo " * Servicio reiniciado correctamente."
|
||
fi
|
||
echo ""
|
||
}
|
||
|
||
# -----------------------------------------------------------------------------
|
||
case "$1" in
|
||
start)
|
||
echo ""
|
||
echo " Configurando dhcp.conf para denegar conexiones ... "
|
||
echo " ---------------------------------------------------"
|
||
|
||
Obtener_Leases
|
||
Obtener_ListaNegra
|
||
|
||
Crear_Configuracion
|
||
Reiniciar_Servicio
|
||
|
||
;;
|
||
stop)
|
||
echo ""
|
||
echo " Configurando dhcp.conf para aceptar todas las conexiones ... "
|
||
echo " ---------------------------------------------------"
|
||
|
||
Configuracion_Base
|
||
Reiniciar_Servicio
|
||
|
||
;;
|
||
status)
|
||
;;
|
||
*)
|
||
N=/etc/init.d/$NAME
|
||
echo ""
|
||
echo "Usage: $N {start|stop|status}" >&2
|
||
echo ""
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
exit 0
|
||
|
||
|
||
dhcp-server-denegar/trunk/readme | ||
---|---|---|
# Script: dhcp-server-denegar
|
||
# Autor: Antonio J. Abasolo Sierra
|
||
# Fecha: Diciembre-2012
|
||
|
||
|
||
Este script se encarga de regenerar el fichero de configuración de isc-dhcp-server, situado en /etc/dhcp/dhcpd.conf
|
||
|
||
A groso modo, hace lo siguiente:
|
||
|
||
- Se crean dos ficheros en la ruta de dicho servicio, que son:
|
||
* /etc/dhcp/hosts.accept --> lista blanca de equipos conocidos a los que no será cortado su acceso.
|
||
Formato: MAC,Nombre
|
||
00:1c:b3:c4:fe:13,Ponente
|
||
|
||
* /etc/dhcp/hosts.denny --> lista negra de equipos a los que les cortaremos el acceso
|
||
Formato: MAC,Nombre
|
||
00:1c:b3:c4:fe:13,InglesP1
|
||
|
||
- Se crea el fichero 'pcs.leases' (en ruta de ejecución del script),
|
||
con las mac's del fichero /var/lib/dhcp/dhcpd.leases --> Solo estarán las MAC's de equipos
|
||
que no esten dados de alta en LDAP, y que no tengan puesta ip fija (manualmente).
|
||
Formato: MAC,IP,Nombre
|
||
00:1c:b3:c4:fe:13,172.23.23.5,InglesP1
|
||
|
||
- El script regenere el fichero /etc/dhcp/dhcp.conf, con
|
||
las líneas básicas de ldap (almacenadas previamente en el fichero /etc/dhcp/dhcpd.conf.base,
|
||
y las denegaciones de mac's del fichero de lista-negra-macs: /etc/dhcp/hosts.deny
|
||
|
||
- El fichero de lista-negra-macs se obtiene del quitarle al fichero pcs.leases, las mac's del fichero de lista-blanca
|
||
* /etc/dhcp/hosts.deny = (pcs.leases - /etc/dhcp/hosts.accept)
|
||
|
||
- Se reinicia el servicio correspondiente:
|
||
* /etc/init.d/isc-dhcp-server stop
|
||
* /etc/init.d/isc-dhcp-server start
|
||
|
||
- Pones un cron (crontab) en el servidor NFS para que ejecute dicho
|
||
script cada X tiempo, por ej. cada 5 min.
|
||
|
||
*****
|
||
Posibles Mejoras:
|
||
- Permitir añadir ip's manualmente al fichero de lista-negra-macs
|
||
- Limpiar el fichero /var/lib/dhcp/dhcpd.leases
|
||
|
||
|
Exportar a: Unified diff
dhcp-server-denegar: Filtro por MAC