Reglas de tiempo

Hay escenarios en donde se le solicita al sysadmin que aplique reglas de tiempo para el acceso a determinados equipos en la red local. Para poder ejecutar esta tarea, el sysadmin debe tener previamente establecido en su firewall (basado en reglas iptables), las diferentes ACLs con las direcciones MACs de los equipos de su red local, cada una con sus respectivos privilegios de acceso que les quiere otorgar.
Una vez definido esto, es muy sencillo establecer el tiempo de acceso. La regla iptables que normalmente se utiliza es time, con un formato similar al siguiente:
iptables RULE -m time --timestart TIME --timestop TIME -j ACTION
En el siguiente ejemplo, aplicaremos la regla time de iptables a una ACL (que llamaremos macslimited y que contiene las direcciones MACs con su formato de 6 bloques de dos caracteres hexadecimales) la cual le restringiremos el acceso a los puertos 80,443 durante el día y los abriremos a partir de la 2 PM (14 H).
Adicionalmente la regla la restringiremos para el rango CIDR 192.168.0.0/24 y para dos interfaces de red (enp2s0 para la salida a internet y enp2s8 para la red local local):
allowed_time=14:00:00 # hora permitida de acceso a los puertos
denied_time=23:59:59 # hora de cierre de los puertos
for mac in macslimited; do
     iptables -A INPUT -s 192.168.0.0/24 -i enp2s8 -m mac --mac-source $mac -p tcp -m multiport --dports 80,443 -m time --timestart $allowed_time --timestop $denied_time -j ACCEPT
     iptables -A FORWARD -s 192.168.0.0/24 -i enp2s8 -m mac --mac-source $mac -p tcp -m multiport --dports 80,443 -o enp2s0 -m time --timestart $allowed_time --timestop $denied_time -j ACCEPT
done
Sin embargo, esta regla tiene una limitante y es que no permite que el horario se extienda más allá de las 24 H; un problema descrito en el portal unix.stackexchange.com
Entonces si queremos que el horario se extienda más allá de la hora 24 (por ejemplo: desde 2 PM hasta las 8 AM del siguiente día), habría que crear un segundo horario, justo cuando termina el primero, o sea, desde 00:00:00 hasta 08:00:00 y repetir cada regla de iptables para el nuevo horario.
Una posible solución es invertirlo, o sea, poner el horario en que NO queremos que acceda esta ACL (ejemplo: 8:00:00 14:00:00) y cambiamos las reglas de iptables de ACCEPT a DROP. De esta manera el "resto" del tiempo nuestra lista tendría acceso. Pero también tiene sus desventajas, ya que es muy probable que tenga que agregar reglas iptables adicionales para autorizar estos puertos en el horario deseado.
Pero hay un truco (cortesía de novatoz) que nos ayuda a evadir este limite y cumple exactamente con nuestro objetivo:
current_time=$(date +%H) # verifica la hora de sistema
allowed_time=14 # hora permitida de acceso a los puertos
denied_time=8 # hora de cierre de los puertos 
if [ $current_time -ge $allowed_time -o $current_time -lt $denied_time ]; then
    for mac in macslimited; do
      iptables -A INPUT -s 192.168.0.0/24 -i enp2s8 -m mac --mac-source $mac -p tcp -m multiport --dports 80,443 -j ACCEPT
      iptables -A FORWARD -s 192.168.0.0/24 -i enp2s8 -m mac --mac-source $mac -p tcp -m multiport --dports 80,443 -o enp2s0 -j ACCEPT
    done
fi
El único inconveniente es que solo establece horas, a diferencia de la regla time que incluye minutos y segundos.
Con la tecnología de Blogger.