Comment restreindre l'accès des utilisateurs à Internet pour des intervalles de temps?

12

Je veux que l'un des utilisateurs (pas dans la liste sudoers) ait accès à Internet de 14h00 à 16h00 et de 17h00 à 18h30. C'est possible? Puis-je définir des intervalles de temps différents pour différents jours de la semaine?

cupakob
la source
Vous feriez mieux de le faire au niveau du contrôle d'un routeur ou d'une passerelle, plutôt qu'au niveau du système lui-même ... pour autant que je sache, il n'y a pas de système facile dans Ubuntu pour restreindre l'accès à Internet au niveau de l'utilisateur.
Thomas Ward
Quand je le ferai au niveau du routeur, alors tous les utilisateurs seront restreints ...
cupakob
Afaik (et je cherchais une solution à cela depuis 9.04), il n'y a pas de solutions logicielles pour cela. Certes, sur mes réseaux, il n'y a qu'un seul utilisateur par ordinateur, et ils se connectent tous via une boîte de serveur qui sert de passerelle. Cette boîte a une crontab qui bloque tout accès Internet sur ce système puis le supprime plus tard; par la suite, il fonctionne également à différents moments de la journée. Par curiosité, pourquoi devez-vous restreindre l'accès à cette période stricte et pourquoi devez-vous le faire par utilisateur?
Thomas Ward
j'en ai besoin par utilisateur, car un pc est utilisé par deux utilisateurs. et je veux restreindre l'accès, car le deuxième utilisateur doit en apprendre beaucoup plus et ne pas rester sur facebook :) mais votre idée avec le crontab est bonne .... qu'est-ce que vous utilisez pour bloquer l'accès? Je peux faire la même chose pour l'utilisateur, quand je bloque le routeur :)
cupakob
Mon routeur et mon boîtier de passerelle sont séparés - comme le boîtier de passerelle attribue une adresse statique (et gère donc les données) des autres boîtiers, j'utilise iptables pour empêcher l'adresse IP privée attribuée statiquement d'envoyer des données sortantes ou entrantes, qui ainsi bloque TOUT le trafic Internet dans la boîte. Les crontabs utilisent chacune leur propre commande iptables afin de supprimer des éléments selon un calendrier. C'est un système imparfait, car je pourrais simplement acheter un routeur qui fonctionne mieux: P
Thomas Ward

Réponses:

7

Vous pouvez utiliser l' ownerextension d' iptables pour empêcher un utilisateur d'accéder au net, comme

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

Vous pouvez maintenant utiliser cron pour ajouter ou supprimer ces règles (qui peuvent nécessiter un peu de script shell si vous avez déjà des règles iptables ou si vous le souhaitez pour différents utilisateurs à des moments différents).

Florian Diesch
la source
Ooh, je ne savais pas qu'il existait: P @Florian: (a) quels modules du noyau doivent être chargés pour cela? (b) cela fonctionne- -j REJECT --reject-with <argument>t-il?
Thomas Ward
(a) xt_owner se charge automatiquement. (b) Je ne vois aucune raison pour laquelle --reject-with ne devrait pas fonctionner avec cela mais ne l'a jamais essayé.
Florian Diesch
Je testerai cela plus tard: P Le module propriétaire existe-t-il dans les pages de manuel iptables, pour détailler son utilisation? (Note latérale: J'ai demandé quel module de noyau parce que mon noyau est compilé sur mesure: /)
Thomas Ward
ressemble exactement à ce que je cherche .... je dois l'essayer :)
cupakob
@EvilPhoenix: Oui, c'est documenté dans la page de manuel iptables
Florian Diesch
8
  1. connectez-vous en tant que root:

    sudo su

  2. vérifiez l'état de votre pare-feu:

    ufw status
    

    si le pare-feu est inactif , lancez:

    ufw enable
    
  3. afin de restreindre l' accès Internet de l' utilisateur wilhelm les dimanches, mardis, mercredis et vendredis aux intervalles de temps autorisés (14: 00-16: 00 & 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 
    

    note latérale : * veuillez noter l'utilisation du -Icommutateur plutôt que le -Acommutateur de la iptablescommande. le -Icommutateur insère les règles susmentionnées (3.) au début (en haut) de la chaîne de règles OUTPUT plutôt qu'en bas de la chaîne. Il est important de placer les règles ajoutées manuellement au-dessus des stratégies de pare-feu standard, car les règles sont traitées de haut en bas. si le plus grand nombre de règles ACCEPTE un paquet, la chaîne, OUTPUT, n'est plus vérifiée pour les règles suivantes qui auraient pu DROPper le paquet.

  4. veuillez vous assurer que les règles ont bien été correctement saisies:

    iptables -L OUTPUT
    

    Afin de supprimer une règle inappropriée, disons la règle n ° 1, (nombre basé sur 1 à partir du haut iptables -v -L OUTPUT) iptables -D OUTPUT 1.

  5. enregistrer iptables pour la restauration au prochain démarrage:

    iptables-save > /etc/iptables.rules
    
  6. en /etc/rc.localannexe la ligne:

    iptables-restore < /etc/iptables.rules
    

terminé

-

testé sur Ubuntu 11.10 (oneiric), locale: he

user56231
la source
1
Grande réponse avec une solution parfaite! Mais notez que toutes les heures sont interprétées comme UTC , il peut donc être nécessaire de les compenser manuellement pour l'heure locale - dans mon cas central european summer time -2 hours.
Precise Penguin
J'ai fait toutes les étapes et elles ont fonctionné (l'accès Internet était limité) mais après le redémarrage, Internet était de nouveau activé. J'ai vérifié iptables -L OUTPUT et je n'ai pas trouvé les règles que j'ai ajoutées ...
Lawand
1
Quelle est la raison pour laquelle vous activez ufwmême si vous l'utilisez plus tard iptables?
balu
@PrecisePenguin qui peut être corrigé avec l' --kerneltzoption ("Utiliser le fuseau horaire du noyau au lieu de UTC")
waldyrious