Jak ograniczyć dostęp użytkownika do Internetu w określonych odstępach czasu?

12

Chcę, aby jeden z użytkowników (spoza listy sudoers) miał dostęp do Internetu od 14:00 do 16:00 i od 17:00 do 18:30. Czy to możliwe? Czy mogę ustawić różne przedziały czasowe dla różnych dni tygodnia?

cupakob
źródło
Najlepiej byłoby to zrobić na poziomie kontroli routera lub bramy, a nie na samym systemie ... o ile wiem, w Ubuntu nie ma łatwego systemu ograniczającego dostęp do Internetu na poziomie użytkownika.
Thomas Ward
Kiedy zrobię to na poziomie routera, wszyscy użytkownicy będą ograniczeni ...
cupakob,
Afaik (i szukałem rozwiązania tego od 9.04), nie ma na to żadnych rozwiązań programowych. Oczywiście w moich sieciach jest tylko jeden użytkownik na komputer i wszystkie łączą się za pośrednictwem serwera, który działa jak brama. Że skrzynka ma crontab, który blokuje wszystkie Dostęp do Internetu w tym systemie, a następnie usuwa je w późniejszym czasie; następnie działa również o różnych porach każdego dnia. Z ciekawości, dlaczego musisz ograniczyć dostęp do tego ściśle określonego okresu czasu i dlaczego musisz to zrobić przez użytkownika?
Thomas Ward
Potrzebuję go przez użytkownika, ponieważ jeden komputer jest używany przez dwóch użytkowników. i chcę ograniczyć dostęp, ponieważ drugi użytkownik musi dowiedzieć się znacznie więcej i nie pozostać na Facebooku :) ale twój pomysł z crontabem jest dobry .... czego używasz, aby zablokować dostęp? Mogę zrobić to samo dla użytkownika, gdy zablokuję router :)
cupakob
Mój router i moja bramka są oddzielne - ponieważ brama przypisuje statyczny adres (a tym samym obsługuje dane) z innych skrzynek, używam iptables do blokowania statycznego adresu IP przypisanego statycznie przed wysyłaniem danych wychodzących lub przychodzących, co w ten sposób blokuje CAŁY ruch internetowy do skrzynki. Każdy plik crontabs używa własnego polecenia iptables w celu usunięcia elementów zgodnie z harmonogramem. Jest to niedoskonały system, ponieważ mogłem po prostu kupić router, który działa lepiej: P
Thomas Ward

Odpowiedzi:

7

Możesz użyć ownerrozszerzenia iptables, aby zablokować użytkownikowi dostęp do sieci, np

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

Teraz możesz użyć crona do dodania lub usunięcia tych reguł (które mogą wymagać trochę skryptu powłoki, jeśli masz już jakieś reguły iptable lub chcesz, aby były one różne dla różnych użytkowników w różnych momentach).

Florian Diesch
źródło
Ooh, nie wiedziałem, że istnieje: P @Florian: (a) jakie moduły jądra należy w tym celu załadować? (b) czy to działa -j REJECT --reject-with <argument>?
Thomas Ward
(a) xt_owner zostanie załadowany automatycznie. (b) Nie widzę powodu, dla którego - odrzuć-nie powinno z tym działać, ale nigdy tego nie próbowałem.
Florian Diesch
Przetestuję to później: P Czy moduł właściciela istnieje na stronach iptables, aby szczegółowo opisać jego użycie? (Uwaga dodatkowa: zapytałem, jaki moduł jądra, ponieważ moje jądro jest skompilowane na zamówienie: /)
Thomas Ward
wygląda dokładnie to, czego szukam .... muszę spróbować :)
cupakob
@EvilPhoenix: Tak, jest to udokumentowane na stronie iptables
Florian Diesch,
8
  1. zaloguj się jako root:

    sudo su

  2. sprawdź status swojej zapory ogniowej:

    ufw status
    

    jeśli zapora jest nieaktywna , wydaj:

    ufw enable
    
  3. w celu ograniczenia użytkownikowi dostępu do Internetu Wilhelma w niedziele, wtorki, środy i piątki do dozwolonych przedziałów czasowych (14: 00–16: 00 i 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 
    

    uwaga dodatkowa : * zwróć uwagę na użycie -Iprzełącznika zamiast -Aprzełączania iptablespolecenia. -Iprzełącznik wstawia wspomnianych reguł (3) na początku (u góry) łańcucha reguła OUTPUT zamiast na dole łańcucha. umieszczanie ręcznie dodawanych reguł nad zwykłymi zasadami zapory jest ważne, ponieważ reguły są przetwarzane od góry do dołu. jeśli najwyższe reguły AKCEPTUJĄ pakiet, łańcuch WYJŚCIE nie jest już sprawdzany pod kątem następujących reguł, które mogły ZROBIĆ pakiet.

  4. upewnij się, że reguły zostały poprawnie wprowadzone:

    iptables -L OUTPUT
    

    w celu usunięcia niepoprawnych regułę, powiedzmy (licznik 1-opartą z góry zasada nr 1 iptables -v -L OUTPUT) Problem: iptables -D OUTPUT 1.

  5. zapisz iptables do przywrócenia przy następnym uruchomieniu:

    iptables-save > /etc/iptables.rules
    
  6. w /etc/rc.localdopisywania linii:

    iptables-restore < /etc/iptables.rules
    

Gotowe

-

testowany na Ubuntu 11.10 (oniryczny), lokalizacja: he

użytkownik56231
źródło
1
Świetna odpowiedź z idealnym rozwiązaniem! Pamiętaj jednak, że wszystkie czasy są interpretowane jako UTC , więc może być konieczne ręczne ich przesunięcie w stosunku do czasu lokalnego - w moim przypadku central european summer time -2 hours.
Precise Penguin
Zrobiłem wszystkie kroki i zadziałały (dostęp do Internetu był ograniczony), ale po ponownym uruchomieniu Internet był ponownie włączony. Sprawdziłem iptables -L WYJŚCIE i nie znalazłem reguł, które dodałem ...
Lawand
1
Jaki jest powód, dla którego włączasz, ufwnawet jeśli później z niego korzystasz iptables?
balu
@ PrecisePenguin, który można naprawić za pomocą --kerneltzopcji („Użyj strefy czasowej jądra zamiast UTC”)
waldyrious