¿Cómo restringir el acceso del usuario a Internet por intervalos de tiempo?

12

Quiero que uno de los usuarios (que no esté en la lista de sudoers) tenga acceso a Internet de 14:00 a 16:00 y de 17:00 a 18:30. ¿Es posible? ¿Puedo establecer diferentes intervalos de tiempo para diferentes días de la semana?

cupakob
fuente
Sería mejor hacerlo en un nivel de control de enrutador o puerta de enlace, en lugar de hacerlo en el sistema en sí mismo ... que yo sepa, no hay un sistema fácil dentro de Ubuntu para restringir el acceso a Internet a nivel de usuario.
Thomas Ward
Cuando lo haga en el nivel del enrutador, entonces todos los usuarios estarán restringidos ... ''
dijo el
Afaik (y he estado buscando una solución para esto desde 9.04), no hay soluciones de software para esto. De acuerdo, en mis redes, solo hay un usuario por computadora, y todos se conectan a través de una caja de servidor que actúa como puerta de enlace. Ese cuadro tiene un crontab que bloquea todo el acceso a Internet en ese sistema y luego lo elimina más adelante; posteriormente también se ejecuta a diferentes horas cada día. Por curiosidad, ¿por qué necesita restringir el acceso a ese estricto período de tiempo y por qué debe hacerlo el usuario?
Thomas Ward
Lo necesito por usuario, porque dos usuarios usan una PC. y quiero restringir el acceso, porque el segundo usuario debe aprender mucho más y no quedarse en Facebook :) pero tu idea con el crontab es buena ... ¿qué estás usando para bloquear el acceso? Puedo hacer lo mismo para el usuario, al bloquear el router :)
cupakob
Mi enrutador y mi cuadro de puerta de enlace están separados: como el cuadro de puerta de enlace asigna una dirección estática (y por lo tanto maneja los datos) de los otros cuadros, uso iptables para bloquear la dirección IP privada asignada estática para que no envíe datos entrantes o salientes, lo que por lo tanto bloquea TODO el tráfico de internet a la caja. Cada crontabs usa su propio comando iptables para eliminar elementos en un horario. Es un sistema imperfecto, porque podría comprar un enrutador que funcione mejor: P
Thomas Ward

Respuestas:

7

Puede usar la ownerextensión de iptables para bloquear el acceso de un usuario a la red, como

 sudo iptables -A OUTPUT -m owner --uid-owner user_you_want_to_block -j REJECT

Ahora puede usar cron para agregar o eliminar esas reglas (que pueden necesitar un poco de scripting de shell si ya tiene algunas reglas de iptable o si lo desea para diferentes usuarios en diferentes momentos).

Florian Diesch
fuente
Ooh, no sabía que existía: P @Florian: (a) ¿qué módulos del núcleo deben cargarse para esto? (b) ¿funciona con esto -j REJECT --reject-with <argument>?
Thomas Ward
(a) xt_owner se carga automáticamente. (b) No veo ninguna razón por la cual --reject-with no funcione con esto pero nunca lo haya intentado.
Florian Diesch
Probaré esto más adelante: P ¿Existe el módulo propietario en las páginas de manual de iptables para detallar su uso? (Nota al margen: pregunté qué módulo del kernel porque mi kernel está compilado a medida: /)
Thomas Ward
se ve exactamente lo que estoy buscando ... debo probarlo :)
cupakob
@EvilPhoenix: Sí, está documentado en la página de
manual de
8
  1. iniciar sesión como root:

    sudo su

  2. verifique el estado de su firewall:

    ufw status
    

    Si el firewall está inactivo , emita:

    ufw enable
    
  3. con el fin de restringir el usuario Wilhelm acceso a Internet de los domingos, martes, miércoles y viernes a los intervalos de tiempo permitidos (14: 00-16: 00 y 17: 00-18: 30):

    iptables -I OUTPUT -p tcp -m owner --uid-owner wilhelm -m time --weekdays Su,Tu,We,Fr --timestart 00:00:01 --timestop 14:00:00 -j DROP 
    iptables -I OUTPUT -p tcp -m owner --uid-owner wilhelm -m time --weekdays Su,Tu,We,Fr --timestart 16:00:00 --timestop 17:00:00 -j DROP 
    iptables -I OUTPUT -p tcp -m owner --uid-owner wilhelm -m time --weekdays Su,Tu,We,Fr --timestart 18:30:00 --timestop 23:59:59 -j DROP 
    

    nota al margen : * tenga en cuenta el uso del -Iinterruptor en lugar del -Ainterruptor del iptablescomando. el -Iinterruptor inserta las reglas antes mencionadas (3.) al principio (arriba) de la cadena de reglas de SALIDA en lugar de en la parte inferior de la cadena. colocar las reglas agregadas manualmente encima de las políticas de firewall normales es importante ya que las reglas se procesan de arriba a abajo. Si la mayoría de las reglas ACEPTAN un paquete, la cadena, SALIDA, ya no se verifica para las siguientes reglas que podrían haber CAÍDO el paquete.

  4. asegúrese de que las reglas se hayan introducido correctamente:

    iptables -L OUTPUT
    

    con el fin de eliminar una regla apropiada, por ejemplo (recuento basado en 1 desde la parte superior de la regla Nº 1, iptables -v -L OUTPUT) tema: iptables -D OUTPUT 1.

  5. guardar iptables para restaurar en el próximo arranque:

    iptables-save > /etc/iptables.rules
    
  6. en /etc/rc.localagregar la línea:

    iptables-restore < /etc/iptables.rules
    

hecho

-

probado en Ubuntu 11.10 (oneiric), locale: he

usuario56231
fuente
1
Gran respuesta con una solución perfecta! Pero tenga en cuenta que todos los tiempos se interpretan como UTC , por lo que es posible que tenga que compensarlos manualmente para la hora local, en mi caso central european summer time -2 hours.
Precise Penguin
Hice todos los pasos y funcionaron (el acceso a Internet era limitado) pero después de reiniciar, Internet volvió a funcionar. Revisé iptables -L OUTPUT y no encontré las reglas que agregué ...
Lawand
1
¿Cuál es la razón por la que está habilitando ufwaunque luego la use iptables?
balu
@PrecisePenguin que se puede arreglar con la --kerneltzopción ("Usar la zona horaria del núcleo en lugar de UTC")
waldyrious